피드로 돌아가기
Dev.toBackend
원문 읽기
AsyncLocal 기반 Ambient Holder로 DB 쿼리 최소화 및 Identity 지연 해결
Two resolvers, four entry points
AI 요약
Context
Handler 진입 전 Identity와 Principal을 해결해야 하는 제약 사항 존재. 특히 Wolverine의 자동 트랜잭션 및 cross-module DbContext 이슈로 인해 트랜잭션 시작 전 모든 인증 정보가 확정되어야 하는 아키텍처적 한계 발생.
Technical Solution
- AsyncLocal 기반의 Singleton Ambient Holder를 구축하여 HTTP 요청, 백그라운드 잡, 메시지 핸들러 등 다양한 실행 컨텍스트에 유연하게 대응
- Runtime Memoization 기법을 적용한 Resolve-Check-Store 패턴으로 단일 컨텍스트 내 중복 쿼리 발생을 원천 차단
- Identity와 Principal Resolver의 계층 구조 설계를 통해 AnonymousIdentity 및 SystemIdentity는 메모리 내 즉시 생성하고 UserIdentity만 DB 조회를 수행하는 선택적 로직 구현
- Bootstrap-time Selectivity를 도입하여 IIdentity를 요구하지 않는 Handler에는 Resolver 미들웨어를 바인딩하지 않는 최적화 적용
- HTTP 경로의 경우 ClaimsPrincipal을 내부 Identity로 변환하는 Lazy Provisioning 구조를 통해 첫 인증 요청 시점에 사용자 등록 및 조회를 동시 처리
- Push(시스템 컨텍스트)와 Pull(사용자 컨텍스트) 전략을 통합하여 Handler는 내부 구현과 무관하게 Parameter로 인증 정보를 전달받는 추상화 달성
실천 포인트
1. DB 트랜잭션 시작 전 외부 의존성(Identity 등)의 해결 여부를 확인했는가?
2. 모든 요청에 동일한 인증 로직을 적용하는 대신, Role/Type에 따른 조건부 DB 조회 로직을 구현했는가?
3. AsyncLocal 사용 시 중첩 컨텍스트에서도 안전하게 이전 상태를 복구하는 IDisposable 패턴을 적용했는가?
4. 불필요한 미들웨어 실행을 방지하기 위해 Handler의 의존성 선언 기반의 선택적 바인딩을 검토했는가?