DI 컨테이너

IoC 컨테이너 token

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

01

등록

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

바인딩 지도
02

요청

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

metadata/reflection
03

생성

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

lifecycle
04

주입

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

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

설계 판단 기준

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