주말 아침 — 주간 닷넷 #42 (2026.08.23)
Wiki topics:
💻 · Programming
주말 아침 — 주간 닷넷 #42 (2026.08.23)

한 주 동안 .NET 생태계에서 있었던 주요 이슈와 아티클, 기술 트렌드를 정리해 소개합니다.
📌 Kubernetes에서 .NET 메모리 사용량을 줄이는 10가지 방법
- 저자: Steve Smith (Ardalis)
- 태그: #dotnet #kubernetes #gc #performance
주요 내용
- .NET GC가 Kubernetes의 request가 아닌 limit을 기준으로 힙 크기를 결정하는 메커니즘
DOTNET_GCHeapHardLimitPercent가 16진수 값을 받아 "60"을 넣으면 0x60=96%로 해석되는 설정 함정- .NET 9/10에서 기본 활성화된 DATAS(동적 힙 적응)로 기존 Workstation/Server GC 튜닝을 재검토해야 하는 지점
dotnet-counters/dotnet-gcdump/dotnet-dump로 관리·비관리 메모리를 구분 측정하는 절차와 EF Core 추적 동작 함정- chiseled 컨테이너 이미지의 ICU·시간대·진단 도구 제약과
*-chiseled-extra,dotnet-monitor사이드카 대응 - k6/NBomber로 실제 cgroup 메모리 제한을 재현해 ramp-down 시 힙 회복을 확인하는 검증 방법
📌 C#으로 초고속 IP 주소 파싱하기
- 저자: Daniel Lemire
- 태그: #dotnet #simd #avx512 #performance
주요 내용
- AVX-512 마스크드 로드로 길이가 정해지지 않은 IP 문자열도 메모리 경계를 넘지 않고 한 번에 여러 바이트 처리
- C#의 UTF-16 인코딩으로 ASCII 문자마다 발생하는 제로 바이트를 선택적으로 제거하는 기법
- 점(.)이 배치될 수 있는 경우의 수가 81가지뿐이라는 성질을 이용해 점 위치를 찾고 바이트를 이동·검증
- 표준
IPAddress.TryParse45.3ns/addr(2210만 addr/s) 대비 AVX-512 버전 14.1ns/addr(7110만 addr/s) Avx512BW.VL.IsSupported로 미지원 프로세서를 감지해 표준 라이브러리로 자동 폴백, 소스코드 GitHub 공개
📌 EF Core 추적 기능이 조용히 메모리를 낭비하고 있다
- 저자: Viktor Ponamarev
- 태그: #efcore #memory #performance
주요 내용
- EF Core 추적이 identity 조회 사전, 스냅샷, navigation 수정을 메모리에 누적시키는 메커니즘
ToListAsync()이후 정렬·제한(Take)을 적용하는 클라이언트측 페이지네이션의 문제AsNoTracking()만으로는 카디널리티·투영 문제가 해결되지 않는다는 한계- SQL 단계에서 필터링→정렬→제한→DTO 투영을 완료하는 개선 패턴
AsTracking,AsNoTracking,AsNoTrackingWithIdentityResolution세 모드 비교와 추적이 필요한 상황 구분
📌 ETW 이벤트를 읽어 프로덕션 이슈 진단하기
- 저자: Pankaj Ikhar
- 태그: #etw #diagnostics #dotnet
주요 내용
- ETW의 세 구성 요소(Provider, Session/Controller, Consumer)와
dotnet-trace를 이용한 세션 캡처 - Gen 2 GC 정지 시간과 %Time in GC로 할당 패턴 문제 진단(정상 부하에서 10~15% 이상이면 신호)
ThreadPoolWorkerThreadAdjustment이벤트로 스레드풀 스타베이션 식별Exception/Start이벤트로 조용히 삼켜지는 예외 감지, ContentionKeyword로 락 경합 분석- 504 오류 API에 대한 CPU 확인→스레드풀 분석→동기·비동기 혼용 발견→수정→검증 5단계 진단 사례
📌 EF Core 필드 레벨 암호화 — PII 컬럼을 위한 AES-GCM
- 저자: Ivan Ball-llovera
- 태그: #efcore #encryption #security #pii
주요 내용
- TDE(투명 데이터베이스 암호화)는 디스크 도용은 막지만 쿼리 권한자에게는 평문을 노출한다는 한계
EncryptedStringConverter로[버전][논스][암호문][태그]구조의 AES-GCM 값 변환기 구현, 매 쓰기마다 새 논스 생성- 버전 바이트를 AES-GCM의 연관 데이터(AAD)로 인증 태그에 포함시키는 설계와 무중단 키 로테이션 절차
- 암호화된 컬럼은 인덱싱·정렬·조인이 불가능하고 값당 약 29바이트가 증가하는 오버헤드
- 논스 96비트·태그 128비트 등 NIST 권고 준수와 프레임워크 없이 적용하는 5단계 지침
📌 Auth0, Angular, ASP.NET Core로 BFF 구현하기
- 저자: Damien Bod
- 태그: #aspnetcore #auth0 #security #bff
주요 내용
- OpenID Connect 코드 플로우 + PKCE, private key JWT 클라이언트 어설션, OAuth PAR, DPoP를 결합한 BFF 보안 아키텍처
- HTTP-only 보안 쿠키로 세션을 유지하고 JS에 토큰을 노출하지 않는 설계
AddOpenIdConnect,OidcEventHandlers(OnPushAuthorization, OnAuthorizationCodeReceived),AssertionService.CreateClientToken구현 코드- Auth0 DPoP가 ES256만 지원하는 제약과
UsePkce=true가 DPoP·PAR·client assertion 조합에서 깨지는 문제 - Angular CSP nonce 처리, 개발·운영 환경별 배포 구성(YARP 로컬, wwwroot 통합)과 미해결 userinfo 엔드포인트 오류 공개
📌 단순한 데이터 모델을 긁어보면 복잡한 모델이 나온다
- 저자: Jon Skeet
- 태그: #datamodeling #csharp #softwaredesign
주요 내용
- 성경 텍스트를
record Bible(string Id, string Description, ImmutableArray<Book> Books)형태로 모델링하며 출발 - 번역본 범위, 책 제목의 이칭(Song of Songs / Canticle of Canticles) 정규화 등 초기 스코핑 결정을 항목별로 명시
- The Message 번역본이 절 단위가 아닌 여러 절을 묶은 “청크” 단위로 번역되어 절 하나당 문자열 하나라는 모델이 무너지는 사례
- 절이 텍스트 순서상 다른 절 사이에 끼어드는 경우, 번역본마다 절 범위가 달라지는 경우 등 추가 예외
- “부분 챕터”를 위한 전용 타입 도입 등 모델 확장 방향과 매 단계의 범위 밖 처리 기준
📌 Xamarin에서 .NET MAUI로 마이그레이션 — 힘들게 배운 것들
- 저자: Rikesh Bohara
- 태그: #dotnetmaui #xamarin #migration
주요 내용
- 멀티타겟 프로젝트를 단일 프로젝트 구조로 통합하며 겪은 의존성 주입 재설계
- Prism 라이선스 유료화로 자체 경량 네비게이션 서비스를 직접 구현한 과정
- iOS 커스텀 렌더러→핸들러 전환, Info.plist 권한 설정 등 iOS 고유 이슈
- BLE(Bluetooth Low Energy) 연결 재구현과 iOS 백그라운드 상태 복원 처리, 시뮬레이터로는 테스트 불가한 제약
- SkiaSharp로 차트를 직접 구현하며 배칭·스로틀링으로 렌더링 성능을 개선한 과정
📌 멀티테넌트 .NET — 스키마 분리를 통한 공유 데이터베이스
[embed]Barret Codes Portfolio and personal blog of Barret Blake.barretblake.dev
- 저자: Barret Blake
- 태그: #multitenant #efcore #dotnet
주요 내용
- 테넌트별 별도 스키마(guild_42, guild_43)로 데이터를 격리해 TenantId 컬럼과 쿼리 필터를 없애는 구조
IModelCacheKeyFactory커스텀 구현(SchemaAwareModelCacheKeyFactory)으로 스키마별 EF Core 모델 캐시 분리HasDefaultSchema()동적 설정과 DbContext 팩토리 패턴을 통한 스키마 전환GenerateCreateScript, 스키마별 마이그레이션 루프, 신규 테넌트 스키마 생성 전략- Part 1(쿼리 필터)과 Part 3(DB별 분리) 대비 격리 수준과 운영 비용의 중간 지점이라는 위치
📌 이벤트로부터 IIIF Manifest 재구성하기 — KurrentDB 이벤트 소싱
- 저자: Ahmad Minoo
- 태그: #eventsourcing #kurrentdb #dotnet
주요 내용
- Manifest ID의 SHA256 해시로 결정적 스트림명을 생성해 “1 manifest = 1 스트림” 구조 설계
- 별도 현재상태 테이블 없이 요청 시점에 전체 이벤트를 재생해 상태 복원
- 첫 revision에 검증된 canonical Presentation 3 JSON 전체를 저장하고 이후 변경은 델타 이벤트로 기록
- SDK ChangeSet(상세 감사 정보)과 재생 가능한 도메인 이벤트(canvasId 등 안정적 식별자)를 분리 보관
- KurrentDB 스트림 위치를 aggregate 버전으로 사용한 낙관적 동시성 제어(expectedRevision)
📌 퍼지는 성공을 보고했지만 아무것도 삭제하지 않았다
- 저자: Baryo Dev
- 태그: #marten #postgresql #dotnet
주요 내용
- Marten의
HardDeleteWhere<Invoice>()가 성공을 반환하지만 실제로는 아무 행도 삭제하지 않는 버그 - 원인은 소프트 삭제 제외 필터가 하드 삭제 쿼리에도 자동 적용되어 이미 소프트 삭제된 문서가 필터링된 것
- SQL Server용 버전(Polecat)의 회귀 테스트를 Marten으로 이식하는 과정에서 발견된 경위
- Marten 9.23.0에서 하드 삭제 시 소프트 삭제 필터를 명시적으로 제거하도록 수정
- 성공 응답과 실제 부작용이 불일치하는 조용한 실패(silent failure) 패턴
📑 가벼운 읽을거리
후보 항목 중 이슈로 선정되지 않은 가벼운 읽을거리들
하나의 Blazor UI, 두 호스트 — 어디서나 해석 가능한 디바이스 기능 계층
- 브라우저와 .NET MAUI 하이브리드 앱에서 같은 Blazor 컴포넌트가 공유·지문인식·햅틱을 다루도록 18개 기능별 인터페이스로 분리
- “불가능성은 예외가 아닌 반환값으로” 원칙과 Null Object/Constant Stub/Neutral Local State 세 가지 기본값 등록 전략
.NET 데이터 포맷 필드 가이드
- CSV(CsvHelper), RDBMS(ADO.NET/Dapper/EF Core), XML(XPath/LINQ to XML), JSON(System.Text.Json)별 쿼리 방식과 코드
- 문서 DB, 그래프(GraphQL, Cypher/Gremlin), 바이너리(protobuf, MessagePack)를 거쳐 모두 LINQ to Objects로 수렴한다는 관점
await를 호출하면 런타임에서 무슨 일이 벌어지는가
- 컴파일러가 생성하는
IAsyncStateMachine구조체와 await 지점별 상태 분기,awaiter.OnCompleted등록과 스레드 반환 - I/O가 OS(IO Completion Ports)로 위임된 뒤 ThreadPool에서 재개되는 흐름과 UI 앱의 SynchronizationContext 복귀 차이
하이브리드 렌더링 — 서버 렌더링 페이지와 인터랙티브 아일랜드
- ClearScript로 .NET 프로세스 내부에 V8을 호스팅해 별도 Node.js 렌더링 서비스 없이 컴포넌트 서버 렌더링
- 검색·지도·예약 등 필요한 부분만 JavaScript 아일랜드로 만들고 나머지는 서버 렌더링으로 유지
Max Line Length 확장 구축기
.editorconfig의max_line_length를 읽어IWpfTextView/IAdornmentLayer기반 세로선으로 표시, 중첩 설정 파일의 유효 값 결정- 문자열 리터럴·XML 문서주석 보호와
@formatter:off/on마커 지원 등 "보수적 동작"을 설계 원칙으로 채택
라이브 코딩 데모에서 살아남기 위한 Rider 설정
- 프레젠테이션 모드와 라이트 테마로 프로젝터 가독성 확보, MARP로 IDE 안에서 코드와 슬라이드를 통합
- Search Everywhere(Shift 두 번),
.http파일 기반 API 데모, 주제별 접두사 명명 라이브 템플릿
xUnit.v3 4.0.0 — MTP v1 지원 중단과 빌드 오류 해결
- xUnit v3 4.0.0에서 Microsoft Testing Platform v1 지원이 끊기고 v2가 기본값으로 전환, .NET 10 SDK에서 VSTest 타겟 미지원으로 빌드 오류 발생
global.json에"test": {"runner": "Microsoft.Testing.Platform"}추가, Azure DevOps는dotnet test --solution명령으로 대체
Windows App Development CLI v0.6
winapp new로 WinUI 3 앱 생성(빈 앱, NavigationView, TabView, MVVM 템플릿),winapp find-ui로 Gallery·Community Toolkit 샘플 검색winapp az-sign으로 개인 키를 로컬에 두지 않고 Azure Trusted Signing 서명, Sparse Packaging으로 기존 데스크톱 앱에 패키지 ID 부여
NAudio 3
GeneratedComInterface소스 생성으로 NativeAOT 지원,IWaveProvider/ISampleProvider가Span<T>기반 버퍼 전달로 재설계- Windows 전용 기능을 별도 어셈블리로 분리하고 NAudio.Alsa(Linux) 추가, 커스텀 구현체는
Span<T>대응 수정 필요
Sysinternals — Process Monitor v4.1, ZoomIt 12.3 for macOS, RDCMan v3.21
- Process Monitor v4.1에 명명된 파이프와 메일슬롯을 위한 IPC 이벤트 클래스 추가
- macOS용 ZoomIt 12.3에 화면·영역·창을 두 번째 모니터로 미러링하는 DemoMirror 기능, RDCMan v3.21은 원격 데스크톱 게이트웨이 지원 재활성화
메타데이터
- post_id
- de3eb8dff7e7
- slug
- 주말-아침-주간-닷넷-42-2026-08-23-de3eb8dff7e7
- url
- https://medium.com/@al6uiz/%EC%A3%BC%EB%A7%90-%EC%95%84%EC%B9%A8-%EC%A3%BC%EA%B0%84-%EB%8B%B7%EB%84%B7-42-2026-08-23-de3eb8dff7e7
- canonical_url
- https://medium.com/@al6uiz/%EC%A3%BC%EB%A7%90-%EC%95%84%EC%B9%A8-%EC%A3%BC%EA%B0%84-%EB%8B%B7%EB%84%B7-42-2026-08-23-de3eb8dff7e7
- author_url
- https://medium.com/@al6uiz
- status
- ok
- fetched_at
- 2026-08-31 15:46:43