한 주 동안 .NET 생태계에서 있었던 주요 이슈와 아티클, 기술 트렌드를 정리해 소개합니다.
C#이 본래의 우아함을 일부 잃어버린 방법
- 저자: akiradoko666
- 태그: csharp #languagedesign #opinion
주요 내용
- C# 버전별 키워드 증가 추이 분석 — 17개 버전 중 10개가 최근 8년에 출시
- top-level statements, ref 시스템 복잡성(ref readonly, ref struct, scoped ref 등), record 조합 폭발
- primary constructor 커뮤니티 투표 186 찬성 vs 96 반대, protected internal의 “or” 동작 혼란
- default 연산자와 new() 연산자의 구조체 초기화 차이
- Roslyn 컴파일러 소스, ECMA-334 표준, GitHub 투표 데이터 기반 분석
NetEscapades.EnumGenerators 패키지 분리: 안정 릴리스로 가는 길
- 저자: Andrew Lock
- 태그: #sourcegenerator #nuget #roslyn #enumgenerators
주요 내용
- Enum 소스 제너레이터의 존재 이유: ToString() 등 enum 연산의 성능 문제와 ToStringFast() 벤치마크 비교
- EnumParseOptions 타입을 속성 DLL에 추가했다가 PrivateAssets=“all” 사용자에게 CS0012 에러 유발
- 해결책으로 패키지를 Generator, RuntimeDependencies, 메타패키지 3개로 분리
- RuntimeDependencies 미참조 시 nested type으로 자동 생성하는 폴백 전략
- 1.0.0 안정 릴리스 전 남은 설계 고민(usage analyzer 기본 활성화, nested type 제거 여부 등)
record의 ToString과 상속
- 저자: Steven Giesel
- 태그: csharp #record #internals
주요 내용
- record 타입에서 ToString()이 sealed로 선언되지 않으면 상속 시 예상치 못한 동작 발생
- lowered code를 통해 컴파일러가 생성하는 PrintMembers 체인과 ToString 동작 메커니즘
- record 상속 시 ToString이 호출하는 PrintMembers의 virtual 디스패치 순서
- sealed ToString() 선언 여부에 따른 출력 결과 차이
MAUI Avalonia Preview 1
주요 내용
- Avalonia 12에서 .NET MAUI를 백엔드로 지원하는 Preview 1 발표
- Linux, 웹(WASM) 등 MAUI가 지원하지 않는 플랫폼으로 확장 가능
- 기존 MAUI 앱에 Avalonia UI 렌더링 통합
- Avalonia 렌더링 엔진과 MAUI 플랫폼 추상화를 결합하는 전략
C#을 사용하여 Windows에서 대소문자 구분 폴더 만들기
주요 내용
- Windows 10 1803부터 디렉토리별 대소문자 구분(case sensitivity) 활성화 가능
- fsutil 명령줄 도구를 사용한 설정 방법
- C#에서 NtSetInformationFile/NtQueryInformationFile을 P/Invoke로 호출하는 구현
- CreateFile에 FILE_FLAG_BACKUP_SEMANTICS 플래그가 필요한 이유와 전체 테스트 코드
.NET 프로젝트에 추가해야 할 5가지 아키텍처 테스트
- 저자: Milan Jovanovic
- 태그: #architecture #testing #cleanarchitecture
주요 내용
- ArchUnitNET 라이브러리로 아키텍처 규칙을 자동화된 테스트로 검증
- 레이어 의존성 테스트: Clean Architecture의 의존성 규칙(내부→외부 참조 차단) 검증
- 명명 규칙 테스트, Colocation 테스트(커맨드/쿼리와 핸들러 동일 네임스페이스 검증)
- 가시성 테스트(핸들러 internal 강제) 및 의존성 가드(EF Core 등 인프라 의존성 차단)
Serilog 이메일 Sink: 프로덕션 환경 설정 가이드
https://medium.com/@nuthim/serilog-email-sink-a-production-ready-setup-guide-e1da7f2ed149
- 저자: Mithun Basak
- 태그: #serilog #logging #email #monitoring
주요 내용
- 순진한 이메일 알림 구현의 5가지 문제점: 메일 폭탄, 동기 SMTP, 필터 부재, 무제한 큐, 무음 실패
- Error 레벨 이상만 필터링하고 5분 배칭 윈도우로 메일 폭주 방지
EagerlyEmitFirstEvent: true로 유휴 후 첫 에러는 즉시 발송하는 설계Async()래퍼로 SMTP 작업이 애플리케이션 스레드를 차단하지 않도록 구성
C#으로 .NET 가비지 컬렉터 작성하기 - Part 9: Frozen 세그먼트와 새로운 할당 전략
주요 내용
- Frozen 세그먼트(NonGC 힙)의 불멸 객체가 GC 마킹 과정에서 method-table 포인터를 손상시키는 버그 발견 및 분석
- 64비트 가상 메모리 특성을 활용해 2TB 연속 블록 예약, 주소 범위 검사로 frozen 객체 판별
- NativeAllocator: VirtualAlloc 예약 후 페이지 단위 커밋, CAS 루프를 통한 스레드 안전 할당
- 마크 단계에서 주소 범위 체크로 frozen 객체 마킹 원천 차단
- 프로덕션 .NET GC가 연속 메모리 블록을 예약하는 이유에 대한 통찰
Windows 앱 개발 CLI v0.2: .NET 지원, 매니페스트 플레이스홀더, “winapp store” 등
주요 내용
- .NET 프로젝트(WinUI, WPF, WinForms, 콘솔) 네이티브 인식 및 자동 구성
winapp init지원 - Visual Studio 스타일 매니페스트 플레이스홀더로 빌드 구성 간 이식성 확보
winapp store서브커맨드로 Microsoft Store 개발자 CLI 통합(별도 설치 불필요)- 인증서 자동 생성 중단, NuGet 글로벌 캐시 사용 등 Breaking Changes 포함
가벼운 읽을거리
후보 항목 중 이슈로 선정되지 않은 가벼운 읽을거리들
.NET 11의 FullJoin - 잠정적으로
- LINQ에 FullJoin(Full Outer Join) API가 dotnet/runtime#124787에서 승인
- resultSelector에서 TOuter?, TInner? 모두 nullable인 API 시그니처 제안
EF Core에서 동시성 충돌 방지하기
- SQL Server용
[Timestamp]속성과 기타 DB용 GUID 기반 낙관적 동시성 전략 DbUpdateConcurrencyException처리와 BaseEntity를 통한 일관된 적용 패턴
EF Core에 데이터 시딩하는 방법
- HasData, DbContext 커스터마이징, IEntityTypeConfiguration, 마이그레이션 4가지 시딩 방법 비교
- 각 방법의 장단점과 적용 시나리오
YAML 혼돈에서 C# 명확성으로: Mattias Karlsson의 Cake Build 이야기
- Cake(C# Make)는 YAML 대신 C#으로 빌드를 정의하는 빌드 오케스트레이션 프레임워크
- 14개 이상 CI 시스템에서 동일 워크플로 실행 가능, 로컬 디버깅 지원
CoreSync
- 데이터베이스 양방향 동기화를 위한 .NET 라이브러리
- 오프라인-온라인 시나리오, 다중 클라이언트 동기화 지원
C#에서 데코레이터 패턴을 사용할 때: 예제와 함께하는 결정 가이드
- 데코레이터 패턴 적용 4가지 신호와 쓰지 말아야 할 경우의 판단 기준
- 상속, 미들웨어, 전략 패턴, AOP와의 비교 분석
