주말 아침 - 주간 닷넷 #19

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


:pushpin: .NET 11 Preview 2 출시

  • 저자: .NET Team
  • 태그: #dotnet11 #preview #release

주요 내용

  • Runtime Async V2, JIT 최적화, 캐시된 인터페이스 디스패치 등 런타임 성능 개선
  • ASP.NET Core 네이티브 OpenTelemetry 트레이싱, Blazor TempData 지원 추가
  • EF Core에서 LINQ MaxBy/MinBy, SQL Server DiskANN 벡터 인덱스, JSON_CONTAINS() 지원
  • SDK 컨테이너 이미지 17% 축소, Linux/macOS 설치 파일 경량화
  • F# simplified DIM 인터페이스, overload resolution 캐싱, #elif 전처리기 지원

:pushpin: C# 15 유니언: 드디어 .NET에 유니언이 온다

https://medium.com/@benjaminabt/c-15-unions-unions-are-finally-in-net-ben-abt-f4493c1e9ffc

  • 저자: Ben Abt
  • 태그: #csharp15 #unions #language

주요 내용

  • C# 15에서 union 키워드로 discriminated union을 1급 시민으로 도입
  • 암시적 변환, 패턴 매칭 언래핑, switch 완전성 검사(exhaustiveness checking) 지원
  • 기본 구현은 struct + object Value 저장 방식으로 값 타입 박싱 발생
  • UnionAttribute 기반 확장으로 수동 정의 타입도 유니언 동작 참여 가능
  • .NET 8~10용 Unio 라이브러리에서 네이티브 C# 15 유니언으로의 마이그레이션 경로 제시

:pushpin: "정상"만으로는 부족하다: C#에서 실제 준비 상태를 검증하는 헬스체크 구축

https://levelup.gitconnected.com/when-healthy-isnt-enough-building-health-checks-that-validate-real-readiness-in-c-8972c39344ca

  • 저자: Martin Andersen
  • 태그: aspnetcore #healthcheck #kubernetes #deployment

주요 내용

  • 연결성만 확인하는 기본 헬스체크의 맹점: DB 연결은 되지만 마이그레이션 미적용 시 트래픽 수신 후 크래시
  • Liveness(프로세스 생존)와 Readiness(트래픽 수신 가능 여부) 구분
  • EF Core 미적용 마이그레이션을 감지하는 DbContextMigrationsHealthCheck 구현
  • 캐시 워밍, 데이터 임포트, 서명 키 로딩 등으로 확장 가능한 Readiness 검증 패턴

:pushpin: .NET에서 소스 생성 기반 CQRS: Axent 소개

https://medium.com/@magmablinker/source-generated-cqrs-in-net-meet-axent-b86e61dba3e5

  • 저자: magmablinker
  • 태그: #cqrs #sourcegenerator #axent #mediatr

주요 내용

  • 소스 제네레이션 기반 CQRS 디스패치로 리플렉션 런타임 오버헤드 제거
  • MediatR v12.5 대비 약 2배 성능, 메모리 할당 감소
  • 글로벌/요청별 타입드 파이프라인과 ASP.NET Core 통합 지원
  • AddAxent()와 ISender를 통한 Minimal API 환경 사용 예시

:pushpin: .NET 10.0.5 긴급 패치 릴리스 - macOS 디버거 수정

  • 저자: Rahul Bhandari
  • 태그: dotnet10 #bugfix #macos #debugger

주요 내용

  • .NET 10.0.4에서 도입된 회귀 버그로 macOS(Apple Silicon ARM64)에서 VS Code 디버깅 시 크래시 발생
  • .NET SDK 10.0.104, 10.0.200 설치자에게 영향, Windows/Linux는 해당 없음
  • 10.0.4의 보안 수정과는 무관한 기능성 이슈
  • macOS 개발자는 .NET 10.0.5 설치 후 에디터 재시작 필요

:pushpin: .NET에서 async/await가 실제로 동작하는 방식

https://medium.com/@elvin-asadov/how-async-await-actually-works-in-net-3df9b9732c36

  • 저자: Elvin Asadov
  • 태그: async #await #internals #threading

주요 내용

  • Task는 논리적 작업 단위, Thread는 물리적 OS 리소스로 별개 개념
  • I/O-bound 작업 시 워커 스레드 즉시 해제, OS가 비동기 처리 후 IOCP로 완료 신호
  • 컴파일러가 async 메서드를 IAsyncStateMachine 상태 머신으로 변환하는 과정
  • 수천 개 동시 I/O를 스레드 증가 없이 처리하는 확장성 구조

:pushpin: .NET 대량 데이터베이스 업데이트 최적화: 초보적 방법에서 초고속까지

  • 저자: Milan Jovanović
  • 태그: #performance #postgresql #efcore #dapper

주요 내용

  • PostgreSQL 10,000행 업데이트를 7가지 방식으로 벤치마크 비교
  • Naive Dapper Loop(2,414ms) → EF Core SaveChanges(1,030ms) → VALUES(89ms) → UNNEST/COPY(41ms)
  • UNNEST는 파라미터 2개로 쿼리 플랜 안정, Binary COPY는 파라미터 제한 없이 대량 처리
  • DB 라운드트립 수 감소가 핵심이며 EF Core와 Dapper 병용 전략 제시
  • 25,000행에서도 UNNEST/COPY가 92~93ms로 선형 확장성 확인

:bookmark_tabs: 가벼운 읽을거리

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


당신의 .NET 코드는 클린 아키텍처가 아니다. 클린 아키텍처 연극이다

  • 의존성은 항상 안쪽으로 향해야 한다는 핵심 원칙과 4계층(Domain→Application→Infrastructure→Presentation) 역할 정리
  • DbContext를 Domain에 주입, 컨트롤러에 비즈니스 로직 배치 등 흔한 안티패턴 지적

C#은 더 좋아지고 있다 — 최신 기능에 대해 알아야 할 모든 것

  • C# 13의 params 컬렉션 확장, Lock 타입 개선, async 내 ref 로컬 등 주요 변경사항
  • C# 14의 Extension Members, field 키워드, null 조건부 할당 등 새 기능 소개

Undo/Redo 기능 설계

  • Memento 디자인 패턴(Memento, Originator, Caretaker)으로 상태 저장/복원 구현
  • React + .NET Core 비디오 에디터에서 Redis/DB 기반 상태 관리와 SignalR 동기화

10만 건 이메일 악몽: 탄력적인 비동기 알림 시스템 설계

  • 대량 알림 동기 전송의 문제(타임아웃, 메모리 고갈)와 이벤트 드리븐 비동기 처리 전환
  • Redis TTL 기반 멱등성 체크, Dead Letter Queue로 포이즌 메시지 격리

윈도우 클립보드란?

  • 클립보드의 RAM 저장 구조, 세션 격리, 다중 포맷(CF_TEXT, CF_HDROP 등) 태깅 시스템
  • GlobalAlloc/OpenClipboard 등 Win32 API 구현과 안티바이러스 플래그 트리거 원리
6개의 좋아요