피드로 돌아가기
Dev.toBackend
원문 읽기
Dependency Injection를 통한 .NET 객체 생명주기 제어 및 결합도 해소
Mastering Dependency Injection in .NET: A Software Engineer's Secret Weapon
AI 요약
Context
클래스 내부에서 의존성을 직접 생성하는 Tight Coupling 구조로 인한 변경 취약성 노출. 특정 구현체에 종속된 설계로 인해 단위 테스트 수행 시 Mock 객체 활용이 불가능한 제약 발생.
Technical Solution
- Inversion of Control(IoC) 원칙을 적용하여 객체 생성 제어권을 프레임워크로 이전
- Interface 기반의 추상화 레이어를 도입하여 구현체 교체 가능성을 확보한 유연한 구조 설계
- Transient: 요청마다 신규 인스턴스를 생성하는 Stateless 서비스 최적화
- Scoped: HTTP 요청 단위로 인스턴스를 공유하여 DbContext 등의 상태 일관성 유지
- Singleton: 애플리케이션 전 생애주기 동안 단일 인스턴스를 유지하여 캐싱 및 설정 공유 효율화
- Captive Dependency 방지를 위해 Singleton 서비스 내 Scoped 서비스 주입을 제한하는 생명주기 격리 전략 적용
실천 포인트
1. 클래스 설계 시 new 키워드 대신 생성자 주입(Constructor Injection) 검토
2. 서비스 특성에 따라 Transient, Scoped, Singleton 중 적절한 Lifetime 선택
3. Singleton 서비스에 Scoped 서비스를 주입하여 발생하는 메모리 누수 및 DB 연결 버그 유무 확인
4. 테스트 코드 작성 시 Interface를 통한 Mocking 가능 여부 검증