주말 아침 - 주간 닷넷 #12


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


:pushpin: Reflection과 Dynamic Methods를 사용하여 IEnumerable의 foreach를 할당 없이 만들기

  • 저자: Andrew Lock
  • 태그: #performance #allocation #reflection

주요 내용

  • IEnumerable의 foreach가 struct enumerator 박싱으로 힙 할당 발생
  • .NET 10의 “deabstraction” 기술로 할당 불필요화
  • Reflection.Emit과 DynamicMethod를 통한 구버전 .NET 솔루션 제시
  • .NET Framework, .NET 9, .NET 10 벤치마크 비교

:pushpin: winapp, Windows 앱 개발 CLI 발표

  • 저자: Nikola Metulev
  • 태그: windows #cli #tooling

주요 내용

  • init 명령으로 SDK 다운로드, projection 생성, 프로젝트 설정 자동화
  • 전체 패키징 없이 패키지 ID 추가로 빠른 디버깅 가능
  • appxmanifest.xml 및 자체 서명 인증서 자동 관리
  • Electron, .NET, C++/CMake, Rust 등 다중 프레임워크 지원

:pushpin: Redis Stack으로 실시간 시스템 아키텍팅

  • 저자: Sudhir Mangla
  • 태그: #redis #realtime #architecture

주요 내용

  • Redis Stack: JSON, Search, TimeSeries, Streams를 멀티모델 플랫폼으로 통합
  • RedisJSON과 Redis Search로 별도 문서 DB 없이 복잡한 엔티티 모델링
  • Redis Streams로 내구성 있는 순서화된 이벤트 로그와 소비자 그룹 제공
  • Sentinel/Cluster 토폴로지의 내구성, 고가용성, 확장 전략

:pushpin: C# 15+의 컬렉션 표현식 인자

  • 저자: Steven Giesel
  • 태그: #csharp15 #collections #proposal

주요 내용

  • 컬렉션 표현식 [2, 4, 6, 8] 구문에 생성자 인자 전달 기능 제안
  • 예시: List allNumbers = [args(capacity: 32), 0, ..evenNumbers, ..oddNumbers];
  • 용량이나 비교자 사전 지정으로 성능 최적화 가능
  • HashSet 예시: args(comparer: StringComparer.OrdinalIgnoreCase)

:pushpin: .NET 마이크로서비스에서 Transactional Outbox 패턴 구현: 최종 일관성 보장

https://towardsdev.com/implementing-transactional-outbox-pattern-in-net-microservices-ensuring-eventual-consistency-6bbc1c1d4830

  • 저자: Recep Serit
  • 태그: #microservices #outbox #eventualconsistency

주요 내용

  • “Dual-write 문제” 해결: DB 커밋 성공 후 메시지 발행 실패로 인한 데이터 불일치
  • 비즈니스 데이터와 메시지를 Outbox 테이블에 원자적 트랜잭션으로 저장
  • BackgroundService로 Outbox 테이블을 비동기 폴링하여 메시지 큐에 발행
  • Entity Framework, BackgroundService, RabbitMQ 패턴의 실용적 C# 구현 예제

:pushpin: C#/.NET에서 Zero Allocation 파서 만들기

https://jordansrowles.medium.com/building-zero-allocation-parsers-in-c-net-348ce6d124f1

  • 저자: Jordan Rowles
  • 태그: #performance #span #zeroallocation

주요 내용

  • 기존 문자열 파싱(Split, Substring)이 불필요한 힙 할당을 발생시켜 GC 부담 증가
  • Span와 ReadOnlySpan로 복사나 할당 없이 메모리 영역 참조
  • ref struct 타입은 스택에만 존재하며 컴파일 타임 안전성 보장
  • CSV/JSON 파싱 구현 예제: 약 2배 성능 향상과 제로 할당 달성

:pushpin: 잘못된 C# 컬렉션 선택이 코드를 서서히 망가뜨리는 이유

https://medium.com/@curiosity.orbit/why-choosing-the-wrong-c-collection-slowly-breaks-your-code-00ae2371611b

  • 저자: Curious Orbit
  • 태그: #collections #performance csharp

주요 내용

  • 컬렉션 선택(순서, 조회 속도, 중복, 동시성)이 성능 저하 방지의 핵심
  • List는 검색 중심 로직에 부적합, Dictionary는 O(1) 조회
  • HashSet는 설계상 유일성 보장, Queue/Stack은 행위 의도 표현
  • 읽기 전용/동시성 컬렉션으로 데이터 보호

:pushpin: 7가지 Entity Framework Core 최적화 기법

https://medium.com/@cankutukoglu03/7-entity-framework-core-optimization-techniques-7c1757ed2b47

  • 저자: Can Kutukoglu
  • 태그: #efcore #performance #optimization

주요 내용

  • N+1 쿼리 문제 해결: Projection과 Eager Loading 전략
  • Select()를 통한 선택적 쿼리로 메모리 오버헤드 감소
  • ExecuteUpdateAsync()를 활용한 대량 업데이트와 컨텍스트 동기화 관리
  • AsNoTracking()으로 읽기 전용 쿼리 성능 향상 (61.3% 개선 벤치마크)

:pushpin: 내가 첫 .NET 패키지를 만들고 500 다운로드를 얻은 방법

  • 저자: RecurPixel
  • 태그: #nuget #opensource #library

주요 내용

  • 반복되는 API 응답 메시지 불일치 문제 해결용 라이브러리 개발
  • 13개 메시지 카테고리, Fluent API, JSON/XML/콘솔 출력 지원
  • 문자열 캐싱으로 메모리 할당 28% 감소 최적화
  • “동작→최적화→리팩터링” 3단계 개발 접근법

:bookmark_tabs: 가벼운 읽을거리

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


.NET의 코드 커버리지에서 신뢰까지

  • 커버리지는 품질 지표가 아닌 측정 도구: 라인, 브랜치, 메서드 커버리지 개념
  • coverlet.runsettings 설정과 PowerShell 자동화 스크립트 제공

.NET에서 추상화 이해하기

  • 추상화는 "의도와 구현의 분리"이며 단순 기술적 기능이 아님
  • IOrderProcessor, BillingService, Repository 패턴으로 구체적 시연

C# 예외 처리: try-catch가 있어도 앱이 여전히 크래시되는 이유

  • 제네릭 Exception 캐치의 문제점: 버그 은닉과 시스템 상태 손상
  • ASP.NET Core 미들웨어를 통한 중앙 집중식 예외 처리 권장

진행 핸들러 연결을 위한 헬퍼 함수

  • Windows Runtime의 IAsyncActionWithProgress 인터페이스 ergonomic 개선
  • C++/WinRT, C++/CX, C#용 헬퍼 함수 제안

C#을 사용한 SGD 훈련으로 2차 회귀

  • 선형 회귀의 한계를 넘어 비선형 구조 데이터 처리
  • 제곱 항과 상호작용 항으로 복잡한 데이터 패턴 학습

dotnet 콘솔 마스터하기: 실용 가이드 및 프로젝트 챌린지

  • Models, Data, Business, Utilities 레이어로 계층화 아키텍처 시연
  • 학생 등록 시스템 참조 구현으로 역할 기반 접근 제어 구현

Pri.ProductivityExtensions.Source 소개

  • .NET Standard에서 최신 C# 기능(Range, Index 등) 사용 가능하게 하는 Source-only 패키지
  • 최신 .NET 버전과의 충돌 없이 호환성 문제 해결

최근 Wolverine 릴리스 따라잡기

  • Wolverine 5.5-5.11 릴리스: Saga 메시지 그룹화, EF Core 통합
  • GCP 구독, Redis 메시지 스케줄링, Azure SignalR 통합 추가

.NET vs Java 2026: 하나는 두뇌, 하나는 척추

  • Java는 대형 은행/기업 지배, .NET은 클라우드 네이티브 중심
  • AI 도구 숙련도로 2026년 양 분야 약 20% 급여 인상 가능
7개의 좋아요

winapp cli …이건 윈도우 개발자들의 매우 유익한 툴인 것 같군요…

오랜만에 또 물건 나온건가…

2개의 좋아요