DI and IoC

객체 생성 책임이 클래스에서 컨테이너로 이동한다

컨트롤러가 new UserService()를 직접 호출하면 생성 방식과 구현체에 묶입니다. NestJS는 provider를 컨테이너에 등록하고 생성자에 필요한 인스턴스를 주입합니다.

DI 컨테이너가 하는 일

ordered steps
1 Register

@Injectable()과 providers 배열로 주입 가능한 클래스를 등록한다.

2 Resolve

생성자 타입을 보고 필요한 provider와 하위 의존성을 찾는다.

3 Create

수명 주기 규칙에 맞춰 인스턴스를 만들거나 기존 인스턴스를 재사용한다.

4 Inject

컨트롤러는 생성 방식을 몰라도 완성된 서비스를 받는다.

직접 생성과 주입의 차이

matrix
기준직접 생성생성자 주입
결합도사용 클래스가 구현체와 생성 방식을 안다필요 타입만 선언하고 컨테이너가 연결한다
테스트실제 구현을 떼어내기 어렵다mock provider로 테스트 범위를 줄인다
변경생성자 변경이 호출자에게 퍼진다등록과 토큰 변경으로 흡수한다

IoC의 핵심 감각

checkpoints
제어권

누가 만들지 결정하는 권한이 클래스 내부에서 Nest 컨테이너로 넘어간다.

그래프

컨테이너는 provider 사이의 의존 관계를 그래프로 보고 순서대로 해결한다.

수명

싱글톤, 요청 스코프 같은 공유 범위를 한 곳에서 관리한다.