주말 아침 - 주간 닷넷 #27


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


:pushpin: CVE-2026-40372: 공격자에게 SYSTEM 권한을 허용할 수 있는 ASP.NET Core 취약점

  • 저자: SOC Prime Team
  • 태그: #cve #security aspnetcore #data-protection

주요 내용

  • ASP.NET Core 데이터 보호 암호화 API의 CVSS 9.1 등급 취약점
  • 손상된 HMAC 검증으로 인증 자료 위조 후 SYSTEM 권한 획득 가능
  • Linux/macOS 등 비Windows 운영체제에서만 작동, 특정 런타임 로딩 조건 필요
  • 영향 버전 10.0.0–10.0.6, 10.0.7로 업데이트 후 데이터 보호 키링 순환 필요
  • 패치 후에도 노출 기간에 발급된 토큰의 유효성 검토 필요

:pushpin: 우연히 가장 빠른 C# CSV 파서를 만든 과정

  • 저자: Bepis
  • 태그: #simd #performance #csv #avx2

주요 내용

  • UTF-8 ASCII 호환성을 활용한 CSV 파서 구현 과정
  • SSE2, AVX2 등 SIMD 명령어와 비트 연산 단계적 적용
  • 문자 인코딩(Unicode/UTF-8/UTF-16) 원리와 실제 구현 분석
  • 135.305ms → 13.673ms 단계별 성능 진화 기록
  • 기존 라이브러리 Sep와의 비교 및 AVX-512/ARM 플랫폼 한계 언급

:pushpin: C#/.NET 성능: 무엇부터 최적화해야 하나

  • 저자: Chris Pietschmann
  • 태그: #performance ef-core #profiling

주요 내용

  • BenchmarkDotNet, dotnet-trace로 병목 측정 후 최적화하는 원칙
  • DB/EF Core 쿼리, N+1 문제, 전체 엔티티 로딩 등 흔한 병목 분류
  • 비동기 I/O와 Task.WhenAll 병렬화로 스레드 풀 활용
  • 메모리 할당 압력, GC 오버헤드, 직렬화 비용, 캐싱 부재 분석
  • 의사결정 순서: 작업 회피 → 작업량 감소 → 병렬화 → 효율화

:pushpin: C#/.NET: 횡단 관심사를 깔끔하게 도입하는 방법

  • 저자: Chris Pietschmann
  • 태그: #cross-cutting #middleware #decorator

주요 내용

  • 범위, 컨텍스트, 조합 가능성 세 질문에 따른 메커니즘 선택 프레임워크
  • ASP.NET 미들웨어 vs 액션 필터의 적용 기준
  • 데코레이터, 제네릭 파이프라인, 도메인 서비스 패턴
  • 상관관계 ID, 캐싱, 검증, 감사 로깅 구현 예시
  • 안티패턴: 기본 클래스 상속 강제, 정적 헬퍼, 미들웨어 비대화

:pushpin: C#의 LINQ 완전 가이드 (.NET 6-9)

  • 저자: Nick Cosentino
  • 태그: linq #ienumerable #deferred-execution

주요 내용

  • IEnumerable/IQueryable 확장 메서드, 쿼리/메서드 구문 비교
  • 필터링, 프로젝션, 정렬, 그룹화, 조인, 집합 연산자 카테고리
  • .NET 6-9 신규 연산자: DistinctBy, MinBy/MaxBy, Chunk, Order, CountBy, AggregateBy, Index, LeftJoin/RightJoin
  • 지연 실행 동작과 ToList() 호출 시점 판단
  • Feature Slicing, Plugin Architecture, CQRS 패턴과의 통합

:pushpin: 할당에서 반복까지: .NET 컬렉션 최적화

https://medium.com/@gabrielmarinho2007/from-allocation-to-iteration-optimizing-your-collections-in-net-ca032a586b53

  • 저자: Gabriel Marinho
  • 태그: dotnet #performance #collections

주요 내용

  • List 초기 용량 지정 시 50-62% 성능 향상, 50-70% 메모리 할당 감소
  • 용량 미지정 시 재할당 누적으로 10,000개 항목에서 약 20배 메모리 추가 사용
  • 동적 용량 확장이 GC 압력을 3-4배 증가시키는 메커니즘
  • BenchmarkDotNet 측정 결과와 .NET 소스 코드 인용 분석
  • 예상 항목 수가 알려진 경우 생성자에 용량 전달하는 모범 사례

:pushpin: C#의 함정과 엣지 케이스 — Part 1: 기본부터 Async까지

https://medium.com/@hanxuyang0826/c-traps-edge-cases-part-1-from-basics-through-async-0b0d454a2908

주요 내용

  • 값/참조 타입 기본값 처리, 컴파일 타임 vs 런타임 동작 차이
  • 패턴 매칭, checked/unchecked 오버플로우, 동등성 비교 함정
  • LINQ 지연 실행, First/FirstOrDefault 선택 기준
  • async void 회피, .Result 블로킹 데드락, throw vs throw ex 스택 보존
  • ConfigureAwait, CancellationToken 활용

:pushpin: C#으로 .NET GC 만들기 - Part 8: 내부 포인터

  • 저자: Kevin Gosse
  • 태그: #gc #internals #span

주요 내용

  • Span 같은 고성능 코드의 내부 포인터(객체 시작이 아닌 내부 가리킴) 처리
  • GC가 객체 시작 주소를 찾기 위한 brick table 자료구조
  • 1GB 힙당 약 500KB로 빠른 조회를 제공하는 메모리 맵 기반 최적화
  • brick table 기반 객체 식별 후 힙 순회 알고리즘
  • GC 마킹 단계에서 brick table을 점진적으로 업데이트하는 방식

:pushpin: LocalStack 연대기: .NET 개발자 생존 가이드

https://naved-shaikh.medium.com/the-localstack-chronicles-a-net-developers-survival-guide-8bd080b40bc8

  • 저자: Mohammed Naved
  • 태그: #localstack aws dotnet #serverless

주요 내용

  • LocalStack을 사용한 .NET Lambda 로컬 개발 환경 구축 트러블슈팅
  • Docker 네트워킹, PowerShell JSON 처리, .NET JIT 타임아웃 이슈
  • PostgreSQL 연결 시 네임스페이스 불일치 및 타입 매핑 문제
  • 28P01 인증 오류 등 실제 디버깅 사례
  • 5개 장 구성의 단계별 트러블슈팅 가이드

:pushpin: .NET 스레드, Task, async/await 내부 동작

https://wiemksaier.medium.com/net-threads-tasks-async-await-what-actually-happens-under-the-hood-a3dc7524bcbd

  • 저자: Wiem Ksaier
  • 태그: async #threading task #internals

주요 내용

  • .NET 스레드 풀의 작업자 스레드 재사용 메커니즘
  • Task가 스레드가 아닌 비동기 작업의 상태 머신이라는 점
  • 컴파일러가 async 메서드를 연속(continuation) 조각으로 변환하는 과정
  • I/O 바운드와 CPU 바운드 작업의 스레드 사용 차이
  • 동시성 vs 병렬성, 블로킹 vs 논블로킹 패턴 비교

:pushpin: 로그가 당신에게 거짓말하고 있다: 실무용 구조화 로깅

https://medium.com/@mitesh_shah/your-logs-are-lying-to-you-practical-structured-logging-for-backend-engineers-2bcf3a4c43ea

  • 저자: Mitesh Shah
  • 태그: #logging #observability #serilog

주요 내용

  • 메시지 템플릿 기반 구조화 로깅으로 쿼리 가능한 필드 생성
  • 기록할 이벤트 분류: 요청 경계, 상태 변화, 의존성 실패, 컨텍스트 있는 오류
  • 헬스체크, 성공한 작업, 전체 요청 본문, 프레임워크 노이즈 등 제거 대상
  • 상관관계 ID로 서비스 간 로그 연결
  • Information/Warning/Error 수준 사용 기준과 Serilog 스켈레톤 코드

:pushpin: 고동시성 마스터: .NET 스레드 안전 설정 서비스 구축

https://naved-shaikh.medium.com/mastering-high-concurrency-building-a-thread-safe-configuration-service-in-net-0b3e8824e63d

  • 저자: Mohammed Naved
  • 태그: #concurrency #semaphore #cache

주요 내용

  • “Thundering Herd” 문제와 더블 체크 락킹 + 세마포어 패턴
  • SemaphoreSlim의 비차단 대기와 lock 대신 await를 선택하는 이유
  • Fast Path/Slow Path 분리로 99.9% 요청의 동기화 오버헤드 제거
  • .NET 8 환경에서의 스레드 안전 캐시 구현 코드
  • Redis 기반 분산 캐시로의 확장 경로

:pushpin: class, record, struct, interface 중 무엇으로 만들어야 하나

  • 저자: Chris Pietschmann
  • 태그: csharp #type-system #records

주요 내용

  • class: 참조 타입, identity 중심
  • record: 값 기반 equality 자동 제공
  • struct: 스택 할당 성능 최적화와 복사 의미론으로 인한 박싱 함정
  • abstract/sealed/static class 변형의 사용 사례
  • interface: DI 경계와 계약 추상화 정의

:pushpin: C#의 숨은 무기, sealed

https://medium.com/@cassio.bjhones/the-hidden-power-of-sealed-in-c-1f8fd65af315

  • 저자: Cassio Jhones
  • 태그: csharp #sealed #performance

주요 내용

  • sealed 수정자에 의한 상속 차단과 설계 의도 표현
  • JIT의 devirtualization으로 가상 호출이 직접 호출로 변환되는 동작
  • 기계 코드 수준 비교를 통한 메모리 접근 단계 차이
  • Entity Framework, Moq 사용 시 sealed의 제약
  • “sealed by default” 원칙 채택 가이드

:pushpin: 소프트웨어 두뇌의 한계

  • 저자: Mark Downie
  • 태그: ai #philosophy #software-engineering

주요 내용

  • 소프트웨어 사고방식이 현실을 알고리즘과 데이터베이스로 축소시키는 경향
  • 기술 전문가들이 현실을 맞추기보다 데이터베이스를 수정하려는 패턴
  • AI 산업이 데이터 수집을 위해 사람들의 삶을 데이터에 맞추려는 현상
  • 마케팅으로 해결되지 않는 세계관 불일치
  • 두 종류의 개발자(기술 투명화 기대 vs 회의)에 대한 관찰

:bookmark_tabs: 가벼운 읽을거리

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


DataAnnotations vs FluentValidation: 하나만 고집하지 말 것

  • DataAnnotations는 단순 속성 규칙과 Blazor 폼 검증, FluentValidation은 조건부·다중 속성 검증과 단위 테스트에 적합
  • 선택 기준: “한 속성으로 표현 가능하면 DataAnnotations, 조건문이 필요하면 FluentValidation”

.NET 메모리 관리, 추측 그만하기

  • 스택 vs 힙, 세대별 GC(Gen 0/1/2), 85KB 기준 SOH/LOH 분리와 단편화 위험
  • ArrayPool를 통한 메모리 풀링으로 반복 할당 제거

.NET에서 CRON과 RRule 표현식 평가하기

  • Meziantou.Framework.Scheduling 패키지로 CRON 5~7필드와 iCalendar RRule 파싱
  • L(월말), W(가장 가까운 평일), #(N번째 발생) 등 고급 CRON과 RFC 5545 RRule 비교

제한된 읽기를 가진 프로세스 간 RW 락 만들기, Part 1: 세마포어

  • 세마포어 기반 N개 동시 읽기 토큰과 모든 토큰을 획득하는 배타적 잠금 전략
  • 타임아웃 처리와 다중 토큰 대기 시 시간 관리, 부분 획득 토큰 반환

Enum에서 Union 타입으로

  • C# 15 preview의 Union 타입과 상속/enum 대비 폐쇄 집합·값 타입 의미론·nullable 추적의 차이
  • 직렬화 복잡성, 학습 곡선, preview 상태 등 도입 시 고려사항

C# 패턴 매칭: 몰랐던 고급 시나리오

  • 속성 패턴(중첩), 리스트 패턴, 위치 패턴, null 패턴 등 13가지 이상의 시나리오
  • 사용자 데이터 필터링·요청 처리 등 비즈니스 로직에 패턴 매칭 적용한 코드 예제
5 Likes