← Back to list

주말 아침 — 주간 닷넷 #42 (2026.08.23)

aprillz · 2026-08-30 05:03 · 0 claps · 14.6 min read
#csharp #dotnet #software-development #programming #dotnet-core
Open on Medium ↗
Wiki topics: 💻 · Programming

주말 아침 — 주간 닷넷 #42 (2026.08.23)

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

📌 Kubernetes에서 .NET 메모리 사용량을 줄이는 10가지 방법

[embed]Top 10 Ways to Reduce .NET Memory Usage in Kubernetes Ten practical, in-order techniques for cutting .NET pod memory usage in Kubernetes - GC tuning, EF Core, container…ardalis.com

  • 저자: 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 주소 파싱하기

[embed]Parsing IP addresses in C# at crazy speeds We are all familiar with IP addresses such as 192.168.0.1. They are typically written as four numbers in the range 0 to…lemire.me

  • 저자: Daniel Lemire
  • 태그: #dotnet #simd #avx512 #performance

주요 내용

  • AVX-512 마스크드 로드로 길이가 정해지지 않은 IP 문자열도 메모리 경계를 넘지 않고 한 번에 여러 바이트 처리
  • C#의 UTF-16 인코딩으로 ASCII 문자마다 발생하는 제로 바이트를 선택적으로 제거하는 기법
  • 점(.)이 배치될 수 있는 경우의 수가 81가지뿐이라는 성질을 이용해 점 위치를 찾고 바이트를 이동·검증
  • 표준 IPAddress.TryParse 45.3ns/addr(2210만 addr/s) 대비 AVX-512 버전 14.1ns/addr(7110만 addr/s)
  • Avx512BW.VL.IsSupported로 미지원 프로세서를 감지해 표준 라이브러리로 자동 폴백, 소스코드 GitHub 공개

📌 EF Core 추적 기능이 조용히 메모리를 낭비하고 있다

[embed]EF Core Tracking Is Silently Wasting Your Memory Your endpoint returns 50 order summaries. The query allocates objects for every matching order.medium.com

  • 저자: Viktor Ponamarev
  • 태그: #efcore #memory #performance

주요 내용

  • EF Core 추적이 identity 조회 사전, 스냅샷, navigation 수정을 메모리에 누적시키는 메커니즘
  • ToListAsync() 이후 정렬·제한(Take)을 적용하는 클라이언트측 페이지네이션의 문제
  • AsNoTracking()만으로는 카디널리티·투영 문제가 해결되지 않는다는 한계
  • SQL 단계에서 필터링→정렬→제한→DTO 투영을 완료하는 개선 패턴
  • AsTracking, AsNoTracking, AsNoTrackingWithIdentityResolution 세 모드 비교와 추적이 필요한 상황 구분

📌 ETW 이벤트를 읽어 프로덕션 이슈 진단하기

[embed]Reading ETW events and diagnosing production issues A practitioner’s guide to Event Tracing for Windows — from provider to root causemedium.com

  • 저자: 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

[embed]Field-Level Encryption in EF Core: AES-GCM for PII Columns Transparent database encryption protects the file, then decrypts for anyone who can query it. When a column holds data…medium.com

  • 저자: 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 구현하기

[embed]Implement BFF using Auth0, Angular and ASP.NET Core This post should how to implement a web application which needs secure access and secure identities. The application…damienbod.com

  • 저자: 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 엔드포인트 오류 공개

📌 단순한 데이터 모델을 긁어보면 복잡한 모델이 나온다

[embed]Scratch a simple data model, find a complex one I seem to have a knack for discovering corner cases - or in many situations being a corner case. One category of this…codeblog.jonskeet.uk

  • 저자: 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로 마이그레이션 — 힘들게 배운 것들

[embed]Migrating Xamarin to .NET MAUI: What I Learned the Hard Way as a Developer iOS surprises, a Bluetooth rabbit hole, and the navigation library that got a price tag overnightrbohara.medium.com

  • 저자: 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 이벤트 소싱

[embed]Rebuilding IIIF Manifests from Events: Event Sourcing with KurrentDB and .NET A proof of concept where KurrentDB is the source of truth and every Manifest is aggregated on retrievalahmadminoo.medium.com

  • 저자: Ahmad Minoo
  • 태그: #eventsourcing #kurrentdb #dotnet

주요 내용

  • Manifest ID의 SHA256 해시로 결정적 스트림명을 생성해 “1 manifest = 1 스트림” 구조 설계
  • 별도 현재상태 테이블 없이 요청 시점에 전체 이벤트를 재생해 상태 복원
  • 첫 revision에 검증된 canonical Presentation 3 JSON 전체를 저장하고 이후 변경은 델타 이벤트로 기록
  • SDK ChangeSet(상세 감사 정보)과 재생 가능한 도메인 이벤트(canvasId 등 안정적 식별자)를 분리 보관
  • KurrentDB 스트림 위치를 aggregate 버전으로 사용한 낙관적 동시성 제어(expectedRevision)

📌 퍼지는 성공을 보고했지만 아무것도 삭제하지 않았다

[embed]Your purge reported success and deleted nothing A silent data-retention bug in Marten, and the thing that found it was not looking for it.medium.com

  • 저자: 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 확장 구축기

  • .editorconfigmax_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/ISampleProviderSpan<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