IOC와 DI
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
// 1. 사용하고 싶은 서비스 타입 객체를 미리 선언합니다.
private appService: AppService
constructor() {
// 2. 생성자에서 실제로 사용할 서비스 객체를 직접 생성합니다.
this.appService = new AppService();
}
...
}
this.appService = new AppService();
위와 같이 직접 객체를 생성하면, AppController는 AppService의 구체적인 구현에 강하게 속한다.
즉, 의존하는 서비스가 변경되면 개발자도 그에 맞추어서 코드를 수정해야 한다.
IoC(제어 역전)
1) IoC는 개발자가 사용하고 싶은 객체를 직접 생성하는 것이 아니라 객체의 생명주기 관리 자체를 외부에 위임을 한다.
2) IoC 원칙은 모듈 간 결합도를 낮추기 때문에 하나의 모듈이 변경되어도 다른 모듈들에는 영향을 최소화되어 웹 어플리케이션을 지속 가능하고 확장성 있게 해줍니다.
Dependency Injection(의존성 주입)
코드에서 appService의 인스턴스는 appController에서 생성하는 것이 아닌 nestjs의 프레임워크에 의해 생성되어 컨트롤러에 주입된다.
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
// 밑이 의존성 주입(DI)
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
소프트웨어 엔지니어링 디자인 패턴 중 하나이다.
특정 클래스가 의존하고 있는 다른 클래스나 컴포넌트를 직접 만들지 않고, 외부에서 주입 받아 사용하는 방식이다.
모듈 간의 높은 결합도를 줄이고, 유연성과 재사용성을 높이고자 나온 패턴
DI 동작 방식