피드로 돌아가기
I shipped a NuGet package, then rewrote it completely. Here's why.
Dev.toDev.to
Backend

FrozenDictionary를 Array 기반 O(1) 조회 구조로 개선한 Zero-allocation 설계

I shipped a NuGet package, then rewrote it completely. Here's why.

KitKeen2026년 4월 18일5intermediate

Context

분산된 마이크로서비스 간 MCC 코드 매핑 데이터 불일치 해결을 위해 공통 라이브러리 구축 필요성 대두. 초기 v1 버전의 FrozenDictionary 구조는 고처리량 트랜잭션 환경에서 잦은 문자열 할당 및 해시 연산으로 인한 성능 병목 발생.

Technical Solution

  • MCC 코드가 0-9999 범위의 정수라는 도메인 특성을 활용하여 Fixed-size Array 기반의 인덱스 직접 참조 구조 설계
  • ReadOnlySpan 전용 Custom Parser 구현을 통한 String 할당 제거 및 .NET Standard 2.0 호환성 확보
  • IMccLookup 인터페이스와 배열 복제 방식을 통한 원본 불변성 유지 및 팀별 Custom Mapping 확장성 제공
  • 카테고리별 역방향 조회를 위한 보조 인덱스(Secondary Index) 사전 구축으로 전체 스캔 비용 제거
  • int, string, ReadOnlySpan 세 가지 오버로드 제공으로 호출부 데이터 타입에 따른 최적 경로 최적화

1. 고성능 경로에서 문자열 파싱이 빈번하다면 ReadOnlySpan<char> 기반의 custom parser 검토

2. 입력 값의 범위(Range)가 제한적인 경우 Dictionary 대신 Array 기반의 Lookup Table 적용 고려

3. 라이브러리 설계 시 기본 설정의 불변성(Immutability)을 유지하면서 클론 기반의 확장 인터페이스 제공

원문 읽기