주말 아침 - 주간 닷넷 #10

주말 아침 - 주간 닷넷

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


:pushpin: C#가 2025년 TIOBE 올해의 언어

  • 저자: Mike James
  • 태그: #tiobe csharp #industry

주요 내용

  • C#가 연간 순위 상승률(2.94%) 1위로 2025년 TIOBE 올해의 언어 수상
  • Python은 역대 최고 점수(26.98%) 도달했으나 4.37% 하락
  • C#는 현재 5위지만 추세 지속 시 Java(2위) 추월 가능성
  • C#의 오픈소스 활성화와 Java의 Oracle 통제로 순위 역전 가능성

:pushpin: C# .NET Channels: 고성능 동시성 파이프라인 구축하기

https://medium.com/@ashwinbalasubramaniam92/channels-in-c-net-building-high-performance-concurrent-pipelines-4d0e5c7017c3

  • 저자: Ashwinbalasubramaniam
  • 태그: #channels #concurrent #performance

주요 내용

  • System.Threading.Channels로 락 없이 Thread-safe 비동기 파이프라인 구현
  • 유계 채널(Bounded Channel)로 백프레셔 지원하여 시스템 과부하 방지
  • ChannelWriter/Reader 분리로 생산자와 소비자 역할 명확화
  • ASP.NET Core 등 .NET 런타임 내부에서 기본 구성요소로 활용

:pushpin: .NET의 실전 플러그인 시스템: AssemblyLoadContext, 언로드, 리플렉션 없는 검색

https://jordansrowles.medium.com/real-plugin-systems-in-net-assemblyloadcontext-unloadability-and-reflection-free-discovery-81f920■■3644

  • 저자: Jordan Rowles
  • 태그: #plugin #assemblyloadcontext #architecture

주요 내용

  • 계약 인터페이스는 기본 ALC에, 플러그인은 수집 가능한 별도 ALC에 로드
  • Shadow Copying으로 원본 파일 잠금 방지
  • System.Reflection.Metadata로 어셈블리 로드 없이 메타데이터 검색
  • WeakReference를 통한 강제 GC 테스트로 언로드 검증

:pushpin: 분당 50,000건 삽입 요청에 허덕이던 데이터베이스를 해결한 방법

https://elanchezhiyan-p.medium.com/our-database-was-drowning-in-50-000-insert-requests-per-minute-heres-how-we-fixed-it-46a1b2768cd1

  • 저자: Elanchezhiyan P
  • 태그: #performance #efcore #hilo

주요 내용

  • 자동증가 ID로 인한 각 삽입마다 데이터베이스 왕복 문제
  • HiLo 알고리즘으로 ID 블록을 미리 받아 메모리에서 로컬 생성
  • 127초에서 14초로 88% 성능 개선, DB CPU 80%에서 25%로 감소
  • Entity Framework Core의 .UseHiLo() 메서드로 간단 설정

:pushpin: StructQueue: 복사 없이, 가비지 없이 빠른 C# 큐

https://medium.com/@robertvanherk/structqueue-t-lightning-fast-c-queues-no-copies-no-garbage-77476e6c9f53

  • 저자: Robert van Herk
  • 태그: #performance #datastructure #concurrent

주요 내용

  • 핸들 기반 참조 접근으로 Enqueue/Dequeue 시 값 복사 제거
  • Free, Enqueued, Dequeued 세 가지 상태로 생명주기 관리
  • Interlocked.CompareExchange 활용 CAS 루프 동시성 처리
  • NuGet 패키지(CounterpointCollective.CoalescingQueue)로 제공

:pushpin: C# 14 개선된 람다 표현식: 고성능 코드를 위한 ref, in, out 매개변수 사용

  • 저자: Raghunath B
  • 태그: #csharp14 #lambda #performance

주요 내용

  • ref는 읽기/쓰기 가능한 참조, in은 읽기 전용 참조, out은 반드시 할당해야 하는 참조
  • 큰 구조체의 불필요한 복사를 피하여 성능 개선
  • 로컬 함수나 커스텀 델리게이트 없이 간단한 구문으로 표현
  • 메서드와 람다의 동작 일관성 확보

:pushpin: ORM의 “혼합 모드 연산” 안티패턴

https://medium.com/@atakanserbes/the-mixed-mode-operations-anti-pattern-in-orms-d2cb263a308b

  • 저자: Atakan Serbes
  • 태그: #orm #efcore #antipattern

주요 내용

  • Change Tracker와 직접 SQL 실행 혼용 시 동기화 문제 발생
  • BulkDelete 후 객체 업데이트 시도 시 추적 중인 삭제된 행으로 인한 실패
  • 관련 작업에서 동일한 지속성 방식 선택 권장
  • Entity Framework, Hibernate, Django ORM 등 모든 ORM에서 발생 가능

:pushpin: C#에서 SQL과 NoSQL 분산 트랜잭션 문제 이해하기 — Transactional Outbox 패턴

https://medium.com/@rserit/understanding-sql-and-nosql-distributed-transaction-problem-in-c-transactional-outbox-pattern-69ded2dad63c

  • 저자: Recep Serit
  • 태그: #distributedtransaction #outboxpattern #microservices

주요 내용

  • NoSQL은 System.Transactions와 통합되지 않아 SQL과 단일 트랜잭션 불가
  • SQL 커밋 성공 후 NoSQL 실패 시 롤백 불가능한 Dual-Write 문제
  • Outbox Pattern으로 외부 시스템 전송 데이터를 동일 트랜잭션 내 별도 테이블에 기록
  • 최종 일관성(Eventual Consistency)으로 데이터가 수 초 내 도착 보장

:pushpin: NetEscapades.EnumGenerators 업데이트: 새로운 API와 System.Memory 지원

  • 저자: Andrew Lock
  • 태그: #sourcegenerator #enum #performance

주요 내용

  • 생성된 ToStringFast() 메서드가 네이티브 ToString()보다 0.005ns vs 6.4ns로 성능 우위
  • EnumParseOptionsSerializationOptions 구조체로 옵션 기반 API 설계 도입
  • SerializationTransform 열거형으로 컴파일 타임 대소문자 변환 지원
  • .NET Standard 2.0/Framework에서 System.Memory 폴리필을 통한 ReadOnlySpan<char> API 지원

:pushpin: C# – F# 상호운용 (2026년판)

주요 내용

  • F#에서 C# 호출이 훨씬 간단하며, 역방향은 추가 노력 필요
  • F# 레코드는 C#에서 네이티브처럼 작동하지만 판별된 합집합은 패턴 매칭 시 when 구문 필요
  • FSharpx와 FsToolkit.ErrorHandling으로 리스트, 함수, 옵션 변환 간편화
  • Extension 속성으로 C#용 확장 메서드 정의하여 가독성 향상

:pushpin: .NET에서 커스텀 LINQ Provider 구축하기

https://jordansrowles.medium.com/building-a-custom-linq-provider-in-net-a987dc983381

  • 저자: Jordan Rowles
  • 태그: linq #expressiontree #architecture

주요 내용

  • 식 트리(Expression Tree) 기반 LINQ 아키텍처의 작동 원리 설명
  • IQueryable<T>, IQueryProvider, Expression 핵심 인터페이스 구현 방법
  • ExpressionVisitor 패턴을 활용한 식 트리 재귀적 순회 및 변환
  • 식 트리 변환 단위 테스트와 통합 테스트 전략 제시

:pushpin: 마이크로서비스에서 Clean Architecture가 정말 필요한 때는?

https://rahulsahay19.medium.com/when-do-you-actually-need-clean-architecture-in-microservices-70dae4fdff6b

  • 저자: Rahul Sahay
  • 태그: #cleanarchitecture #microservices #architecture

주요 내용

  • "현재 어떤 문제를 해결하려는가"가 핵심 질문, 무조건적 Clean Architecture 적용은 비효율적
  • 초기 단계에서는 REST 기반, API Gateway, RabbitMQ, Saga 패턴으로 충분
  • 비즈니스 규칙 변화, 테스트 어려움, 다중 팀 협업 시 Clean Architecture 전환 추진
  • 도메인, 애플리케이션, 인프라의 명확한 분리로 장기적 유지보수성 확보

:pushpin: XAML Studio 오픈소스 공개

  • 저자: Michael Hawker (XAML Llama)
  • 태그: xaml #winui #opensource

주요 내용

  • WinUI 개발자용 도구 XAML Studio가 8년 만에 오픈소스 공개
  • SwitchPresenter 컨트롤이 Windows Community Toolkit 7.0에 통합
  • WPF의 Adorner 패턴을 WinUI에 구현하여 고급 에디터 시각화 가능
  • Version 2 개발 진행 중, 올해 안에 Microsoft Store 공식 배포 예정

:bookmark_tabs: 가벼운 읽을거리

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


C#의 타입 안전 컬렉션: NonEmptyList로 런타임 예외 제거하기

  • 컴파일러가 비어있지 않은 컬렉션을 타입 시스템으로 보장
  • Map, FlatMap, Reduce 등 함수형 메서드로 안전한 변환

C# Records: 조용히 코드 작성 방식을 바꾼 기능

  • 값 기반 동등성과 기본 불변성으로 사이드 이펙트 버그 방지
  • with 표현식으로 특정 속성만 변경한 새로운 객체 생성

.NET에서 TDD: 안티패턴과 TDD를 사용하지 말아야 할 때

  • 구현이 아닌 동작 중심 테스트, 100%보다 70-80% 품질 높은 커버리지 추구
  • 프로토타입, UI, 레거시 코드에서는 TDD 부적절

.NET에서 Memento 패턴, Command 패턴, Domain Events 활용하기

  • 실행 취소/다시 실행 시스템 구축을 위한 고급 패턴 조합
  • Event Sourcing 통합으로 시간 기반 쿼리 지원

C#에서 Strategy vs Factory: 실제 시스템을 망가뜨리는 혼란

  • Factory는 객체 생성 방식 결정, Strategy는 행동 방식 결정
  • 두 패턴 조합으로 기존 코드 수정 없이 새 조건 대응

RFC 6570: .NET에서 API 발견성을 위한 URI 템플릿

  • RFC 6570 URI 템플릿 규격의 4단계 문법 레벨 설명
  • HATEOAS 구현에 유용한 표준 규격

EF Core 모델 DbContext, OnModelCreating, 그리고 캐싱의 진실

  • 모델은 DbContext 인스턴스화 시가 아니라 처음 필요할 때 생성(지연 생성)
  • 새로운 DbContext 객체 생성 시에도 동일한 캐시된 모델 공유

내가 바랐던 방식으로 설명하는 SOLID 원칙

  • C# 코드 예제와 함께 실용적인 SOLID 원칙 설명
  • SOLID는 도구이며 과도한 적용보다 문제 상황 이해가 중요

Clean Architecture는 애플리케이션 코드 조직화에 효과적인 접근법

  • 의존성 규칙: 소스 코드 의존성은 안쪽을 향해서만 지향
  • Entities → Use Cases → Interface Adapters → Frameworks & Drivers 4계층 구조

C# 인터페이스 이해하기: 왜 기본 인터페이스 구현이 추상 클래스와 함께 존재하는가

  • C# 8에서 인터페이스가 선택적 메서드 본문 포함 가능
  • NuGet 패키지, 마이크로서비스에서 안전한 진화(gradual migration) 가능
6 Likes