주말 아침 - 주간 닷넷 #23

한 주 동안 .NET 생태계에서 있었던 주요 이슈와 아티클, 기술 트렌드를 정리해 소개합니다.


:pushpin: C# 15의 유니온 타입 살펴보기

  • 저자: Bill Wagner
  • 태그: #csharp15 #uniontypes #dotnet11 #language

주요 내용

  • C# 15(.NET 11 대상)에서 union 키워드 도입 — 변수가 선언된 고정 타입 집합 중 하나를 보유
  • public union Pet(Cat, Dog, Bird) 구문으로 암시적 변환과 소진적 switch 식 지원
  • 컴파일러가 빌드 타임에 비소진적 switch를 거부하여 런타임 오류 사전 차단
  • [Union] 속성으로 라이브러리 작성자가 비박싱 저장 전략의 커스텀 유니온 타입 정의 가능
  • .NET 11 Preview 2에서 사용 가능, 닫힌 계층 구조/닫힌 열거형 등 관련 제안과 연결

:pushpin: Avalonia 12 - 다음을 위한 준비

  • 저자: Steven Kirk
  • 태그: avalonia #release #performance linux #accessibility

주요 내용

  • 복잡한 비주얼 씬(35만 요소)에서 최대 1,867% FPS 향상, 컴파일된 바인딩 기본 활성화
  • Android NativeAOT 시작 시간 1,960ms→460ms(4배), 스크롤 42→120 FPS, 유휴 CPU 0.20%→<0.01%
  • .NET UI 프레임워크 최초의 네이티브 Linux 접근성 백엔드(AT-SPI2) 탑재
  • 페이지 기반 내비게이션 시스템(ContentPage, DrawerPage, CarouselPage, TabbedPage) 및 WebView 오픈소스화
  • netstandard2.0, Direct2D1, Tizen, Blazor 백엔드 제거; .NET 10 + SkiaSharp 3.0 대상

:pushpin: .NET 11 Preview 1 & 2 새로운 기능

  • 저자: Arulraj Aboorvasamy
  • 태그: #dotnet11 #preview #runtime blazor #efcore

주요 내용

  • 네이티브 Zstandard 압축 API — GZip 대비 2~7배 빠른 압축, 14배 빠른 해제
  • Runtime Async V2: async/await 상태 머신이 컴파일러에서 런타임으로 이동 — 낮은 오버헤드, 네이티브 AOT 호환
  • 정적 SSR용 Blazor TempData, ASP.NET Core 네이티브 OpenTelemetry 추적
  • EF Core 11: SQL Server 벡터 검색(DiskANN), 복합 타입 JSON 컬럼, LINQ MaxBy/MinBy SQL 변환
  • 컨테이너 이미지 최대 17% 축소, dotnet run 대화형 프레임워크 선택기

:pushpin: 안정적인 메시지 소비를 위한 Inbox 패턴 구현

  • 저자: Milan Jovanović
  • 태그: #messaging #inbox #pattern #postgresql #masstransit

주요 내용

  • 메시지 수신과 처리를 분리해 중복 처리를 방지하는 Inbox 패턴 구현
  • ON CONFLICT DO NOTHING으로 DB에 먼저 저장하여 멱등성 보장
  • 배경 프로세서가 FOR UPDATE SKIP LOCKED로 미처리 메시지를 배치 조회
  • 수평 확장과 브로커 독립적 재시도 제어 가능
  • Idempotent Consumer 패턴과의 타이밍 및 책임 할당 차이

:pushpin: RedLock.NET 분산 락킹

https://medium.com/@eh0neer.jobs/redlock-net-distributed-locking-0b7c43c625f3

  • 저자: Ehneer Jobs
  • 태그: #redis #distributedlock #redlock #concurrency

주요 내용

  • Docker/Kubernetes 환경에서 SemaphoreSlim, Mutex 등 표준 .NET 락의 한계
  • PostgreSQL pg_try_advisory_xact_lock 기반 트랜잭션 범위 advisory lock
  • Redis RedLock 패턴: Lua 스크립트로 GUID 기반 원자적 락 소유권 체크
  • 대기 시간 및 재시도 횟수(3~5회) 튜닝의 트레이드오프
  • 락 테이블, PostgreSQL advisory lock, Redis RedLock 각 접근법의 장단점 비교

:pushpin: .NET이 내부적으로 예외를 처리하는 방식 (그리고 왜 비용이 큰지)

  • 저자: Ali Hamza Ansari
  • 태그: #exceptions #clr #performance #benchmarkdotnet

주요 내용

  • CLR의 예외 디스패치: 스택 언와인딩, catch 블록 검색, 힙 할당, JIT 생성 EH 테이블
  • BenchmarkDotNet 10만 회 반복에서 bool 반환 vs throw/catch vs OneOf 비교
  • OneOf와 struct 값 타입으로 Gen 0 GC 압력 제거 및 스택 트레이스 캡처 회피
  • 비즈니스 규칙 거부, API 검증, 고처리량 경로에서 예외 대안 사용 시점 분류
  • 예외 처리 시 JIT 인라이닝 제한이라는 숨겨진 추가 비용

:pushpin: .NET의 Captive Dependency 완전 가이드

https://medium.com/@alazamitarek/captive-dependency-in-net-the-complete-guide-to-understanding-detecting-and-fixing-it-3aff293b9a85

  • 저자: Al azami tarek
  • 태그: di #captivedependency #lifetime #debugging

주요 내용

  • Captive dependency: 수명이 짧은 서비스가 긴 수명 서비스에 주입될 때 발생
  • Root Container의 영구 캐시 vs Scope Container의 임시 캐시 동작 차이
  • IServiceProvider를 싱글톤에 저장하면 scoped 서비스가 루트에 영구 캐시되는 메커니즘
  • IServiceScopeFactory로 작업마다 새 scope를 생성하는 해결법
  • 잘못된 시도에서 올바른 해결까지의 단계적 진행과 검증 테스트 코드

:pushpin: 소스 코드 생성 문자열 열거형과 소진 검사 지원

  • 저자: Steven Giesel
  • 태그: #sourcegenerator #enum #aot #pattern

주요 내용

  • 리플렉션 기반 FrozenSet 초기화(AOT 비호환)와 런타임 전용 소진 검사 문제 해결
  • [Enumeration] 소스 생성기로 sealed partial record 자동 생성 — static readonly 필드, All 속성, 연산자 오버로드
  • Match<T>()Match() 메서드로 컴파일 타임 소진 패턴 강제
  • private 생성자와 문자열 비교 연산자로 잘못된 인스턴스 생성 방지
  • PersistenceProvider 도메인 enum 실제 사용 예시와 NuGet 패키지 제공

:pushpin: C# 소스 생성기 테스트: 실용 가이드

  • 저자: Nick Cosentino
  • 태그: #sourcegenerator #testing #roslyn #snapshot

주요 내용

  • Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit + Basic.Reference.Assemblies.Net90 설정
  • 어설션 기반 단위 테스트와 Verify 라이브러리 기반 스냅샷 테스트 두 가지 전략
  • ExpectedDiagnostics로 잘못된 입력에 대한 컴파일러 진단 검증
  • IIncrementalGenerator(Roslyn 4.0+)가 증분 컴파일과 IDE 반응성에서 ISourceGenerator보다 우수
  • CI/CD: CI=true로 대화형 스냅샷 승인 비활성화, 크로스 플랫폼 줄바꿈 정규화

:pushpin: EF Core에서 수백만 행 삭제/업데이트

  • 저자: Chris Woodruff
  • 태그: #efcore #bulkoperations #performance #executeupdate

주요 내용

  • 기존 EF Core 패턴의 O(n) 메모리 증가와 N+1 왕복 문제
  • EF Core 7+ ExecuteUpdate(), ExecuteDelete(): LINQ 조건을 서버 측 SQL로 직접 변환, 엔티티 물리화 없음
  • 변경 추적과 인터셉터를 우회하므로 이미 로드된 엔티티는 명시적 갱신 또는 폐기 필요
  • EF Core 10에 네이티브 ExecuteInsert() 부재, Entity Framework Extensions의 InsertFromQuery()로 대체
  • 1M 행 기준 기존 방식 대비 10배+ 속도 향상, 행 수와 무관한 일정 메모리 오버헤드

:pushpin: AI 보조 코딩 시대에도 코드 품질이 여전히 중요한가?

  • 저자: Mark Heath
  • 태그: #codequality ai #bestpractices

주요 내용

  • AI 에이전트는 grep 기반으로 코드베이스를 탐색 — 나쁜 네이밍이 검색 실패율 증가
  • Shotgun surgery 안티패턴은 AI 에이전트에게 특히 치명적 — 산발적 변경 시 누락 위험
  • 컨텍스트 윈도우 제한으로 SRP가 에이전트의 정확도에 직접 영향
  • AI 에이전트는 가장 빠른 수정을 기본 선택하여 기술 부채 가속화 경향
  • 코드 주석과 의미 있는 네이밍이 자연어 지시와 코드베이스를 연결하는 컨텍스트 역할

:bookmark_tabs: 가벼운 읽을거리

후보 항목 중 이슈로 선정되지 않은 가벼운 읽을거리들


.NET에서의 URL 패턴 매칭

  • WHATWG URL Pattern API 스펙을 .NET에 구현한 Meziantou.Framework.Uri 패키지
  • 이름 있는 매개변수, 와일드카드, 선택적 세그먼트, 대소문자 무시 매칭 지원

.NET 분산 워크플로 오케스트레이션 엔진 구축

  • RabbitMQ 기반 비동기 파이프라인으로 긴밀 결합 서비스 체인 대체
  • 워크플로 수명 주기 상태 관리(Pending→Completed/Failed)와 단계별 독립 큐

C# 지연 실행에 한 번은 데인 적이 있다

  • LINQ의 yield return 기반 반복자 상태 머신과 using 블록 내 지연 반환 버그
  • .ToList() 물리화 연산자로 즉시 실행하는 방법과 지연 실행의 장점(무한 시퀀스, 백프레셔)

.NET CLI 셔뱅과 인수 파싱

  • -v 플래그가 dotnet run의 verbosity 옵션과 충돌하는 문제와 -- 구분자 해결법
  • 세 가지 셔뱅 대안(#!/usr/bin/dotnet --, #!/usr/bin/env -S dotnet -- 등) 비교

.NET Core DI 심층 분석: 기초를 넘어서

  • Keyed Services로 동일 인터페이스의 여러 구현을 문자열 키로 등록·해석
  • 커스텀 팩토리, 델리게이트 팩토리, 마스터/컴포짓 팩토리 패턴

재작성 대 통합의 실제 비용

  • 재작성 비용 $500K~$2M+ vs 통합 $20K~$80K, Strangler Fig 패턴의 60~80% 낮은 실패율
  • 레거시 코드에 내재된 비문서화 비즈니스 로직 재발견 비용

VS 플로팅 윈도우 제어

  • Tools > Options의 숨겨진 설정으로 플로팅 윈도우 소유권 모드 변경(None/Tool Windows/Documents)
  • PowerToys FancyZones와 결합한 멀티모니터 레이아웃 관리

Windows 11 Copilot 버튼 제거

  • Notepad, Snipping Tool, Photos, Widgets에서 Copilot 브랜드 버튼 제거
  • AI 기능 자체는 유지, 브랜딩만 축소 — “writing tools” 메뉴 등으로 대체

Windows 제어판 제거가 오래 걸리는 이유

  • 네트워크/프린터 디바이스 드라이버가 제어판 제거의 근본 차단 요인
  • Microsoft 디자인 PM이 14년간의 마이그레이션 지연 이유를 처음으로 공식 설명
2개의 좋아요