주말 아침 - 주간 닷넷 #32


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


:pushpin: .NET 11 Preview 5 출시 — JSON Lines, LINQ Full Outer Join, MCP 서버 템플릿 등

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

주요 내용

  • 라이브러리: System.Text.Json의 JSON Lines 직렬화, LINQ Full Outer Join, X25519 키 합의, Random 제네릭 숫자 메서드
  • 런타임: 비동기 일시 중단 성능 개선, JIT 최적화, GC 트리밍·컴팩션 개선
  • SDK: 파일 기반 앱에서 다른 .cs 참조, 빌드 시 보안 취약점/EOL 검사, MCP 서버 템플릿
  • C#: 폐쇄형(sealed) 계층, 유니온 선언/패턴 매칭, unsafe 코드 진화
  • ASP.NET Core: Blazor SSR 클라이언트 측 유효성 검사, QuickGrid 비대화형 동작, Blazor WebAssembly 게이트웨이; MAUI·EF Core 신뢰성 개선

:pushpin: Microsoft Build 2026의 .NET 로드맵

  • 저자: Daniel Roth
  • 태그: #dotnet11 #build2026 csharp

주요 내용

  • C# 유니온 타입 도입 — 와이어 프로토콜과 도메인 모델링에 활용
  • .NET 11의 AI 시대 최적화 — 런타임/라이브러리/SDK 전반 성능·진단 개선
  • ASP.NET Core와 Blazor가 Aspire와 통합되어 에이전트/도구/스킬 구축 지원
  • .NET MAUI로 로컬 모델·온디바이스 AI 기능 구현
  • dotnetup 도구로 모든 플랫폼의 .NET SDK 설치·업데이트 통합 관리

:pushpin: .NET 및 .NET Framework 2026년 6월 서비싱 — CVE 3건 패치

  • 저자: .NET Team
  • 태그: dotnet #security #cve

주요 내용

  • 2026년 6월 9일자 서비싱 릴리스: CVE-2026-45591, CVE-2026-45491, CVE-2026-45490 세 건 패치
  • 적용 대상: .NET 10.0, 9.0, 8.0
  • 릴리스 버전: 10.0.9 / 9.0.17 / 8.0.28
  • .NET Framework는 이번 달 보안·비보안 업데이트 없음
  • 보안·비보안 수정 사항을 함께 포함

:pushpin: DRY는 프로그래밍에서 가장 오해받는 규칙이다

  • 저자: Milan Jovanović
  • 태그: #dry #architecture #designprinciples

주요 내용

  • DRY의 원래 정의는 "모든 지식은 단일하고 명확한 권위 있는 표현을 가져야 한다"로 코드 형태가 아니라 도메인 지식에 관한 것
  • 잘못된 추상화 비용은 중복 비용을 초과할 수 있음 — 잘못된 추상화는 보이는 중복보다 되돌리기 어려움
  • 모듈 경계를 넘는 공유 타입(통합된 Order 클래스)은 바운디드 컨텍스트 간 독립적 진화를 막음
  • “세 번째 발생” 휴리스틱: 개념 변경 시 모든 인스턴스에 동시에 영향을 미쳐야 할 때만 중복 제거
  • 추상화 이름을 “Helper”/"Utils"로밖에 못 짓는다면, 의미 있는 도메인 지식이 아닌 형태만 추상화하는 신호

:pushpin: 내가 C# DI에 주 생성자(Primary Constructor)를 쓰기로 한 이유

  • 저자: Milan Jovanović
  • 태그: csharp #csharp12 di #primaryconstructors

주요 내용

  • C# 12 주 생성자로 필드 선언/할당 보일러플레이트 제거, 의존성 4개짜리 서비스 클래스 축소
  • 매개변수는 readonly 필드가 아닌 mutable 변수로 캡처되어 실수로 재할당 가능 — 컴파일러 경고 없음
  • DI 서비스 클래스에서 가장 이점이 크고, 도메인 엔티티/값 객체에서는 불변성 주의 필요
  • 복잡한 검증, 다중 오버로드, 5개 이상 의존성을 가진 클래스는 전통 생성자 유지
  • 일반적 DI 시나리오에서 재할당 사고는 드물어 트레이드오프가 감수 가능

:pushpin: C#에서 예외, Result 객체, 검증 오류는 언제 써야 하는가

  • 저자: Chris Pietschmann
  • 태그: csharp #errorhandling #design

주요 내용

  • 예외는 인프라 장애·프로그래밍 오류 등 “정상 흐름이 아닌” 진짜 예외적 상황에 한정
  • 비즈니스적으로 예상 가능한 부정적 결과(이메일 중복, 미결제 송장 등)는 Result 객체로 명시
  • 입력 검증 오류는 컨트롤러/엔드포인트 등 경계 계층에서 처리
  • 인프라 예외를 Result로 감싸면 관측성 손실, 모든 실패를 예외로 던지면 로그·알람 노이즈 증가의 트레이드오프
  • 사용자가 직접 고칠 수 있는가/정상 결과인가/버그 또는 인프라인가의 의사결정 체크리스트

:pushpin: .NET 11 멀티 파일 지원 — 파일 기반 앱이 본격 프로젝트로 가는 길

  • 저자: Anton Martyniuk
  • 태그: dotnet10 #dotnet11 #filebasedapps

주요 내용

  • .NET 10의 단일 파일 실행(dotnet run main.cs)과 .NET 11 Preview 3의 멀티 파일 지원 소개
  • #:package, #:sdk, #:project 디렉티브로 NuGet 의존성과 SDK 인라인 선언
  • #:include 디렉티브로 여러 파일에 코드 분할 가능
  • HTTP 헬스체커와 EF Core/SQLite 기반 최소 웹 API 실전 예시
  • 본격 프로젝트 전환 시점(dotnet project convert)과 기준(다중 프로젝트, MSBuild 커스터마이즈, 패키징, CI/CD)

:pushpin: .slnx 솔루션 파일 포맷 살펴보기 — .NET 10 기본값으로

  • 저자: Dave Brock
  • 태그: dotnet #slnx #tooling

주요 내용

  • 기존 .sln의 GUID 중복, 병합 충돌, 가독성 저하 문제 정리
  • XML 기반 .slnx의 구조 예시와 가독성·병합 충돌 감소 이점
  • dotnet sln migrate 마이그레이션 명령과 요구사항(.NET 9.0.200+, VS 17.13+, Rider)
  • 파일 더블클릭 연결, 와일드카드 글롭, 일부 도구 미지원 등 한계
  • .NET 10에서 기본값으로 채택될 예정

:pushpin: .NET 개발자 12년간 배운 40가지 교훈

  • 저자: Anton Martyniuk
  • 태그: dotnet #career #bestpractices

주요 내용

  • 40개 교훈 — “최고의 코드는 작성하지 않은 코드”, “복잡성이 프로젝트를 죽인다”, “근본 원인을 고쳐라, 증상이 아니라”, “측정 먼저, 최적화는 나중에”
  • 결합도 최소화/응집도 최대화, 서드파티 의존성 최소화, 민감 정보 하드코딩 금지 등 기술 규율
  • 명확함이 영리함보다 우선, 설명 주석보다 서술적 명명, 상속보다 컴포지션 등 코드 품질 원칙
  • 작은 PR 유지, 처음부터 CI/CD 투자, “내 컴퓨터에서는 됩니다” 사고방식 폐기
  • YAGNI와 사려 깊은 설계의 균형, 기술 부채 점진적 상환, 비즈니스 맥락 이해

:pushpin: EF Core 11의 분할 쿼리 최적화 — 참조 네비게이션 제거로 ~10% 향상

  • 저자: Steven Giesel
  • 태그: #efcore11 #splitquery #performance

주요 내용

  • EF Core 10까지는 AsSplitQuery 사용 시 참조 네비게이션이 컬렉션 쿼리에 불필요하게 포함됨
  • EF Core 11(preview 3부터) 참조 네비게이션을 컬렉션 쿼리에서 제거하는 최적화 적용
  • 5개 Include 참조가 있을 때 이전에는 각 컬렉션 쿼리마다 5개 조인이 반복되던 문제 해소
  • .NET 10 대비 .NET 11에서 약 10% 성능 향상 및 메모리 사용량 감소
  • 기존 AsSplitQuery 사용 코드베이스에서 별도 수정 없이 자동 적용

:bookmark_tabs: 가벼운 읽을거리

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


모든 빨간 막대를 쫓지 않고 프로파일 읽기

  • CPU보다 메모리 프로파일링 우선, 네임스페이스/메서드 필터링으로 관련 경로에 집중
  • 큰 숫자가 우선순위는 아님 — 소유권 경계와 영향 범위 고려, 화염 그래프의 "모양"을 먼저 읽고 BenchmarkDotNet으로 개선 검증

EF Core at Scale — 대용량 데이터셋 조회 5가지 방법

  • EF Core .Contains의 2,100 파라미터 제한과 다중 DB 왕복으로 인한 성능 저하 문제 정의
  • WhereBulkContains/WhereBulkNotContains/BulkRead 등 5가지 메서드를 PostgreSQL 100만 레코드 콘솔 앱으로 시연

무심한 한 줄 .Result가 API 전체를 얼렸다

  • 운영 API가 CPU 여유가 있는데도 부하 상황에서 응답 불능 — 원인은 _service.GetAuthorizationsAsync().Result 한 줄로 인한 스레드풀 기아
  • .Result, .Wait(), .GetAwaiter().GetResult() 코드 탐색과 “CPU 여유 + 높은 지연” 증상 인지 가이드

인덱스 하나가 빠져 쿼리가 600배 느려졌다

  • 고객 데모 도중 8초가 걸리던 쿼리를 12ms로 줄인 경험담 — Table Scan에서 Index Seek로 전환
  • CREATE NONCLUSTERED INDEX IX_AuthRequests_Practice_Status ON AuthorizationRequests (PracticeId, Status) 예시와 SQL Server 실행 계획 진단

풀스택 마켓플레이스 3개월 — .NET 10 + React 19 + PostgreSQL 회고

  • 1인 개발에 모듈러 모놀리스, Outbox/Result 패턴, .NET hosted service 기반 경매 스케줄링, optimistic concurrency로 동시 입찰 처리
  • 실패 사례: Vercel-Render 크로스 오리진 인증 쿠키, Stripe webhook silent failure, Neon 스키마 해석 차이로 마이그레이션 잘못 적용

ASP.NET, 팩토리 패턴, 그리고 통제의 환상

  • 팩토리 패턴이 약속하는 "통제"가 실제로는 결합도를 재배치할 뿐이라는 비판, ASP.NET Core DI 컨테이너가 책임을 분산해 명시적 팩토리 필요성 감소
  • 팩토리가 여전히 유효한 경우: 런타임 데이터 기반 생성, DI로 풀 수 없는 도메인 로직

.NET MAUI, Matter 그리고 Swift 상호운용

  • 스마트홈 표준 Matter를 .NET MAUI iOS 앱에서 쓰려면 네이티브 MatterSupport(Swift 라이브러리) 바인딩이 필요, 전통적 방식은 중간 Swift 프로젝트에 @objc를 표시해야 함
  • Justin Wojciechkowski의 “Swift .NET Bindings” 도구로 MatterSupport 바인딩을 생성, NuGet 패키지로 공개
4개의 좋아요