제어 역전

제어 역전의 원칙은 더 쉽게 재사용 가능한 코드를 빌드하거나 작성할 수 있다는 엔지니어링 개념

클래스 안에서 클래스 자체의 의존성을 생성해서는 안된다.

// Bad : MessageService가 내부에 MessagesRepository에 대한 의존성을 가짐.
export class MessagesService {
  messagesRepo : MessagesRepository;

  constructor () {
    this.messagesRepo = new MessageRepository 
  }
}
// Better : MessageService가 의존성 받도록 함.
export class MessagesService {
  messagesRepo : MessagesRepository;

  constructor ( repo : MessagesRepository) {
    this.messagesRepo = repo
  }
}
// Best : MessageRepository에 종속되어 있지 않고, Repository 인터페이스에 충족하는 객체를 제공하면 충족되도록 하였음.
interface Respository {
  findOne ( id : string );
  findAll();
  create(content : string);
}

export class MessagesService {
  messagesRepo : Repository;

  constructor ( repo : Repository) {
    this.messagesRepo = repo
  }
}

의존성 주입(Dependency Injection)

의존성 주입이 작동하는 데 있어 가장 핵심이 되는 것은 컨테이너이다.

다시한번 정리하면 다음과 같다.

제어의 역전 : 개발자가 제어할 영역을 프레임워크에 넘기는 것 의존성 주입 : 개발자가 필요한 외부 자원(클래스, 함수)을 제공받을 수 있도록 하는 것


리팩토링

// AS-IS
export class MessagesController {
 messagesRepo : MessagesRepository

 constructor(){
   this.messagesRepo = new MessagesRepository()
 }

 ...

// TO-BE
export class MessagesController {
 constructor(public messagesRepo : MessageRepository){}

public키워드를 이용하여 코드를 더 줄임


Injectable 데코레이터

import { Injectable } from 'next/common'

@Injectable()
export class MessageRepository {
  ...
}

의존성 주입의 대상임을 알려주는 데코레이터

주입할 Provider에 @Injectable을 붙이면 Nest IoC 컨테이너가 해당 프로바이더를 관리할 수 있다.

컨트롤러는 등록하지 않고, 일반적으로 우리가 만드는 서비스와 리포지토리를 등록한다.


Provider vs Service

Service : 제품 Provider : 공급자 Controller : 소비자

공급자가 제품을 제공해야, 소비자가 사용할 수 있듯이 Provicer가 Service를 등록해주어야 Controller에서 주입받아 사용이 가능하다.

모듈에 providers를 등록한다.

import { Module } from '@nestjs/common';
import { MessagesController } from './messages.controller';
import { MessagesService } from "./messages.service";
import { MessagesRepository } from "./messages.repository";

@Module({
  controllers: [MessagesController]
  providers : [MessagesService, MessagesRepository]
})
export class MessagesModule {

}

의존성 주입이 필요한 이유

애플리케이션을 테스트할 때 의존성 주입과 제어 역전을 사용하면 테스트하기가 용이해짐.

Last updated