.NET 에코시스템에 대한 이해: .NET이 .NET 7로 진화하기까지 | Andrew Lock

이 글은 Understanding the .NET ecosystem: The evolution of .NET into .NET 7 (andrewlock.net)을 번역한 것입니다.

저는 제 책의 최신 버전인 ASP.NET Core in Action, Third Edition의 최종 검토 과정을 거치면서 열심히 작업하고 있습니다. 이번 개정판에는 새로운 내용이 많이 추가되었기 때문에 책에서 부록 중 하나를 삭제하여 .NET 생태계를 이해하도록 했습니다. 부록을 버리는 대신 여기에 몇 개의 게시물로 만들었습니다!

이 게시물은 책에 포함되지 않았지만, 내용이 마음에 드신다면 ASP.NET Core in Action을 살펴보세요. 현재 manning.com에서 결제할 때 할인 코드 상자에 au35loc 코드를 입력하면 35% 할인을 받을 수도 있습니다. 또한 1판과 2판의 전자책 사본도 무료로 받으실 수 있습니다!

이 게시물에서 다룰 내용:

  • .NET Core의 개발로 이어진 .NET의 역사
  • .NET 생태계에서 .NET 7의 위치

다음 포스팅에서 다룰 내용:

  • .NET Standard로 프로젝트 간 코드 공유
  • .NET 7과 함께 하는 .NET 표준의 미래

.NET이 처음 도입된 이래로 .NET 생태계는 많은 변화를 겪었지만, 특히 .NET Core와 .NET 5+의 개발로 인해 많은 이탈이 발생하고 새로운 개념이 많이 도입되었습니다.

이러한 이탈은 Microsoft가 개발 프로세스에 대한 투명성을 높이고 GitHub에서 공개적으로 빌드하는 것을 고려할 때 놀라운 일이 아닙니다. 하지만 안타깝게도 .NET을 처음 접하는 개발자는 물론 노련한 베테랑 개발자에게도 혼란스러울 수 있습니다! 이 글에서는 .NET을 처음 접하는 개발자가 자주 혼동하는 몇 가지 용어를 정리하고 변경 사항에 대한 컨텍스트를 제공하려고 합니다.

이 글에서는 .NET 에코시스템의 역사, 진화 과정, Microsoft가 해결하려고 했던 문제에 대해 설명합니다. 그 일환으로 .NET 7, .NET Core 및 .NET Framework의 유사점과 차이점에 대해 설명하겠습니다.

.NET Core는 단독으로 개발되지 않았으며, 주요 설계 목표 중 하나는 여러 프레임워크 간에 코드를 공유하는 기능을 개선하는 것이었습니다. 다음 포스팅에서는 휴대용 클래스 라이브러리(PCL)와 .NET 표준을 사용한 후속 접근 방식을 사용하여 .NET 코어 이전 시대에 이러한 목표를 어떻게 달성했는지 설명하겠습니다. 마지막으로 다음 글에서는 .NET 7이 .NET Standard에 어떤 의미가 있는지 살펴보겠습니다.

.NET Core를 촉발한 .NET 플랫폼 살펴보기

.NET 개발자라면 이미 .NET Framework 에 익숙할 가능성이 높습니다. 이 글을 쓰는 시점에 버전 4.8.1인 .NET Framework는 데스크톱 및 웹 개발에 모두 사용할 수 있는 Windows 전용 개발 플랫폼입니다. Windows에 기본적으로 설치되며 역사적으로 대부분의 데스크톱 및 서버 .NET 개발에 사용되었습니다.

모바일 개발자라면 .NET Framework의 크로스 플랫폼 Mono 구현을 사용하는 Xamarin 프레임워크에 익숙할 수도 있습니다. 이 프레임워크는 Windows, Android 및 iOS에서 모바일 애플리케이션을 빌드하는 데 사용할 수 있는 .NET Framework의 대체 플랫폼입니다.

역사적으로 이 두 플랫폼은 완전히 별개의 플랫폼이었지만, 많은 유사한 구성 요소로 구성되어 있고 유사한 API를 구현했습니다. 각 플랫폼에는 해당 플랫폼에 특화된 라이브러리와 앱 모델이 포함되어 있지만, 그림 1에 표시된 것처럼 유사한 기본 라이브러리와 유형을 사용했습니다.

image
| 그림 1. .NET Framework를 구성하는 계층. 각 계층은 아래 계층의 기능을 기반으로 구축되며, 최상위 계층은 애플리케이션을 빌드하는 데 사용할 앱 모델을 제공합니다.

각 스택의 맨 아래에는 컴파일러 및 공용 언어 런타임(CLR)과 같은 .NET 애플리케이션을 컴파일하고 실행할 수 있는 도구가 있습니다. 각 스택의 맨 위에는 플랫폼용 애플리케이션을 빌드하는 데 사용하는 앱별 라이브러리가 있습니다. 예를 들어, .NET Framework에서 Windows Forms 앱을 빌드하지만 Xamarin 플랫폼을 사용하지 않을 수 있으며, iOS 앱의 경우 그 반대의 경우도 마찬가지입니다.

각 스택의 중간에는 기본 클래스 라이브러리(BCL)가 있습니다. 이는 앱에서 매일 사용하는 기본 .NET 유형으로, int 및 문자열 유형, 파일 읽기 API, 작업 API 등이 있습니다. 두 .NET 플랫폼에는 유사한 유형이 많지만 근본적으로 다르기 때문에 특정 유형이 두 플랫폼에 모두 존재하거나 동일한 메서드 및 속성을 노출한다고 보장할 수는 없습니다.

지금까지 두 가지 플랫폼, 즉 .NET Framework와 Xamarin에 대해서만 설명했지만 .NET에는 다양한 구현이 있습니다. Windows에는 Windows 8/8.1 플랫폼과 유니버설 윈도우 플랫폼(UWP)도 있습니다. 휴대폰의 경우 Xamarin 외에도 Windows Phone 8.1 및 Silverlight Phone 플랫폼이 있었습니다. 목록은 계속 늘어납니다(Unity, .NET Compact Framework(CF), .NET Micro…)!

이러한 각 플랫폼은 BCL에서 약간씩 다른 API(클래스 및 메서드) 세트를 사용합니다. 플랫폼 간에는 BCL에 특정 수의 유사한 API가 있지만, 그 교차점은 고르지 않습니다. 게다가 플랫폼의 BCL을 구성하는 라이브러리는 근본적으로 상호 운용이 불가능합니다. 특정 API 세트에 대해 작성된 모든 소스 코드는 각 대상 플랫폼에 맞게 특별히 다시 컴파일해야 합니다.

몇 년 전, Microsoft는 이러한 .NET의 샤딩이 문제라는 것을 깨달았습니다. 개발자는 각 플랫폼마다 조금씩 다른 API 집합을 알아야 했고, 두 개 이상의 플랫폼에서 사용할 수 있도록 코드를 공유하는 것은 번거로운 일이었습니다.

게다가 .NET Framework 의 기본 웹 개발 플랫폼은 그 수명이 다해가고 있었습니다. 소프트웨어 업계는 크로스 플랫폼 환경에 배포할 수 있는 작고 가벼운 클라우드 네이티브 프레임워크로 전환하고 있었습니다. 중앙 집중식으로 설치된 Windows 전용 .NET Framework는 이러한 시나리오를 위해 설계되지 않았습니다. Microsoft는 개발 과정에서 "프로젝트 K"라는 새로운 프레임워크를 개발하기 시작했고, 이것이 결국 .NET Core가 되었습니다.

.NET Core 소개

.NET Core 플랫폼은 중앙 집중식으로 설치되는 Windows 전용 .NET Framework에 대한 Microsoft의 솔루션입니다. .NET Core는 고도로 모듈화되어 있으며, 다른 .NET Core 설치와 나란히 배포할 수 있고(또는 앱과 함께 배포할 수도 있음), 크로스 플랫폼입니다. .NET Core라는 용어는 개발 과정에서 다양한 변경 사항을 설명하는 일반적인 포괄적인 용어로 사용되었다는 점에서 다소 과부하가 걸립니다. .NET Core 플랫폼은 다음과 같이 구성됩니다.

  • 크로스 플랫폼 BCL - 과거에는 CoreFX라고 불렸던 .NET Core 플랫폼의 BCL 라이브러리입니다. 여기에는 .NET Core 응용 프로그램을 빌드하기 위한 모든 기본 유형과 라이브러리가 포함되어 있습니다.
    새로운 크로스 플랫폼 런타임 - .NET Core 애플리케이션을 실행하는 CoreCLR이라고 하는 .NET Core용 런타임입니다.
  • .NET CLI 도구 - 앱을 빌드하고 게시하는 데 사용되는 dotnet 도구입니다.
  • ASP.NET Core 및 EF Core 라이브러리 - ASP.NET Core 애플리케이션을 빌드하는 데 사용되는 앱 레이어 라이브러리입니다.
    이러한 구성 요소는 .NET Core 플랫폼을 구성하며, 그림 1에서 보신 .NET Framework 및 Xamarin 플랫폼을 구성하는 다양한 구성 요소와 유사합니다. 새로운 플랫폼을 만들면서 Microsoft는 .NET Framework를 사용하는 앱에 대한 이전 버전과의 호환성을 유지하는 동시에 .NET Core를 사용하여 새로운 앱을 개발하여 크로스 플랫폼 기반과 독립된 배포 스토리를 활용할 수 있게 되었습니다.

노트 "잠깐만요, .NET 플랫폼이 너무 많아서 또 다른 플랫폼을 만든 건가요?"라고 생각할 수도 있습니다. 그렇다면 맞습니다. 하지만 다행히도 .NET Core와 함께 .NET Standard가 출시되었습니다.

.NET Core는 그 자체로 .NET 개발자가 배워야 할 또 다른 API의 BCL을 의미했을 것입니다. 하지만 Microsoft는 .NET Core 개발의 일환으로 .NET Standard를 도입했습니다. 이름에서 알 수 있듯이 .NET Standard는 모든 .NET 플랫폼에서 사용할 수 있는 표준 API 집합을 보장했습니다. 더 이상 사용 중인 .NET 버전에 사용할 수 있는 특정 API 집합을 배울 필요가 없었으며, .NET 표준 API를 사용할 수 있다면 여러 플랫폼에서 사용할 수 있다는 것을 알 수 있었습니다. 다음 포스팅에서 .NET Standard에 대해 자세히 설명하겠습니다.

.NET 표준은 여러 플랫폼에서 작동하는 코드를 작성하기 위한 좋은 임시방편 솔루션이었지만, 여전히 여러 플랫폼이 존재한다는 근본적인 문제를 해결하지 못했습니다. 모든 플랫폼에는 많은 부분에서 거의 동일함에도 불구하고 Microsoft에서 유지 관리해야 하는 별도의 코드가 있었습니다.

Microsoft는 비동기 열거 가능 및 Span<T>와 같은 새로운 C# 기능을 도입하고 많은 성능 개선 사항을 제공하는 등 .NET Core에서 빠르게 혁신하고 있었습니다. 안타깝게도 다른 플랫폼에서는 상당한 작업 없이는 이러한 기능을 활용할 수 없었습니다. 이 문제를 정면으로 해결하기 위한 Microsoft의 비전은 One.NET이었습니다.

새로운 .NET 릴리스가 나올 때마다 .NET 블로그에서는 .NET에 적용된 방대한 로우레벨 개선 사항을 자세히 설명합니다. 이런 부분에 관심이 많으시다면 매우 흥미로울 것입니다! “.NET 7의 성능 개선 사항” 블로그 게시물은 여기에서 확인할 수 있습니다: Performance Improvements in .NET 7 - .NET Blog.

하나의 .NET 비전

2019년 5월, Microsoft는 3.0 이후 .NET Core의 다음 주요 버전이 .NET 5가 될 것이라고 발표했습니다. 이는 .NET 플랫폼을 통합하려는 시도의 첫 번째 단계였습니다.

앞서 설명했듯이 원래는 Windows 데스크톱 앱을 빌드할 때는 .NET Framework를, iOS 또는 Android 앱을 빌드할 때는 Xamarin을, 크로스 플랫폼 웹 앱을 빌드할 때는 .NET Core를 사용해야 했습니다. 각 앱 모델은 기본 플랫폼에 연결되고 별도의 BCL을 사용했습니다. .NET 5에서 시작된 One .NET 비전은 모든 앱 모델에 사용할 수 있는 단일 BCL이 포함된 단일 .NET 플랫폼을 보유하는 것이었습니다: 그림 2와 같이 Windows 데스크톱 앱, iOS 또는 Android 앱, 크로스 플랫폼 웹 앱 등 모든 앱 모델에 사용할 수 있습니다.

image
| 그림 2. .NET 5는 여러 앱 모델을 실행하기 위한 단일 플랫폼을 제공한다는 비전을 시작했습니다. 각 앱 모델에 별도의 .NET 플랫폼과 별도의 BCL이 필요한 대신, 모든 앱 모델이 동일한 기본 .NET 플랫폼과 BCL을 사용할 수 있게 됩니다.

실질적으로 .NET 5는 사실상 .NET Core의 다음 버전에 불과했습니다. .NET 5에는 추가 기능이 추가되었지만(이후 .NET 6 및 .NET 7도 마찬가지였습니다), 근본적으로 대부분의 ASP.NET Core 응용 프로그램에서 크게 달라진 것은 없습니다.

노트 흔히 혼동하는 부분은 .NET Core가 아닌 .NET 5 또는 .NET 7이라는 이름입니다. "Core"라는 명칭은 "현재 .NET 버전은 하나뿐"이라는 것을 나타내기 위해 삭제되었습니다. 또한 새 버전과 .NET Framework 버전 4와의 혼동을 피하기 위해 버전 4는 건너뛰었습니다. 지금 당장은 혼란스럽더라도 장기적으로는 이 명명 결정이 좋은 결과를 가져올 것으로 기대합니다!

Microsoft는 .NET 5에서 BCL과 인프라를 모두 통합하려고 했지만 지연으로 인해 .NET 6이 되어서야 통합이 완료되었습니다. 또한 Microsoft는 Xamarin Forms의 후속으로 .NET 멀티플랫폼 앱 UI(.NET MAUI)를 도입하여 .NET 7에서 플랫폼을 더욱 통합했습니다.

.NET MAUI에 대한 자세한 내용은 https://learn.microsoft.com/dotnet/maui/ 에서 확인할 수 있습니다.

.NET 7을 통해 하나의 .NET 비전은 본질적으로 완성되었습니다. 향후 모든 개발 작업을 하나의 플랫폼에 기반을 두면 노력의 중복을 줄이고 플랫폼의 안정성과 발전이 모두 향상될 것이라는 희망이 있습니다. 이를 염두에 두고 Microsoft는 정기적인 릴리스 주기를 약속했으며, 따라서 새 버전의 .NET이 출시될 때 앱을 최신 상태로 유지하는 방법을 쉽게 계획할 수 있습니다.

미래: .NET 8 및 그 이후

많은 오픈 소스 프로젝트와 마찬가지로, 공개 개발은 기존 .NET Framework보다 릴리스 주기가 더 빠른 경우가 많습니다. 개발 초기 몇 년 동안 정기적으로 새로운 릴리스(메이저 및 마이너)가 출시되는 등 .NET Core의 경우 확실히 그렇습니다.

많은 개발자가 이러한 빠른 주기와 새로운 기능을 좋아하지만, 이로 인해 불확실성이 발생할 수 있습니다. 다음 주에 새 버전이 출시될 예정이라면 지금 최신 버전으로 업그레이드하는 데 시간을 투자할 가치가 있을까요?

잠재적인 이탈에 대응하고 사용자에게 지속적인 지원에 대한 확신을 주기 위해 이제 각 .NET 릴리스는 두 가지 지원 트랙 중 하나에 속합니다:

  • LTS(장기 지원)-이 릴리스는 첫 번째 릴리스부터 3년간 지원됩니다.
  • STS(표준 기간 지원) - 이전에는 현재 릴리스라고 불렸던 이 릴리스는 출시 후 18개월 동안 지원됩니다.
    지원되는 트랙이 두 가지이므로 더 많은 기능을 원하면 STS 릴리스를 선택하고, 주요 업그레이드 사이에 더 긴 기간을 원하면 LTS를 선택하면 됩니다.

노트 Microsoft는 STS 및 LTS 릴리스 모두에 대한 패치를 정기적으로 릴리스합니다. 여기에는 보안 수정 사항이 포함될 수 있으므로 어떤 지원 트랙을 선택하든 앱의 패키지 및 런타임을 정기적으로 업데이트해야 합니다. .NET 지원 정책에 대한 자세한 내용은 Microsoft의 ".NET 및 .NET Core 지원 정책"을 참고하세요 : .NET and .NET Core official support policy

투트랙 접근 방식은 불확실성을 완화하는 데 어느 정도 도움이 되었지만, 여전히 사용자들은 새 릴리스가 언제 나올지, 따라서 STS 버전이 얼마나 오래 지원될지 정확히 알 수 없었습니다.

Microsoft는 그림 3과 같이 .NET 5를 통해 매년 새로운 주요 버전의 .NET을 출시하고, LTS 릴리스와 STS 릴리스를 번갈아 가며 출시하는 잘 정의된 릴리스 주기를 준수하기로 약속했습니다. 마이너 업데이트는 일반적이지 않지만 필요한 경우 몇 달 간격으로 발생할 수 있습니다.

image
| 그림 3. 새 .NET 버전 출시 일정. 새로운 .NET 버전은 매년 11월에 출시됩니다. 릴리스는 LTS(장기 지원) 버전과 STS(표준 기간 지원) 릴리스 버전이 번갈아 가며 출시됩니다.

이 타임라인을 통해 .NET 버전이 얼마나 오래 지원되는지 알 수 있습니다. STS 트랙 릴리스(예: .NET 7)를 사용하는 경우 2023년 11월에 .NET 8이 릴리스된 후 6개월까지 지원된다는 것을 알 수 있습니다. LTS 릴리스인 경우 .NET 8.0은 2025년 11월까지 지원됩니다.

.NET 7에서 여러 .NET 플랫폼이 통합되었다는 것은 앞으로 여러 플랫폼 간에 코드를 공유할 필요가 줄어든다는 것을 의미하며, 이는 One .NET의 가장 큰 장점 중 하나입니다. 그럼에도 불구하고 기존 레거시 애플리케이션과 코드를 공유해야 하는 경우가 많을 것이므로 코드 공유는 여전히 우려되는 부분입니다.

앞서 설명했듯이 .NET 표준은 .NET 코어 애플리케이션과 기존 레거시 애플리케이션 간에 코드를 공유하기 위한 방법으로 .NET 코어와 함께 도입되었습니다. 다음 글에서는 .NET 표준에 대해 자세히 알아보고, 이전 버전인 포터블 클래스 라이브러리에 대해 간략히 살펴본 후 .NET 표준의 미래에 대해 살펴보겠습니다.

요약

  • .NET에는 .NET Framework, Mono, Unity 등 다양한 구현이 있습니다. 이들 각각은 별도의 기본 클래스 라이브러리(BCL)와 앱 모델을 갖춘 별도의 플랫폼입니다. .NET Core는 또 다른 별도 플랫폼입니다.
  • 각 플랫폼에는 문자열, 파일 조작, 스트림과 같은 기본 .NET 유형 및 클래스를 제공하는 BCL이 있습니다. 각 플랫폼에는 약간씩 다른 BCL이 있습니다.
  • .NET 5는 이러한 플랫폼을 통합하는 첫 번째 단계였으며, 특히 Mono(및 Xamarin)와 .NET Core는 하나의 .NET 비전 아래 통합되었습니다. .NET 7에서는 현재 다른 플랫폼과 연결된 모든 주요 앱 모델을 사용할 수 있습니다.
  • .NET 5에서는 Mono 및 .NET Core BCL의 코드 기반이 통합되었습니다. .NET 6에서는 런타임과 도구도 통합되어 하나의 .NET 비전이 완성되었습니다. 이제 단일 .NET 플랫폼인 .NET 7로 웹, 데스크톱, 모바일 앱 등을 빌드할 수 있습니다.
  • .NET은 매년 새로운 주요 릴리스가 출시됩니다. 3년 동안 지원되는 LTS(장기 지원) 릴리스와 18개월 동안 지원되는 STS(표준 기간 지원) 릴리스가 번갈아 가며 출시됩니다.

이 콘텐츠는 원래 제 책인 ASP.NET Core in Action, Third Edition의 최신 버전에서 가져온 것임을 알려드립니다. manning.com에서 결제할 때 할인 코드 상자에 au35loc 코드를 입력하면 35% 할인을 받을 수 있습니다. 또한 1판과 2판의 전자책 사본도 무료로 받으실 수 있습니다!


7개의 좋아요

.NET 에코시스템에 대한 이해: .NET 표준의 도입

1개의 좋아요