IoC는 Inversion of Control의 준말로서 제어 역전이라고도 한다.
IoC는 개발자가 사용하고 싶은 객체를 직접 생성하는 것이 아니라 객체의 생명주기 관리 자체를 외부(여기서는 Nest.js IoC 컨테이너)에 위임을 합니다!
즉, 객체의 관리를 컨테이너에 맡겨서 제어권이 넘어갔기 때문에 IoC(제어 역전)라고 하는 것
this.appService = new AppService();
위와 같이 직접 객체를 생성하면, AppController는 AppService의 구체적인 구현에 강하게 결합된다 즉, 의존하는 서비스가 변경되면 개발자도 그에 맞추어서 코드를 수정해야 됨
(자주 변경되는 서비스가 있다면 개발자는 계속 코딩해야된다는 번거로움이 생김!)
IoC 원칙은 모듈 간 결합도를 낮추기 때문에 하나의 모듈이 변경되어도 다른 모듈들에는 영향을 최소화되어 웹 어플리케이션을 지속 가능하고 확장성 있게 해준다!
constructor(private readonly appService: AppService) {}
위 코드에서 AppService의 인스턴스는 Nest.js의 DI 컨테이너에 의해 생성되고 관리됩니다.
따라서, 개발자는 직접 new AppService()와 같이 객체를 생성하거나 관리할 필요가 없음. 이것은 코드의 결합도를 낮추고, 유연성과 테스트 용이성을 향상시킵니다!