Featured image of post [.NET] .NET 7 Preview 2 소개 - RegEx 생성기, NativeAOT, CLI 개선

[.NET] .NET 7 Preview 2 소개 - RegEx 생성기, NativeAOT, CLI 개선

.NET 7 Preview 2의 RegEx 소스 생성기, NativeAOT 메인라인 전환, dotnet new CLI 개선을 중심으로 새로 도입된 기능과 성능 이점을 정리하고, C# 개발자가 적용할 때 참고할 수 있는 사용법과 참고 문헌을 제시합니다. 컴파일 타임 정규식과 네이티브 AOT 배포 검토 시 참고용.

개요

.NET 7 Preview 2는 2022년 3월 공개된 두 번째 프리뷰로, RegEx 소스 생성기, NativeAOT의 메인라인 전환, dotnet new CLI 개선을 중심으로 개발 경험과 성능을 한 단계 끌어올렸다. 이 포스트에서는 위 세 가지를 중심으로 변경 사항을 정리하고, 실제 코드 예시와 함께 적용 시 참고할 수 있는 내용을 담았다.

이 포스트가 도움이 되는 경우

  • .NET 6에서 .NET 7(또는 상위 버전)으로 마이그레이션을 검토 중인 팀
  • 정규식 사용이 많은 서비스의 시작 비용·성능을 줄이고 싶은 개발자
  • 네이티브 AOT 배포를 고려 중인 C# 개발자
  • dotnet new 및 CLI 워크플로우 개선에 관심 있는 개발자

.NET 7 Preview 2 주요 변경 사항 개요

Preview 2에서 강조된 세 가지 축은 아래와 같다. 각각 컴파일 타임 최적화, 런타임 배포 모델, 개발자 도구 경험에 초점을 둔다.

flowchart LR
  subgraph preview2Highlights["Preview 2 핵심"]
    A[RegEx Source Generator]
    B[NativeAOT Mainline]
    C["dotnet new CLI 개선"]
  end
  Input[소스 코드] --> A
  Input --> B
  Input --> C
  A --> Out1["컴파일 타임
정규식 엔진"] B --> Out2["네이티브
AOT 배포"] C --> Out3["탭 완성
템플릿 탐색"]

RegEx 소스 생성기 (Regex Source Generator)

왜 필요한가

기존에는 new Regex(...)를 사용하면 런타임에 패턴을 파싱하고 엔진을 구성하는 비용이 발생한다. 패턴이 컴파일 타임에 고정되어 있다면, 이 작업을 컴파일 타임으로 옮겨 시작 비용을 없애고 트리밍·디버깅에도 유리하게 만들 수 있다. RegEx 소스 생성기는 바로 그 목적으로 Preview 1에 포함되었고, Preview 2 공식 소개에서 다시 강조되었다.

사용 방법

  1. 해당 타입을 partial class로 만든다.
  2. [RegexGenerator("패턴", 옵션)]을 붙인 static partial 메서드를 선언하고, 반환 타입을 Regex로 둔다.
  3. 소스 생성기가 이 메서드의 구현을 채우며, 패턴이나 옵션을 바꾸면 자동으로 다시 생성된다.

Before: 런타임 Regex

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public class Foo
{
  public Regex regex = new Regex(@"abc|def", RegexOptions.IgnoreCase);

  public bool Bar(string input)
  {
    bool isMatch = regex.IsMatch(input);
    // ..
  }
}

After: 소스 생성기 사용

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public partial class Foo  // partial class로 변경
{
  [RegexGenerator(@"abc|def", RegexOptions.IgnoreCase)]
  public static partial Regex MyRegex();  // partial 메서드 → 소스 생성기가 구현 채움

  public bool Bar(string input)
  {
    bool isMatch = MyRegex().IsMatch(input);  // 생성된 엔진 사용
    // ..
  }
}

패턴이 컴파일 타임에 알려져 있다면 위 방식으로 전환하는 것을 권장한다. 자세한 제안과 이슈는 GitHub - Regex Source Generator (runtime#44676)에서 확인할 수 있다.


NativeAOT 업데이트

NativeAOT(Ahead-of-Time 컴파일)는 실험 단계였던 dotnet/runtimelab의 feature/NativeAOT 브랜치에서 .NET 7 메인라인 개발로 자리 잡았다. 이전 발표에 따르면, runtimelab에서 dotnet/runtime 저장소로의 코드 이전 작업이 완료된 상태이며, SDK에서 NativeAOT로 프로젝트를 퍼블리시하는 일급 지원은 이후 프리뷰에서 추가될 예정이다.

NativeAOT를 사용하려면 트리밍(trimming) 이 필수이므로, 미리 셀프 컨테인드 배포 + 트리밍을 적용해 보며 trim 경고를 제거해 두는 것이 좋다. 라이브러리 작성자라면 라이브러리 트리밍 준비 가이드를 참고하면 된다.


dotnet new CLI 개선

Preview 2부터 dotnet new새 CLI 파서탭 완성 지원으로 사용성이 크게 개선되었다.

  • 서브커맨드: --install, --uninstall 등이 install, uninstall 형태로 통일되었고, 기존 -- 접두사 옵션은 하위 호환을 위해 당분간 유지된다.
  • 탭 완성: dotnet new <공백> 후 템플릿 이름, dotnet new web -- 후 옵션, --auth 같은 선택 인자의 허용 값 등에서 탭 완성으로 후보를 볼 수 있다.
  • 셸별 설정 방법은 .NET CLI 탭 완성 활성화 문서를 참고하면 된다.

템플릿 작성자라면 dotnet/templating 저장소에서 새 동작과 이슈를 확인할 수 있다.


.NET 7 타겟팅 및 지원 정책

프로젝트에서 .NET 7을 사용하려면 TargetFramework를 예를 들어 다음과 같이 지정한다.

1
<TargetFramework>net7.0</TargetFramework>

플랫폼별 TFM 예: net7.0-windows, net7.0-macos, net7.0-ios, net7.0-android 등. .NET 7은 Current 릴리스로, 출시일로부터 18개월간 무료 지원·패치가 제공된다. 호환성·변경 사항은 .NET 7 호환성 문서를 참고하는 것이 좋다.


참고 문헌

  1. Announcing .NET 7 Preview 2 – The New, ‘New’ Experience — Microsoft .NET Blog (공식 발표)
  2. .NET 7 Inches Closer to NativeAOT in Preview 2 — Visual Studio Magazine (NativeAOT·RegEx 소개)
  3. .NET Runtime - Native AOT — dotnet/runtimelab (NativeAOT 브랜치)
  4. Introduce the new Regex Source Generator (runtime#44676) — dotnet/runtime (RegEx 소스 생성기 제안)
  5. Moving NativeAOT to mainline (runtime#61231) — dotnet/runtime (NativeAOT 메인라인 이전 이슈)