피드로 돌아가기
Wolverine + Marten: My random takes and updates
Dev.toDev.to
Backend

Compiled Query 및 Batched Query 도입으로 핫패스 성능 3배 개선

Wolverine + Marten: My random takes and updates

Tran Manh Hung2026년 5월 7일16intermediate

Context

Postgres JSONB 기반의 Marten과 Wolverine 스택을 활용한 CRUD 및 메시징 시스템 운영 과정에서 발생한 성능 병목 현상 분석. 특히 잦은 LINQ Expression Tree 파싱으로 인한 CPU 오버헤드와 다수의 데이터베이스 왕복(Round-trip)으로 인한 N+1 문제가 주요 제약 사항으로 작용.

Technical Solution

  • Expression Tree 파싱 비용 제거를 위해 hot path에 Compiled Query를 적용한 SQL 템플릿 캐싱 구조 설계
  • 유연한 쿼리 작성이 필요한 80%의 일반 케이스에는 Specification 패턴 기반의 Query Plan을 적용하여 재사용성 확보
  • IBatchedQuery 도입을 통해 독립적인 다수 데이터 로드 요청을 단일 왕복으로 통합하여 Network Latency 최소화
  • LoadAsync(Impure) -> Validate(Business Rule) -> Handle(Pure Function)로 이어지는 3단계 핸들러 분리를 통한 테스트 용이성 및 유지보수성 향상
  • [Entity] 및 [FromQuerySpecification] 속성을 활용하여 보일러플레이트 코드를 제거하고 인프라 수준에서 데이터 로딩 로직을 추상화

1. 빈번하게 호출되는 쿼리는 Compiled Query 도입을 검토하여 파싱 비용 제거

2. 다수의 독립적 데이터 로드가 필요한 핸들러는 Batch Query로 통합하여 Round-trip 최적화

3. 핸들러 설계를 '데이터 로드-검증-순수 로직 처리' 단계로 분리하여 Mock 없는 단위 테스트 환경 구축

4. 프레임워크가 생성한 실제 코드를 분석하여 추상화 레이어의 동작 방식과 오버헤드 파악

원문 읽기