한 주 동안 .NET 생태계에서 있었던 주요 이슈와 아티클, 기술 트렌드를 정리해 소개합니다.
사라진 18바이트의 대미스터리
- 저자: Steve Gordon
- 태그: dotnet #performance #memory #benchmarkdotnet
주요 내용
- BenchmarkDotNet의 Allocated(312B)와 프로파일러(dotMemory/VS, 294B) 결과가 18B 차이 나는 미스터리를 추적
- BDN이 GC.GetTotalAllocatedBytes(precise: true) 기반으로 측정한다는 점을 확인하고 동일 방식으로 재현
- 문자열/객체 크기(UTF-16 데이터 + 오버헤드)를 직접 계산해 프로파일러가 보고한 크기와 맞춘 뒤 차이를 설명
- GC가 객체를 8바이트 경계로 정렬(패딩)하며, 이 패딩이 합쳐져 “누락된 18바이트”가 된다는 결론
System.Diagnostics.Metrics API로 메트릭 생성 및 소비하기
- 저자: Andrew Lock
- 태그: dotnet #observability #metrics #opentelemetry
주요 내용
- System.Diagnostics.Metrics의 핵심 개념(Meter/Instrument)과 주요 Instrument 종류(Counter/Gauge/Histogram 등) 정리
- Observable 계열과 비-Observable 계열의 차이를 “언제 값을 기록/수집하는가” 관점에서 설명
- 로컬에서 dotnet-counters로 런타임/앱 메트릭을 모니터링하는 설치/사용 흐름 안내
- 커스텀 메트릭을 애플리케이션에 추가하는 기본 패턴을 단계적으로 소개
글로벌 .NET 애플리케이션을 위한 국제화 아키텍처: ICU, 로컬라이제이션, 문화권 포매팅
- 저자: Sudhir Mangla
- 태그: dotnet #globalization #i18n #architecture
주요 내용
- 현대 i18n을 “UI 번역”이 아니라 런타임/데이터/배포를 관통하는 아키텍처 문제로 정의
- .NET 5+에서 NLS(Windows 종속)에서 ICU(크로스플랫폼)로 이동한 배경과 “플랫폼 간 결정적(deterministic) 동작” 의미 설명
- i18n(동작), L10n(콘텐츠), localizability(UI/설계) 3층을 분리해 설계해야 한다는 프레임 제시
- 문화권 해석(프로필/URL/쿠키/Accept-Language 우선순위)과 ASP.NET Core에서의 적용 포인트(UseRequestLocalization 등) 논의
.NET 10: Zip 및 GZip API 개선 사항
- 저자: Anthony Giretti
- 태그: dotnet10 #performance #io #compression
주요 내용
- ZipArchive/GZipStream의 “표면 API 변경 없이” 내부 구현 최적화로 처리량/리소스 사용 개선
- 많은 엔트리를 가진 ZIP 추출에서 async I/O 오버헤드/락/버퍼링 개선으로 성능 향상
- 여러 gzip member가 이어붙은(concatenated) GZip 스트림 처리 최적화로 로그형 GZip 처리 효율 개선
- 기존 코드 그대로 .NET 10 타깃팅만 해도 이득을 보는 영역과 유리한 사용 시나리오를 정리
ConfigureAwaitOptions로 하는 .NET의 현대적 Task 관리 — 고급 ConfigureAwait
주요 내용
- ConfigureAwait(false)가 “데드락 방지 만능키”가 아니며, 의미가 await 지점에만 적용된다는 점을 강조
- .NET 8에서 도입된 ConfigureAwaitOptions(ContinueOnCapturedContext/SuppressThrowing/ForceYielding)를 소개
- SuppressThrowing으로 await/블로킹 대기(GetResult) 시 예외 전파를 억제하는 패턴과 제약(
Task<T>에는 불가) 설명 - ForceYielding으로 “이미 완료된 Task라도” 스케줄링을 강제해 UI 프리즈를 줄이거나 공정성을 높이는 활용 예시 제시
DI 생성자와 수동 .NET 서비스 등록을 그만두고, 대신 이렇게 하라
- 저자: Pieterjan De Clippel
- 태그: dotnet #dependency-injection #sourcegenerator #productivity
주요 내용
- DI “constructor explosion”과 수동 서비스 등록이 만드는 보일러플레이트/런타임 실패 문제를 지적
- [Inject]로 필드를 마킹하면 소스 제너레이터가 생성자(의존성 주입) 코드를 컴파일 타임에 생성하는 접근 소개
- [PostConstruct]로 주입 완료 후 초기화 로직을 실행하는 패턴과 제약(파라미터 없음/1개만/Inject 필요)을 정리
- 상속 체인에서 base 의존성까지 자동으로 포워딩하는 생성자 생성 등 “상속 + DI” 고질 문제를 완화
‘Debugalizers’ Visual Studio 확장 소개
- 저자: Calvin Allen
- 태그: visualstudio #debugging #tooling #productivity
주요 내용
- 디버깅 중 문자열(미니파이드 JSON/XML 등)을 DataTip에서 읽기 힘든 문제를 “디버그 비주얼라이저”로 해결
- JSON/XML/HTML/YAML/SQL/JWT/Base64/GZip 등 30+ 포맷에 대해 포매팅/하이라이트/트리 뷰 제공
- 검색/복사/내보내기/워드랩/검증/통계 등 디버그 흐름을 끊지 않는 부가 기능 제공
- Visual Studio 2022(17.8+)에서 설치 후 바로 사용 가능한 “제로 설정” 확장으로 소개
가벼운 읽을거리
후보 항목 중 이슈로 선정되지 않은 가벼운 읽을거리들
가끔은 모델링을 위해 확장 메서드가 필요하다
- “부분 업데이트 DTO”에서
Optional<T>같은 래퍼를 사용할 때 nullability가 엇갈리면 제네릭 메서드가 막히는 사례 제시 Optional<T>.GetValueOrDefault(T current)형태가T?/T간 호환 문제로 깨지는 지점을 설명
코드 의견: C# 비동기 메서드에서 Async 접미사를 피하는 이유
- await가 코드에 드러나므로 “Async”가 과도하게 반복되면 가독성/인지부하가 증가한다는 문제 제기
- 메서드 이름은 “무엇(WHAT)”을 표현해야지 “어떻게(HOW, 비동기 구현)”를 노출하는 건 부적절하다는 주장
아무도 말해주지 않는 레코드와 불변성이 내 C# 코드를 바꾼 방식, 그리고 왜 중요한지
- 불변(immutability)이 예기치 않은 상태 변경/부작용을 줄여 디버깅과 동시성 안정성에 도움이 된다고 설명
- C# record의 값 기반 동등성, 간결한 선언, with-expression 기반 복사/변경 패턴을 소개
OneOf로 C#에서 타입 안전 유니온 구현하기
- C#에 네이티브 유니온 타입이 없을 때 OneOf로 “선택(OR)”을 타입 안전하게 모델링하는 접근 소개
- 상속/마커 인터페이스/튜플 등 전통적 대안의 단점(복잡도/타입 안전성 저하)을 비교
C#과 .NET의 분산 시스템 패턴: 실제 시스템을 운영하는 사람들을 위한 새 시리즈
- Unmesh Joshi의 “Patterns of Distributed Systems” 카탈로그를 C#/.NET 코드로 옮기는 시리즈 목적을 설명
- “슬라이드용 아키텍처”가 아니라 장애를 막는 반복 가능한 기술(ownership/ordering/ack)을 다루겠다는 선언
Windows 11에서 Linux Mint로 갈아탔다: 더 나은 7가지
- Windows 11에서 Linux Mint로 옮긴 경험을 바탕으로 “더 낫다고 느낀 점”을 7가지로 정리
- 라이선스 비용 없이 무료로 사용할 수 있다는 점을 첫 번째 이점으로 제시
나에게 맞는 리눅스 데스크톱 UI는 무엇일까?
- 데스크톱 환경(DE)과 윈도우 매니저(WM)의 차이, 그리고 DE 내부에도 WM이 포함된다는 관계를 정리
- GNOME(미니멀/확장으로 보완), KDE Plasma(높은 커스터마이즈/입문자 친화) 등 대표 선택지를 비교
