피드로 돌아가기
Singleton, Scoped, and Transient: What They Actually Mean for Your DbContext
Dev.toDev.to
Backend

DbContext 수명 주기 설계를 통한 Thread-safety 및 상태 격리 확보

Singleton, Scoped, and Transient: What They Actually Mean for Your DbContext

Alimur Razi Rana2026년 6월 24일12intermediate

Context

.NET Dependency Injection 환경에서 DbContext의 Lifetime 설정에 따른 객체 공유 범위와 동작 방식의 차이를 분석함. 잘못된 수명 주기 선택 시 멀티스레드 환경에서 데이터 충돌 및 상태 오염이 발생하는 아키텍처적 결함을 다룸.

Technical Solution

  • Singleton 적용 시 앱 전체에서 단일 인스턴스를 공유하여 Thread-safe하지 않은 DbContext의 특성상 InvalidOperationException 유발 가능성 확인
  • Scoped 설정을 통해 HTTP Request 단위로 인스턴스를 격리함으로써 요청 간 상태 공유를 차단하고 독립적인 Unit of Work 보장
  • Transient 설정을 통해 요청 내에서도 매번 새로운 인스턴스를 생성하여 서비스 간 상태 간섭을 원천적으로 방지하는 구조 설계
  • EF Core의 Change Tracker가 Scoped 범위 내에서만 유지되도록 설계하여 메모리 누수 방지 및 데이터 일관성 유지
  • 객체의 내부 상태 유지 여부와 공유 범위에 따른 Lifetime 결정 매트릭스 구축

1. DbContext 등록 시 AddScoped를 기본으로 사용하여 Thread-safety 이슈를 방지했는가?

2. 서비스 간 Unit of Work 공유가 필요한 경우 동일한 Scope 내에서 인스턴스를 공유하도록 설계했는가?

3. 상태를 가지지 않는 무상태(Stateless) 서비스의 경우 리소스 최적화를 위해 AddSingleton 검토가 이루어졌는가?

4. 독립적인 작업 결과가 필요한 빌더 클래스에 AddTransient를 적용하여 데이터 오염 가능성을 제거했는가?

원문 읽기