DI 컨테이너

IoC 컨테이너 token

DI는 객체가 의존성을 직접 만들지 않게 하고, 컨테이너는 provider 등록표를 바탕으로 token을 resolve하며 scope와 순환 의존성까지 관리한다.

01

등록

LoggerToken → ConsoleLogger처럼 token과 provider 구현을 모듈에 등록한다.

바인딩 지도
02

요청

OrderService 생성 시 constructor의 token 목록을 읽고 필요한 객체를 찾는다.

metadata/reflection
03

생성

의존성 그래프를 따라 하위 provider부터 만들고 scope 캐시에 저장한다.

수명 범위
04

주입

완성된 인스턴스를 생성자에 넣어 서비스가 구체 클래스 생성 코드를 몰라도 되게 한다.

DIP
누락 제공자
token에 대응되는 구현체가 없음 모듈 imports/exports 또는 등록 이름이 맞는지 확인한다.
런타임 resolve 오류
인터페이스 토큰
TypeScript interface는 런타임에 사라짐 Symbol, 문자열 token, abstract class 등 실제 값으로 등록해야 한다.
런타임 소거
순환 의존
A가 B를, B가 A를 요구 역할을 분리하거나 lazy/factory 주입으로 그래프 방향을 끊는다.
설계 냄새
잘못된 범위
상태 있는 객체를 singleton으로 공유 request 사용자 상태와 전역 캐시를 같은 수명으로 두면 데이터가 섞인다.
범위 점검

설계 판단 기준

테스트 교체 실제 DB/HTTP client 대신 fake provider를 등록해 서비스 테스트가 독립적으로 돌아가야 한다.
생성 책임 new가 도메인 서비스 곳곳에 퍼지면 컨테이너 밖 생성 책임이 새고 있는 것이다.
그래프 가시성 모듈 경계에서 어떤 provider를 공개하고 숨기는지 export/import로 드러나야 한다.