제어의 역전 #

제어의 역전은 보통 의존성을 다루는 주체가 역전된 것을 가리킵니다.

의존성이란 어떤 객체가 다른 객체에 의존하는 것을 의미합니다. 객체지향에서 이 패턴이 두드러지게 나타나는데요

부모 자식간의 관계에서 자식은 부모에 의존합니다.

자식 클래스는 부모 클레스에 의존하죠.

부모 클래스를 extend한 자식클래스는 부모 클래스를 항상 명시해야합니다.

class Children extends Parent {
    constructor(){
        super();
        this.house = new House();
    }
}

생성자 함수 내에서 House 클래스를 생성해 사용해도 이는 의존적이라 할 수 있습니다.

보통 이를 하나씩 생성하는 주체가 개발자이지만 프레임워크에 맡기는 경우 제어가 역전되었다고 합니다.

nest.js에서 사용하는 방법 #

nest에서는 @Injectable 데코레이터를 사용해 IOC를 구현합니다. 해당 데코레이터가 붙은 클래스는 이제 nest.js에서 생성과 소멸을 관리합니다.

보통 controller 클래스는 service 클래스를 사용합니다.

service 클래스에 @Injectable를 붙이고, 다른 클래스에 주입해 사용하는 클래스가 만들어졌습니다.

해당 클래스는 모듈 클래스(@Module 데코레이터가 붙은)의 프로바이더 설정에 추가해주면 됩니다.

이제 constructor에서 아래와 같이 써줍니다.

@Injectable()
export class GoodService(){}

@Injectable()
export class GoodRepository(){}

export class GoodController(){
    constructor(private goodService: GoodService){}
}

@Module({
    imports: [],
    controllers: [GoodController],
    provider: [GoodService, GoodRepository] // nest.js의 컨테이너에 Injectable 할 class들을 명시해줌
})
export class GoodModule{}