주말 아침 - 주간 닷넷 #13

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


:pushpin: 사라진 18바이트의 대미스터리

  • 저자: Steve Gordon
  • 태그: dotnet #performance #memory #benchmarkdotnet

주요 내용

  • BenchmarkDotNet의 Allocated(312B)와 프로파일러(dotMemory/VS, 294B) 결과가 18B 차이 나는 미스터리를 추적
  • BDN이 GC.GetTotalAllocatedBytes(precise: true) 기반으로 측정한다는 점을 확인하고 동일 방식으로 재현
  • 문자열/객체 크기(UTF-16 데이터 + 오버헤드)를 직접 계산해 프로파일러가 보고한 크기와 맞춘 뒤 차이를 설명
  • GC가 객체를 8바이트 경계로 정렬(패딩)하며, 이 패딩이 합쳐져 “누락된 18바이트”가 된다는 결론

:pushpin: System.Diagnostics.Metrics API로 메트릭 생성 및 소비하기

  • 저자: Andrew Lock
  • 태그: dotnet #observability #metrics #opentelemetry

주요 내용

  • System.Diagnostics.Metrics의 핵심 개념(Meter/Instrument)과 주요 Instrument 종류(Counter/Gauge/Histogram 등) 정리
  • Observable 계열과 비-Observable 계열의 차이를 “언제 값을 기록/수집하는가” 관점에서 설명
  • 로컬에서 dotnet-counters로 런타임/앱 메트릭을 모니터링하는 설치/사용 흐름 안내
  • 커스텀 메트릭을 애플리케이션에 추가하는 기본 패턴을 단계적으로 소개

:pushpin: 글로벌 .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 등) 논의

:pushpin: .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 타깃팅만 해도 이득을 보는 영역과 유리한 사용 시나리오를 정리

:pushpin: ConfigureAwaitOptions로 하는 .NET의 현대적 Task 관리 — 고급 ConfigureAwait

https://medium.com/@rserit/modern-task-management-in-net-with-configureawaitoptions-advanced-configureawait-4c01db811f74

  • 저자: Recep Serit
  • 태그: dotnet async #configureawait #performance

주요 내용

  • ConfigureAwait(false)가 “데드락 방지 만능키”가 아니며, 의미가 await 지점에만 적용된다는 점을 강조
  • .NET 8에서 도입된 ConfigureAwaitOptions(ContinueOnCapturedContext/SuppressThrowing/ForceYielding)를 소개
  • SuppressThrowing으로 await/블로킹 대기(GetResult) 시 예외 전파를 억제하는 패턴과 제약(Task<T>에는 불가) 설명
  • ForceYielding으로 “이미 완료된 Task라도” 스케줄링을 강제해 UI 프리즈를 줄이거나 공정성을 높이는 활용 예시 제시

:pushpin: DI 생성자와 수동 .NET 서비스 등록을 그만두고, 대신 이렇게 하라

https://pieterjandeclippel.medium.com/stop-writing-di-constructors-and-manually-registering-net-services-do-this-instead-942751e82c2f

  • 저자: Pieterjan De Clippel
  • 태그: dotnet #dependency-injection #sourcegenerator #productivity

주요 내용

  • DI “constructor explosion”과 수동 서비스 등록이 만드는 보일러플레이트/런타임 실패 문제를 지적
  • [Inject]로 필드를 마킹하면 소스 제너레이터가 생성자(의존성 주입) 코드를 컴파일 타임에 생성하는 접근 소개
  • [PostConstruct]로 주입 완료 후 초기화 로직을 실행하는 패턴과 제약(파라미터 없음/1개만/Inject 필요)을 정리
  • 상속 체인에서 base 의존성까지 자동으로 포워딩하는 생성자 생성 등 “상속 + DI” 고질 문제를 완화

:pushpin: ‘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+)에서 설치 후 바로 사용 가능한 “제로 설정” 확장으로 소개

:bookmark_tabs: 가벼운 읽을거리

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

가끔은 모델링을 위해 확장 메서드가 필요하다

  • “부분 업데이트 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(높은 커스터마이즈/입문자 친화) 등 대표 선택지를 비교

4개의 좋아요