IoC container
NestJS는 객체 생성 권한을 컨테이너로 옮겨 결합도를 낮춘다
서비스와 컨트롤러가 직접 new로 서로를 만들지 않고, 모듈의 providers 등록 정보를 바탕으로 컨테이너가 인스턴스를 조립해 주입한다.
핵심 전환: new 호출 → provider token생성 위치를 숨기면 테스트와 교체가 쉬워진다.
전후 비교로 보는 핵심 차이
before직접 생성
Controller가 Service를 직접 만들면 생성자 인자와 구현 클래스에 묶인다.
const service = new UsersService(repo)after컨테이너 주입
@Injectable provider를 등록하면 필요한 곳에 같은 계약으로 주입된다.
constructor(private users: UsersService) {}컨테이너가 의존성을 조립하는 순서
1Module
providers 배열로 사용할 클래스를 등록한다.
2Token
클래스 또는 토큰을 기준으로 의존성 그래프를 만든다.
3Instance
필요한 시점에 생성하고 생명주기를 관리한다.
4Inject
컨트롤러와 서비스 생성자에 준비된 인스턴스를 넣는다.
A급으로 기억할 판단 기준
01교체 가능성
구현 클래스를 바꾸거나 mock을 넣어도 호출부 코드는 작게 흔들린다.
02책임 위치
객체 생성은 컨테이너, 비즈니스 로직은 서비스에 남긴다.
03테스트 기준
생성자 주입은 의존성을 밖에서 넣을 수 있어 단위 테스트가 단순해진다.