1. 개발환경
Programming을 하려면 그에 맞는 개발환경이 갖추어져 있어야 할 것입니다. 이를 위해 Microsoft에서는 다음과 같은 Code편집기와 IDE(integrated Development Environments)를 제공하고 있습니다.
- Visual Studio Code
- GitHub Codespaces
- Visual Studio 2019 또는 Visual Studio 2019 for Mac
● Vsual Studio Code
가벼우면서도 최신의 개발환경을 지원하는 Code편집기로는 Visual Studio Code가 있으며 Windows, MacOS나 Red Hat/Ubuntu와 같은 Linux등 다양한 운영체제를 지원하기도 합니다.
Visual Studio Code는 기본기능 이외에 다양한 확장 기능을 제공함으로써 C#뿐만 아니라 다른 언어의 Code편집 기용으로도 많이 사용되고 있습니다. 실제 Visual Studio Code는 Stack Overflow 2019년 설문조사에서 개발자의 50.7%가 Visual Studio Code를 사용하고 있는 것으로 조사되었습니다. 사용자 층은 점차 넓어져서 현재는 이보다 더 많은 수의 개발자가 사용 중인 것으로 추정됩니다.
Stack Overflow의 2019년 설문에 관한 자세한 내용은 아래 링크를 참고해 주세요.
Stack Overflow Developer Survey 2019
물론 Visual Studio Code만으로 모든 개발이 다 가능하지는 않습니다. 일부 특별한 기능을 위해서는 Visual Studio 2019와 같은 통합개발환경이 필요할 수도 있습니다.
● GitHub Codespaces (깃허브 코드스페이스)
Online용 Visual Studio Code에 해당합니다. GitHub에서 Service 하고 있으며 개발에 필요한 완벽한 설정이 가능하고 Theme 같은 개인별 설정도 지원합니다. PC에 설치해 사용하는 Visual Studio Code와 거의 완벽하게 동일한 모습을 하고 있기에 사용방법에도 전혀 이질감이 느껴지지 않을 정도입니다.
GitHub Codespaces overview - GitHub Docs
Git Repos는 기본이며 Vissual Studio Code에서 사용 가능한 확장 기능까지도 모두 사용할 수 있습니다. Cloud 기반의 Service이며 WebBrowser만 있으면 어디서든 접속 가능합니다. 다만 원활한 사용을 위해서는 고속 Internet환경이 갖추어져 있어야 합니다.
● Visual Studio 2019
Visual Studio 2019는 Windows 7 SP1 이상에서 실행될 수 있습니다. 하지만 UWP(Univeral Windows Platform) App을 개발하기 위해서는 최소한 Windows10 이상을 사용해야 합니다. UWP는 윈도 스토어를 통해 배포되고 실행되는 앱이며 Visual Studio Code 같은 편집기만으로는 App을 개발하는데 한계가 있으므로 Windows전용의 Desktop App을 개발하기 위해 Visual Studio 2019와 같은 IDE를 선택합니다.
● Viausl Studio 2019 for Mac
Apple의 iPhone 이나 iPad와 같은 Mobile 기기에서는 iOS 운영체제가 사용됩니다. 이런 환경하에서 동작하는 App을 개발하려면 Xcode를 사용해야 하며 Xcode는 macOS에서만 동작합니다. Windows환경하에서 동작하는 Visual Studio 2019를 통해 Xamarin확장 기능으로 Cross-Platform앱을 개발할 수 있지만 IOS를 위한 앱 개발에서는 완벽하지 않아서 macOS와 Xocde를 사용해야 하는 상황이 종종 발생하곤 합니다. 이런 문제에 대처 가능한 한 가지 방법은 Mac을 위한 Visual Studio 2019를 사용하는 것입니다.
때문에 macOS환경하에서 .NET을 개발하려면 macOS용 Visual Studio Code와 Visual Studio 2019 for Mac을 사용합니다. 만약 Windows용 App을 개발하거나 Windows에 대한 Test환경이 필요하다면 Parallels와 같은 가상화를 이용하는 것도 하나의 방법이 될 수 있습니다.
2. Cross-Platform 배포
개발을 위해 Code편집기나 운영체제를 선택하는 기준에서 완성된 결과물을 배포하는 데는 특별한 제한이 없습니다. .NET 5는 Cross-Platform배포가 가능하며 아래 운영체제를 공식적으로 지원하고 있습니다.
● Windows : Windows 7(Service Pack 1 또는 이후 버전), Windows10(1067이나 이후버전), Windows Server 2012(R2 Service Pack1이나 이후버전), Nano Server(1809또는 이후버전), Windows ARM64
● Mac : macOS High Sierra(10.13 또는 이후 버전)
● Linux : Alpine Linux 3.11이나 또는 이후 버전, Cent0S 7또는 이후버전, Debian 9또는 이후버전, Fedora 30또는 이후버전, Linux Mint 18또는 이후버전, openSUSE 15또는 이후버전, RHEL(Red Hat Enterprise Linux 7또는 이후버전, SUSE Enterprise 12 SP2또는 이후버전, Ubuntu 18.04, 19.10, 20.04또는 이후버전
운영체제별 정확한 지원 목록에 대한 정보는 아래 Link로도 확인할 수 있습니다.
core/5.0-supported-os.md at main · dotnet/core · GitHub
3. Visual Studio Code 단축키 안내
어떤 버전의 Visual Studio Code를 사용하느냐는 크게 중요하지 않지만 C#9 Version의 지원을 위해서는 C# 확장 기능의 최신 버전을 설치할 것을 권장합니다. Windows, Linux, MacOS등에서 사용 가능한 Visual Studio Code는 대체로 동일한 개발환경을 지원하지만 일부 단축키는 다를 수 있습니다.
따라서 아래 Link를 통해 운영체제마다 해당 내용을 확인하는 것이 좋습니다.
Windows : -
MacOS : keyboard-shortcuts-macos.pdf (visualstudio.com)
Linux : keyboard-shortcuts-linux.pdf (visualstudio.com)
참고로 기본 단축키의 경우 사용자의 기호에 따라 변경이 가능한데 해당 방법은 아래 Link에 자세히 안내되어 있습니다.
Visual Studio Code Key Bindings
4. Visual Studio Code 설치
Visual Studio Code는 아래 Link를 통해 내려받고 설치할 수 있습니다.
Visual Studio Code - Code Editing. Redefined
아울러 .NET을 개발하기 위해 .NET 5 SDK도 함께 설치하도록 합니다.
Download .NET (Linux, macOS, and Windows) (microsoft.com)
C#은 .NET언어 중 가장 대표적인 언어이며 Visual Studio Code에서 확장 기능을 통해 C#언어만의 특징을 그대로 활용할 수 있습니다. Visual Studio Code를 설치한뒤 왼쪽 Extention Icon을 클릭하여 C#을 검색하면 설치가능한 확장기능중에서 C#을 찾아볼 수 있습니다.
Visual Studio Code안에서 C# 확장기능을 통해 어떤 기능을 활용할 수 있는지에 관해서는 아래 주소를 참고해 주세요.
C# programming with Visual Studio Code
C# 확장 기능은 필수이며 기타 아래 확장 기능을 추가적으로 설치해 사용할 수 있습니다.
C# XML Documentation Comments | XML 문서 주석을 생성합니다. |
REST Client | Visual Studio Code안에서 HTTP요청을 보내고 응답을 받아볼 수 있습니다. |
ILSpy .NET Decompiler | .NET Framework, .NET Core, .NET Standrard를 지원하는 MSIL Assembly를 Decompile해 볼 수 있습니다. |
5. .NET에 관해
어떤 App이나 Service를 개발하는 데 사용되어온 .NET 5, .NET Framework, .NET Core 그리고 Xamarin 등은 서로 연관되어 있으면서도 겹치는 부분이 존재합니다. 시간의 흐름이나 기술의 발전에 따라 각각의 버전으로 NET Platform이 등장하게 되었고 현재는 .NET 5로, 다음에는 .NET 6로의 발전을 앞두고 있습니다.
● .NET Framework
.NET Framework는 CLR(Common Language Runtime), Code실행관리, BCL(Base Class Library)등을 포함하는 하나의 큰 개발 Framework로서 등장하게 되었습니다. 사실 .NET Framework도 Cross-Platform을 목표로 발표되었지만 실상은 Windows 운영체제 안에서만 최적화된 개발 Platform이었습니다. Linux에서 실행 가능한 Mono Project도 존재하긴 했지만 Microsoft가 직접 관여한 Project도 아니었기에 제대로 된 기술지원을 받을 수 없었습니다.
현재는 .NET Framework 4.5.2 버전까지 발표된 상태이며 보안에 관한 내용을 제외하고는 더 이상의 Update계획이 없음을 Micorsoft에서 공식화했습니다.
● Mono와 Xamarin
제삼자에 의해 개발된 Mono는 Windows를 벗어나 Linux에서 .NET을 실행하고자 하는 사실상 Cross-Platform의 일환으로 개발되었습니다. 하지만 공식적인 Project는 아니며 Console기반 App 일부 정도만 실행이 가능한 것으로 .NET을 제대로 활용하기에는 역부족이었습니다. Mono는 Mono그 자체로서의 역할보다 Xamarin Mobile Platform과 Unity와 같은 Cross 게임 개발 Platform의 기반이 되었다는 것에 의미가 있다고 할 수 있겠습니다.
Microsoft는 2016년 Xamarin을 인수했으며 Visual Studio 2019를 통해 확장 기능으로 배포하기 시작했습니다. 이후에 이름을 Xamarin Studio로 변경해 onsole, Web Service 개발이 가능한 Visual Studio for Mac에 탑재하여 Mobile App 개발까지 가능하게 하였고 Visual Studio 2019 for Mac에 탑재된 Xamarin Studio 편집기 일부를 더 긴밀한 경험과 성능을 제공을 위해 윈도우용 Visual Studio의 일부로 교체하였습니다.
● .NET Core
현재 활발히 진행되고 있는 Cross-Platform 개발 영역, 특히 Mobile과 Cloud개발에 있어서 이전보다는 Windows라는 운영체제에 대한 의존성이 훨씬 떨어지고 있습니다.
Micorsoft 또한 Windows에 의존적이었던 .NET을 완전히 분리하기 위한 노력을 기울여 왔으며 .NET의 몇몇 부분에서 Cross-Platform으로 탈바꿈하기위한 재개발수준을 거치게 되었습니다. 이런 노력의 일환으로 CoreCLR로 알려진 Cross-Platform의 실행을 위한 CLR과 CoreFX라는 간소화된 Classes Library를 포함하는 .NET Core를 발표하게 됩니다.
.NET Core는 App과 함께 App에서 필요한 file들이 같이 배포될 수 있었으며 때문에 같은 Server상에서 하나의 App file에 변경이 발생해도 다른 App에는 영향을 주지 않습니다.
● .NET 5
2020년 Microsoft Build Developer Conference에서 .NET Team은 2020년 11월에 발표될 .NET은 Mobile을 제외한 모든 Version이 통합될 것이라는 .NET의 통합계획을 발표합니다. 2021년 11월에 발표예정될 .NET 6에 이르러서야 비로소 mobile까지도 공식 지원할 예정입니다.
.NET Core에서 .NET으로 이름이 변경되고 .NET Framework 4.x Version과의 혼동을 방지하기 위해 Version번호로 5라는 숫자를 붙여 현재 .NET 5가 되었습니다. Microsoft는 매해 11월마다 .NET의 주요 version을 releases 할 것이라고 합니다.
.NET Version | Releases |
.NET Core RC1 | 2015년 11월 |
.NET Core 1.0 | 2016년 6월 |
.NET Core 1.0.4 와 .NET Core 1.1.1 | 2017년 3월 |
.NET Core 2.0 | 2017년 8월 |
.NET Core for UWP in Windows 10 Fall Creators Update | 2017년 10월 |
.NET Core 2.1 (LTS) | 2018년 5월 |
.NET Core 2.2 | 2018년 12월 |
.NET Core 3.0 | 2019년 9월 |
.NET Core 3.1 (LTS) | 2019년 12월 |
.NET 5.0 | 2020년 11월 |
.NET 6.0 (LTS) | 2021년 11월 |
● .NET의 지원정책
상기 표에서 볼 수 있는 바와 같이 .NET은 Version에 따라 LTS인 것과 아닌 것(Current)으로 구분할 수 있습니다. LTS는 안정화 Version이며 3년간의 지원기간을 갖고 있습니다. 안정화에 중점을 둔 만큼 App에 영향을 줄 수 있는 잦은 업데이트를 지향하므로 안정성을 계속 유지해야 하는 경우에 사용하는 것이 좋습니다.
Current는 feedback에 따라서 변경될 수 있는 기능들이 포함된 Version입니다. 따라서 최신의 개선사항이 지속적으로 적용되어야 하는 경우 사용하기에 적합합니다. Current는 다음 Version의 .NET이 나온 후로부터 3개월까지만 지원받을 수 있습니다.
어떤 Version의 .NET을 사용하든 지속적인 지원을 받아 보안과 안정성을 유지하는 것이 좋으며 그러려면 되도록 .NET의 최신상태를 유지하는 것이 좋습니다.
Microsoft의 지원정책에 관한 자세한 사항은 아래 글을 참고하시면 됩니다.
.NET Support | Get help. Suggest improvements. Report bugs. (microsoft.com)
● .NET Runtime Version과 .NET SDK Version
.NET Runtime Version은 Semantic Version관리를 따르고 있습니다. 그래서 첫 번째 주요 Version은 제품 교체가 필요할 정도의 큰 변경을, 두 번째 Version 숫자의 변경은 새로운 기능의 추가, 마지막 세 번째 Version은 Bugfix를 의미합니다.
반면 .NET SDK Version은 Semantic Version관리를 따르고 있지 않습니다. 주요 Version과 부 Version은 .NET Runtime Version과 연결되어 있고 마지막 Patch번호는 Bugfix나 새로운 기능에 대한 수정을 나타냅니다.
● 구 Version .NET의 삭제
.NET Runtime Update는 .NET의 주요 버전인 5.x와 호환되며 .NET SDK의 Update 또한 이전 Version을 사용하는 Application의 구축이 가능하도록 관리되므로 남아 있는 이전 Version을 안전하게 삭제할 수 있습니다.
우선 아래 명령을 통해 SDK와 Runtime의 현재 System에 설치된 Version을 확인할 수 있습니다.
dotnet --list-sdks dotnet --list-runtimes |
만약 Windows 운영체제를 사용 중이라면 App & features에서 삭제가 가능하며
MacOS를 사용중이라면 dotnet-core-uninstall 도구를 사용해 삭제가 가능합니다. (물론 Windows에서도 dotnet-core-uninstall을 사용할 수 있습니다.)
예를 들어 마지막 최신 Version만 남겨두고 이전 Version을 모두 삭제하는 경우 아래와 같이 사용할 수 있습니다.
dotnet-core-uninstall -all-previews-but-latest --sdk |
dotnet-core-uninstall 도구에 관한 더 많은 정보는 아래 link를 참고하시면 됩니다.
Uninstall Tool - .NET | Microsoft Docs
● .NET Core와 .NET 5
지금의 .NET은 이전의 .NET Framework Version보다 훨씬 가벼워졌습니다. Windows Forms나 WPF(Windows Presentation Foundation)과 같은 비 Cross-Platform 기술이나 Legacy지원 문제로 존재했던 부분까지 모두 제거했기 때문입니다. 이들 기술은 Windows와 밀접하게 연결되어 있어 MacOS나 Linux하에서 작동할 수 없었습니다.
하지만 .NET5를 사용해 Windows Form과 같은 Descktop App 개발이 여전히 가능하기도 합니다. 이는 Windows Descktop Pack을 이용한 것으로 Windows전용 Version의 .NET5를 포함하고 있습니다. 물론 MacOS나 Linux에서 사용되는 .NET5와는 SDK부터가 용량과 호환성면에서 달라지지만 Windows Form App 개발에 있어서 .NET5의 사용은 .NET5의 새로운 기능과 성능에 대한 이점을 그대로 가져갈 수 있다는 장점이 있습니다.
ASP.NET Web Form과 WCF(Windows Communication Foundation)는 오래전부터 사용되어온 기술로 현재는 새로운 web개발 project에서 거의 선택되지 않는 기술입니다. 따라서 이들은 .NET5에서 모두 제거되었으며 대신 ASP.NET MVC와 ASP.NET Web API 기술이 대체적으로 사용되고 있습니다. 그리고 이 2개의 web개발 영역은 .NET5에서 ASP.NET Core라는 이름으로 통합되었습니다.
위와 같은 상황임에도 불구하고 몇몇 .NET Framework 개발자들에 의해 WCF와 WF(Windows Workflow)등을 .NET5에 통합시키려는 Open Source Project를 기획하기도 합니다. Supporting the community with WF and WCF OSS projects - .NET Blog (microsoft.com) 실제 Blazor Web Forms components라는 이름의 Web Form Open Source Project가 있는데 자세한 정보는 아래 링크를 통해 확인하실 수 있습니다. GitHub - FritzAndFriends/BlazorWebFormsComponents: A collection of Blazor components that emulate the ASP.NET Web Forms controls of the same name |
Entity Framework(EF) 5/6는 객체-관계 Mapping(Object-Relational Mapping) 기술로 Oracle이나 Microsoft SQL Server와 같은 관계형 Database의 Data를 다루기 위한 기술입니다. EF는 Cross-Platform API에서 좀 더 경량화되었을 뿐만 아니라 Microsoft Azure Cosmos DB와 같은 비 관계형 DB까지 지원하게 되면서 Entity Framework Core라는 이름으로 새롭게 등장하게 되었습니다.
Core라는 명칭은 .NET5에서는 사용되지 않지만 Entity Framework Core나 ASP.NET Core처럼 각각의 Legacy Version과의 구별성을 위해 계속 사용될 예정입니다.
Microsoft는 .NET Framework에서 몇몇 가지를 제거하면서 .NET Core를 만들어냈고 이 과정에서 .NET을 NuGet package로 나누게 되었습니다. 이는 기능적으로 작은 덩어리를 이루면서 상호의존적으로 배포될 수 있는데 Microsoft의 주요 목표는 .NET Framework보다 무조건 더 작게 .NET을 만드는 것이 아니라 세부적으로 기능을 나눠 부품 화하는 것입니다.
이로 인해 Application이 배포될 때 상호 간 의존성을 줄일 수 있도록 Application에서 필요로 하는 Package들만 같이 배포할 수 있고 각 Package들마다 지원하는 최신의 기술을 활용할 수 있게 되었습니다.
● .NET Standard
2019년에 .NET은 Platform에 따라 3가지 영역으로 나뉘어진 상태였는데
- .NET Core : Cross-Platform 기반
- .NET Framework : Legacy
- Xmarin : Mobile
이로 인해 각각의 상황에 맞게 별개의 Platform을 사용해 따로 개발을 진행해야 했습니다. Microsoft는 이런 문제를 해결하기 위해 .NET Standard를 추가하였는데 PCL(Portable Class Library)를 통해 개발했던 코드를 대부분 그대로 사용하고 2.0에 와서 더 많은 API를 지원하게 함으로서 .NET Framework과의 호환성을 높인 것이 특징입니다.
한마디로 따로따로 개발해야 했던것을 .NET Standard로 통합하여 개발할 수 있도록 했던 것이지만 현재 .NET5로의 이전이 활발하게 이루어지고 있고 2021년 말 .NET6를 통해서 .NET Core를 기반으로 한 Server. Desktop, Website와 Xamarin을 기반으로 한 Mobile App 개발의 최적화를 이루게 될 것으로 예상되면서 .NET Standard의 중요성은 점차 떨어질 것으로 예상됩니다.
● IL (Intermediate Language)
Roslyn이라 불리는 C# compiler는 C# source code를 IL이라고 하는 중간 언어로 번역하여 DLL이나 EXE로 생성합니다. 그리고 CoreCLR은 이렇게 만들어진 Assembly로부터 IL Code를 Load 하여 JIT(Just-In-Time) compiler를 사용해 실제 CPU가 이해할 수 있는 Code로 바꿔 실행하게 됩니다.
이러한 방식은 MacOS나 Linux에도 동일하게 적용되어 따로 Source Code를 수정하지 않아도 다양한 OS 기반에서 App이 실행될 수 있도록 하는 진정한 Cross-Platform을 가능하게 합니다.
6. Console App 만들어 보기
먼저 App을 생성할만한 적당한 Folder를 만들고 Command에서 다음 명령으로 Project를 생성합니다. 혹은 Visual Studio Code에서 Ctrl + ` key를 누른 후 해당 명령을 입력해도 동일한 결과를 얻을 수 있습니다.
dotnet new console |
그러면 해당 Folder(예제에서는 app)에 csproj와 cs파일 2개의 File이 생성된걸 학 인할 수 있는데 이 중 Visual Studio Code를 통해 .cs file을 열어보도록 하겠습니다.
.cs File을 열면 OmniSharp, .NET Core debugger등 C#에 필요한 몇가지 Extension의 설치가 시도될 수 있으니 'Yes'를 눌러 설치를 진행하시면 됩니다. |
File을 열면 아래와 같이 Program에 필요한 기본 골격이 만들어진 것을 확인하실 수 있습니다.
using System;
namespace app
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
현재 상태 그대로 두고 다시 Command로 돌아가 아래 명령으로 Project를 Build 하고 실행하도록 합니다.
dotnet run |
다시 언급하지는 않겠지만 명령을 입력하고 실행결과를 얻는 건 별도의 Command창이 아닌 Visual Studio Code에서 Ctrl + ` Key를 눌러 Terminal을 열면 동일하게 사용할 수 있습니다.
● Top-level Program
예제는 'Hello World!'라는 문구를 출력하기 위한 Program인데 Code들이 다소 장황해 보일 수 있습니다. C#9은 Top-level program을 지원하므로 실행 부분만 간추려 Source Code를 작성할 수 있게 되었습니다.
using System;
Console.WriteLine("Hello World!");
이전보다 Code의 양의 훨씬 줄어든 걸 확인하실 수 있습니다. 비록 Source Code를 위와 같이 작성하더라도 Compil 단계에서 처음 작성되었던 Namespace나 Class구문을 자동으로 생성해 Program의 본문을 깜 싸 실행하므로 아무런 문제 없이 Program이 실행될 것입니다.
'.NET' 카테고리의 다른 글
[.NET] 닷넷 - 2. .NET components (0) | 2022.06.24 |
---|---|
[.NET] 닷넷 - 1. .NET 6 개요 (0) | 2022.06.24 |
[ASP.NET Core] IIS 배포 (게시) (0) | 2021.12.15 |
[Visual Studio IDE] Visual Studio IDE의 Registry 설정 (0) | 2021.11.27 |
[.NET] 가비지 컬렉션(Garbage Collection) (0) | 2021.10.25 |