주말 아침 - 주간 닷넷 #17

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


:pushpin: .NET 11 프리뷰(.NET MAUI): 인라인 C# 표현식으로 XAML을 단순화하기

  • 저자: Sri Radhesh Nag Subash Sankar
  • 태그: #dotnet11 maui xaml binding

주요 내용

  • .NET 11 프리뷰에서 XAML 바인딩 안에 짧은 C# 표현식을 직접 쓸 수 있는 기능을 소개
  • Converter/표시용 ViewModel 프로퍼티로 처리하던 “표시용 로직(포맷팅/간단한 계산/조건)”을 XAML로 이동
  • XAML Source Generator 기반으로 빌드 타임 검증/소스 생성을 통해 타입 안전성과 성능을 노림
  • 사용 예(문자열 보간/조건/포맷)와 함께 “언제 쓰면/쓰면 안 되는지” 가이드를 제공(프리뷰 기능이라 주의 필요)

:pushpin: Windows 예약 파일명(CON, PRN, AUX, NUL…)

  • 저자: Gérald Barré
  • 태그: windows #filesystem #security dotnet

주요 내용

  • Windows에서 역사적 이유(DOS 장치명)로 예약된 파일명(CON/PRN/AUX/NUL, COM*, LPT*)을 정리
  • 대소문자/확장자 유무와 관계없이 예약되며, 일반적인 Win32 경로 파싱에서는 생성/접근이 실패함을 설명
  • 파일 시스템(NTFS 등) 자체 제약이 아니라 “Win32 API 경로 파싱 레이어”의 제약이라는 점을 짚음
  • WSL, \\?\ prefix 등 우회/차이를 통해 “환경에 따라 동작이 달라질 수 있음”을 보여줌

:pushpin: Mend Renovate가 C# 파일 기반 앱과 Cake.Sdk를 지원

  • 저자: Mattias Karlsson
  • 태그: #tooling #renovate csharp #dependencies

주요 내용

  • Renovate가 C# 파일 기반 앱의 #:sdk/#:package 지시문을 인식하도록 확장됨
  • Cake.Sdk의 C# 빌드 스크립트에서 InstallTool(s)로 설치하는 도구/패키지도 추출·업데이트 가능해짐
  • 기본값으로는 .cs를 스캔하지 않으므로 managerFilePatterns 설정이 필요함을 안내
  • Renovate 버전/PR 링크와 함께 renovate.json 설정 예시를 제공

:pushpin: 자주 쓰는 비동기 코얼레싱(요청 합치기) 패턴 5가지

https://itnext.io/5-common-async-coalescing-patterns-db7b1cac1507

  • 저자: Dmitry Tikhonov
  • 태그: async #concurrency csharp #performance

주요 내용

  • 동시 비동기 호출이 중복 작업/레이스/낭비로 이어지는 문제를 사례(UI 입력, 서버 중복 fetch)로 설명
  • 코얼레싱을 “겹치는 요청을 하나로 합치고 결과 전달 규칙을 명시”하는 접근으로 정의
  • 5가지 전략(Use First, Use Last, Debounce, Queue, Aggregate)을 소개하고 적용/트레이드오프를 비교
  • 전략을 라이브러리로 구현해 행동 규칙을 명시화하면 테스트/추론이 쉬워진다고 강조

:pushpin: 파일 업로드에서 경로 탐색(Path Traversal) 공격을 막기: 기술적 딥다이브

  • 저자: Trevoir Williams
  • 태그: #security aspnetcore #fileupload #pathtraversal

주요 내용

  • 파일 업로드에서 사용자 입력(파일명/경로)을 신뢰할 때 ../로 의도한 폴더 밖에 파일을 쓰는 path traversal 공격을 설명
  • 재현 시나리오로 업로드 디렉터리 탈출→프로젝트 다른 경로에 파일 생성까지 위험성을 구체화
  • 방어 핵심으로 “최소 권한(업로드 폴더에만 쓰기)”과 “사용자 파일명 폐기 + 서버 생성 파일명(GUID 등)”을 제안
  • Path.GetFullPath()로 정규화한 뒤 업로드 루트 하위인지 검사하는 “최종 안전 체크” 예시 코드를 제시

:pushpin: .NET 동기화 API (1): 프로세스 내부 동기화

  • 저자: Development With A Dot
  • 태그: dotnet #threading #concurrency #synchronization

주요 내용

  • in-proc 동기화의 목적(레이스/데이터 손상/데드락 방지)과 “락을 분류하는 기준”을 먼저 정리
  • lock 문이 Monitor 또는 .NET 8의 Lock 타입으로 매핑되는 동작까지 설명
  • Monitor, Mutex, Semaphore/SemaphoreSlim, ReaderWriterLock(Slim), SpinLock/SpinWait 등 주요 API를 비교
  • 타임아웃/락 계층/중첩 락 회피, async 선호 등 실전 가이드라인을 체크리스트로 제공

:pushpin: 원래 540만 msg/sec 괴물을 만들 생각은 없었는데…

  • 저자: dkw.io
  • 태그: dotnet #performance #pipelines #span

주요 내용

  • NMEA 문장 파서를 발전시키며 성능 최적화에 빠져드는 과정을 사례로 전개
  • 핵심은 할당을 0에 가깝게: 문자열 생성/부분 문자열/임시 버퍼/예외 기반 제어 흐름을 제거
  • ReadOnlySequence<byte>, Span<T>, 파이프라인(Pipelines) 기반 파싱으로 멀티 세그먼트 입력까지 고려
  • 벤치마크 결과(처리량 계산)를 통해 최적화가 어떤 수치로 이어지는지 보여줌

:pushpin: HTTP를 넘어서: 타이머/큐/블롭 트리거

https://medium.com/@martinoehlert/beyond-http-timer-queue-and-blob-triggers-80f8ebf0a775

  • 저자: Martin Oehlert
  • 태그: #azurefunctions #serverless dotnet #azure

주요 내용

  • Azure Functions에서 HTTP 트리거 이후의 대표 트리거(타이머/큐/블롭)를 “윈도 서비스/스케줄러 대체” 관점으로 소개
  • .NET 10 isolated worker 모델 기준으로 각 트리거의 패키지/코드 예시를 제공
  • 타이머 트리거의 6필드 CRON(NCrontab) 포맷과 TimerInfo, RunOnStartup 주의점을 정리
  • 큐/블롭 트리거의 at-least-once, 재시도/poison 메시지, idempotency 설계 등 운영 포인트를 강조

:pushpin: 성능 출혈을 멈춰라: 대규모 데이터셋에서 EF Core 최적화 가이드

https://medium.com/@mohamedkhaledshaqwieer/stop-bleeding-performance-the-ultimate-guide-to-ef-core-with-massive-datasets-98f6e8efde92

주요 내용

  • “EF Core가 생성하는 SQL을 이해하라”를 출발점으로 대용량에서 터지는 병목을 체계적으로 정리
  • 읽기 위주 쿼리에서 AsNoTracking()으로 트래킹 오버헤드를 줄이는 포인트를 강조
  • Contains + 대량 컬렉션으로 발생하는 SQL expansion 문제와 완화(배치/EF Core 8+ primitive collections 등)를 소개
  • Offset pagination 대신 keyset pagination을 권장하고, 대량 변경은 ExecuteUpdate/Delete(EF Core 7+) 등으로 완화하는 방향을 제시

:bookmark_tabs: 가벼운 읽을거리

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


매번 알림을 처음부터 연결하는 게 지겨워서 라이브러리를 만들었다

  • 이메일/SMS/푸시 등 알림 기능을 프로젝트마다 반복 구현하는 비용을 문제로 제시
  • 멀티 채널 병렬 전송, 조건(옵트아웃), 재시도(지수 백오프) 등을 포함한 모듈형 라이브러리 설계를 소개

비동기(async) 코드가 여전히 스레드를 막는 이유

  • async/await가 “스레드 0개”를 의미하지 않으며, 잘못 쓰면 스레드가 대기 상태로 묶일 수 있음을 설명
  • .Result/.Wait() 같은 sync-over-async가 병목/데드락/ThreadPool starvation로 이어질 수 있음을 경고

멍청하게 노는 것도 재미다: 아주 긴 예외 메시지를 만들어보자

  • 초대형 문자열(2GB 제한 근처)을 예외 메시지로 던질 때 Exception.ToString()이 실패하는 현상을 실험
  • 내부 구현 일부를 근거로 “왜 실패하는지”를 추적하며 런타임 제약을 체감하게 해줌

.NET 클린 아키텍처: 면접을 위해 쉽게 설명

  • “의존성은 안쪽으로”라는 핵심 원칙을 중심으로 클린 아키텍처를 빠르게 요약
  • ASP.NET Core + DB + 프론트 조합 예시로 계층 분리의 목적(테스트/교체 가능성)을 소개

C#에서 Builder 패턴 vs Fluent Interface: 핵심 차이

  • Builder(복잡한 객체를 단계적으로 구성)와 Fluent Interface(메서드 체이닝으로 읽기 쉬운 API) 목적 차이를 정리
  • “체이닝=Builder”로 혼동하기 쉬운 포인트를 비교 예시로 설명
3개의 좋아요

이건 가볍게 읽을 거리가 아닌 것 같습니다.

베타 버전이지만 한 번 사용을 해봐야 할 것 같네요.

2개의 좋아요