Fable 사용으로 인한 빠른 주간한도 소진으로 늦게 올립니다. ![]()
한 주 동안 .NET 생태계에서 있었던 주요 이슈와 아티클, 기술 트렌드를 정리해 소개합니다.
LibreWPF와 ProGPU 발표 — 오픈소스 크로스플랫폼 WPF와 GPU 렌더링 엔진
https://www.reddit.com/r/dotnet/comments/1unlkuv/announcing_librewpf/
- 저자: Wiesław Šoltés
- 태그: wpf #librewpf #progpu #crossplatform
주요 내용
- Avalonia 생태계의 주요 기여자가 WPF 프로그래밍 모델을 유지하면서 크로스플랫폼(Windows/macOS/Linux, 향후 iOS/Android/WebAssembly)에서 동작시키는 오픈소스 구현 LibreWPF 공개
- 기존 WPF 앱을 코드 변경 최소화로 이식할 수 있어 개발자의 스킬/라이브러리/애플리케이션 재사용 지향
- 신규 GPU 렌더링 엔진 ProGPU가 하드웨어 가속을 제공하며 WebGPU/Vulkan/Metal/Direct3D 12/OpenGL 백엔드 지원
- 대상 워크로드: CAD, 과학 시각화, UI 프레임워크, 게임 도구, 크리에이티브 소프트웨어
- 로드맵: WPF API/XAML 생태계 고호환성, 서드파티 컨트롤 라이브러리 지원, 도구·진단·테스트·디자이너까지 완전한 개발 경험, 오픈 거버넌스.
- 샘플 비디오
.NET 가비지 컬렉터를 C#으로 구현 Part 10 — Finalizers
- 저자: Kevin Gosse
- 태그: #gc #finalizers #memory
주요 내용
- GC 추적 전용 큐에서 파이널라이저 관리 및
GetNextFinalizable()호출 메커니즘 - f-reachable queue를 통한 일반/중요(critical) 파이널라이저 구분 관리
- 짧은/긴 약한 참조의 정리 시점 구별과 마킹 단계에서 처리
BIT_SBLK_FINALIZER_RUN비트 플래그로 파이널라이저 실행 상태 추적 최적화WeakReference의 eager finalization과 syncblock 캐시 관리
.NET 11 Preview 4의 Closed Class Hierarchies
- 저자: Andrew Lock
- 태그: #dotnet11 csharp #sealed
주요 내용
- .NET 11 Preview 5에서 도입된 신기능으로 파생 타입을 단일 어셈블리로 제한하는 “Closed” 계층 구조 지원
switch표현식에서 컴파일러가 파생 타입 전수를 알 수 있어 완전성(exhaustiveness) 검사 가능[Closed]특성으로 구현하며 현재 프리뷰에서는 수동 정의 방식- Private 생성자를 통한 유사 기법과 달리 의미론적 명확성과 컴파일러 지원 제공
- 전체 계층이 단일 어셈블리에 있어야 한다는 제약
Factory switch 문을 Attributes + Reflection으로 대체하기
- 저자: Oluwagbemileke Oyeyoade
- 태그: #designpatterns #strategy #reflection
주요 내용
HrWorkflowStrategyAttribute로 각 전략이 자신의 라우팅 정보를 메타데이터로 선언- 애플리케이션 부팅 시 리플렉션으로 모든 전략을 스캔하여 딕셔너리 캐시 구축, 런타임에는 단순 조회
- Scrutor 라이브러리로 DI 컨테이너 등록 자동화, Open-Closed Principle 준수
- 대규모 시스템(50+ 전략)에서 확장성 우수, 부팅 시 충돌 감지로 초기 안정성 확보
- 새로운 전략 추가 시 기존 코드 수정 완전 제거
.NET에서 NATS JetStream 시작하기
- 저자: Milan Jovanović
- 태그: #nats #jetstream #messaging
주요 내용
- NATS는 Go로 작성된 외부 의존성 없는 단일 바이너리 메시징 시스템, 18MB 크기
- JetStream 계층이 메시징을 지속성 있는 큐로 변환하여 초당 수십만 메시지 처리
- Docker 서버 실행, NuGet 추가, ASP.NET Core 통합의 단순한 아키텍처
- “작업 처리 후 메시지 승인” 원칙으로 at-least-once 전달 보장, 핸들러 멱등성 필수
- 스트림별 저장소·보관 정책 독립 설정
Add vs AddRange in EF Core — 반복하지 말아야 할 성능 미신
- 저자: Chris Woodruff
- 태그: #efcore #performance #benchmark
주요 내용
- EF6에서 비롯된 “Add() 루프 피하기” 조언은 EF Core에서 더 이상 유효하지 않음
- EF Core는 Add()와 AddRange() 모두
DetectChanges를 자동 호출하지 않음 (EF6과 다름) - 실제 성능 병목: 루프 내에서
SaveChanges()호출 또는ChangeTracker접근 - 벤치마크 결과, 좁은/넓은 엔티티 모두에서 Add()와 AddRange() 성능 차이 무시할 수준
- 생성된 SQL과 실제 병목 지점 확인이 우선
2026년 실제로 나오는 30가지 LINQ 인터뷰 질문
주요 내용
- Query vs Method 문법, 지연 실행,
IEnumerablevsIQueryable의 메모리 vs 데이터베이스 실행 차이 GroupBy,Join,Aggregate,Any/All의 심화 활용법- .NET 9/10 신규 기능:
CountBy,AggregateBy,Index,LeftJoin/RightJoin - EF Core 실무: N+1 문제,
AsNoTracking, 페이징, 과다 로드 방지 - 각 답변에 "위험한 답변"과 “팔로우업 질문” 포함으로 면접 시뮬레이션
깨지지 않는 코드 작성 — 보안 코딩 종합 가이드
https://medium.com/@alisadri1993/secure-coding-practices-writing-code-that-doesnt-break-0c8faa48607f
- 저자: Ali Sadri
- 태그: #security #owasp csharp
주요 내용
- 화이트리스트 기반 입력 검증, 타입 강제, 길이 제한을 통한 다층 방어 전략
- 매개변수화 쿼리 및 ORM 사용으로 SQL 주입 방지, 문자열 연결 금지
- 하드코딩된 비밀번호/API 키 절대 금지, Azure Key Vault·환경변수 등 외부 관리
- 렌더링 시점의 컨텍스트별 인코딩(HTML/JavaScript/URL)으로 XSS 방지
- 하드코딩된 암호화 알고리즘 대신 설정 기반 선택, AES-256-GCM 등 최신 표준 사용
스피너 너머 — .NET과 JavaScript로 고성능 낙관적 UI 구현
- 저자: Ezgi Beytekin
- 태그: #optimisticui #efcore #idempotency
주요 내용
- 낙관적 UI: 백엔드 응답 대기 없이 UI를 즉시 업데이트하여 인지된 성능 향상
- 프론트엔드 3단계 생명주기: 상태 스냅샷 → 최적화 업데이트 → 커밋/롤백
- EF Core 행 버전 관리(RowVersion)로 경쟁 조건 방지 및 409 상태 코드로 충돌 피드백
X-Idempotency-Key헤더와 Redis 캐싱으로 중복 네트워크 요청 방지- 데이터 무결성과 사용자 경험 균형으로 엔터프라이즈 효율성 극대화
Mock as Private Field 패턴은 반만 작동한다
- 저자: Wiktor Helak
- 태그: #testing #mocking #nunit
주요 내용
- xUnit/MSTest: 각 테스트마다 새로운 테스트 클래스 인스턴스를 생성하여 Mock 상태 격리
- NUnit: 기본 설정에서 고정 인스턴스 재사용으로 Mock 상태가 테스트 간 전파될 수 있음
- NUnit 해결책:
[SetUp]/[TearDown]메서드 또는[FixtureLifeCycle(LifeCycle.InstancePerTestCase)]속성 사용 - 프레임워크 간 테스트 패턴 복사 시 인스턴스 생성 방식의 차이 확인 필수
가벼운 읽을거리
후보 항목 중 이슈로 선정되지 않은 가벼운 읽을거리들
승인 후 부작용 분리 — Observer 패턴 실전
- 승인 전략이 이메일/감사 로그/캐시 무효화 등 모든 부작용을 직접 처리하면 복잡도 폭증, Observer 패턴으로 발행-구독 분리
- Publish 시점(커밋 전/후)에 따라 롤백 가능성 결정, MediatR/Channels/브로커 등 다양한 구현 옵션
언로드된 써드파티 DLL에서 실행되는 스레드 사례
- COM DLL 언로드 후에도 워커 스레드가 해제된 메모리에서 실행되는 문제 분석
FreeLibraryAndExitThread등 일반 해결책이 실패한 원인과 애플리케이션 호환성 플래그로 DLL을 메모리에 고정하는 실제 해결
C#에서 정확 문자열 비교 없이 이름 매칭하기
- 정규화(유니코드 분해, 발음부호 제거) → 닉네임 확인 → 후보 필터링 3단계
- Double Metaphone 음성 인코딩 + Jaro-Winkler 유사도 점수화, 인구통계 데이터 미스매치 시 신뢰도 감점
HttpClient 스트리밍 — HttpCompletionOption, ReadAsStreamAsync, .NET 10 SseParser
- 기본 HttpClient는 전체 응답을 메모리에 버퍼링,
HttpCompletionOption.ResponseHeadersRead로 헤더 수신 후 즉시 반환하여 메모리 효율 개선 JsonSerializer.DeserializeAsyncEnumerable<T>와 .NET 10의SseParser로 대용량 JSON·서버 전송 이벤트 처리
.NET 10의 LeftJoin — GroupJoin을 삭제한 한 메서드
- .NET 10의 새
LeftJoin메서드가 “GroupJoin → SelectMany → DefaultIfEmpty” 세 단계를 한 줄로 대체 - LEFT JOIN 오해로 인한 3주간 데이터 손실 버그 사례, 오른쪽 엔티티의 널 가능성을 명시적으로 처리해야 함
Verify로 스냅샷 테스트 — 회귀 방지 가이드
- 스냅샷 테스트는 메서드 전체 출력을 파일에 저장해 변경사항을 감지 (단위 테스트는 정확성, 스냅샷은 회귀 방지)
- 직렬화된 반환값·HTTP 요청 페이로드 검증, 동적 값 자동 스크러빙,
.received/.verified파일 워크플로우
.NET 앱·라이브러리 현대적 버전 관리와 멱등성 아티팩트
PackageVersion,AssemblyVersion,FileVersion,InformationalVersion의 각각 다른 역할- Nerdbank.GitVersioning이 Git 히스토리를 버전 관리의 권위 있는 출처로 활용, 결정적 빌드로 동일 입력 → 일관된 출력
시니어 엔지니어도 프로덕션에서 하는 10가지 C# 실수
.Result/.Wait()교착 상태, 과도한 예외 처리,IDisposable미해제, 루프 내 문자열 연결,CancellationToken무시, EF N+1 등- 각 실수마다 Why/Why it kills/Fix 구조로 문제 코드와 해결책을 대조
