DI & IoC

클래스가 직접 만들던 의존성을 Nest 컨테이너가 대신 조립한다

UserControllernew UserService()를 직접 호출하면 결합이 강해진다. NestJS는 @Injectable() 프로바이더를 컨테이너에 등록하고 생성자에 필요한 인스턴스를 주입한다.

Provider Container Injection
등록 providers 배열과 @Injectable()로 알려준다
해결 생성자 타입을 보고 필요한 인스턴스를 찾는다
관리 기본적으로 싱글톤 생명주기로 공유한다

제어권이 클래스 내부에서 컨테이너로 이동한다

객체 생성 책임을 옮기면 교체와 테스트가 쉬운 구조가 된다.

Controller

필요한 타입만 선언

constructor(private service: UserService)처럼 의존성을 요청한다.

IoC Container

의존성 그래프 해결

등록된 프로바이더를 찾고 필요한 하위 의존성까지 함께 준비한다.

Provider

완성된 인스턴스 주입

컨트롤러는 생성 방법을 몰라도 서비스 기능을 사용할 수 있다.

DI의 이점은 구조가 커질수록 뚜렷해진다

직접 생성 코드를 줄이고, 관계를 한 곳에서 관리하게 해준다.

느슨한 결합

구현 교체가 필요해도 사용하는 클래스의 변경 범위가 작다.

테스트 용이성

실제 서비스 대신 mock provider를 넣어 단위 테스트를 분리한다.

생명주기 관리

컨테이너가 인스턴스 생성과 공유 범위를 일관되게 관리한다.