@Injectable()과 providers 배열로 주입 가능한 클래스를 등록한다.
객체 생성 책임이 클래스에서 컨테이너로 이동한다
컨트롤러가 new UserService()를 직접 호출하면 생성 방식과 구현체에 묶입니다. NestJS는 provider를 컨테이너에 등록하고 생성자에 필요한 인스턴스를 주입합니다.
DI 컨테이너가 하는 일
ordered steps생성자 타입을 보고 필요한 provider와 하위 의존성을 찾는다.
수명 주기 규칙에 맞춰 인스턴스를 만들거나 기존 인스턴스를 재사용한다.
컨트롤러는 생성 방식을 몰라도 완성된 서비스를 받는다.
직접 생성과 주입의 차이
matrix| 기준 | 직접 생성 | 생성자 주입 |
|---|---|---|
| 결합도 | 사용 클래스가 구현체와 생성 방식을 안다 | 필요 타입만 선언하고 컨테이너가 연결한다 |
| 테스트 | 실제 구현을 떼어내기 어렵다 | mock provider로 테스트 범위를 줄인다 |
| 변경 | 생성자 변경이 호출자에게 퍼진다 | 등록과 토큰 변경으로 흡수한다 |
IoC의 핵심 감각
checkpoints누가 만들지 결정하는 권한이 클래스 내부에서 Nest 컨테이너로 넘어간다.
컨테이너는 provider 사이의 의존 관계를 그래프로 보고 순서대로 해결한다.
싱글톤, 요청 스코프 같은 공유 범위를 한 곳에서 관리한다.