Nest_의존성 주입

세현·2022년 11월 24일
0

공급자

공급자는 Nest의 기본 개념, 공급자의 주요 아이디어를 종속성으로 주입할 수 있다.
공급자는 모듈 providers에서 선언되는 클래스이다.

알면 좋다고 하는 3가지 선행 지식

  • 계층형 구조
  • 제어의 역전
  • 의존성 주입

계층형 구조는 엘리스 1차 프로젝트를 할때 경험해보았던 3계층으로 이해를 했다.

의존성 주입

Nest는 일반적으로 종속성 주입으로 알려진 강력한 디자인 패턴을 기반으로 구축

constructor(private catsService: CatsService) {}

위의 코드는 생성자 기반 종속성 주입이다.

다른 것도 한번 봐보자.
공식 문서의 DI 기초 내용을 보면 종속성 주입은 IoC 기술로 종속성의 인스턴스화를 자신의 코드에서 명령적으로 수행하는 대신 IoC 컨테이너에 위임한다. 어렵다.

nest의 프로젝트를 생성할 때 구조를 한 번 살펴보자.
main.ts와 모듈, 컨트롤러, 서비스등으로 구성한다.

먼저 공급자를 정의한다. @Injectable() 데코레이터로 클래스를 공급자라고 표시한다. => 서비스 파일에서 하는거임

@Injectable()
export class CatsService {

그 다음, 컨트롤러 파일에 설정한 공급자를 클래스에 주입한다.

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

마지막으로 모듈에서 providers에 공급자를 등록한다.

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})

이것이 의존성 주입을 하는 흐름이다.

제어의 역전

내가 하는 것 이니라 '프레임워크가 제어한다'이다.

  • 좋은 객체지향 설계는 구체적이기보다는 추상적 개념에 의존하는 것이다.
  • A클래스에서 B클래스를 불러오면 두 클래스 간의 의존성이 생김.
  • A클래스는 B클래스에 의존한다는 것이다. 이런것은 직접적이고 구체적으로 클래스를 인스턴스화하는 것이라서 바람직하지 않다.

이럴때 사용하는 것이 인터페이스다. 인터페이스를 구현하게 되면은 사용자는 내가 호출할 클래스가 무엇인지 정확하게 알 필요가 없다. 인터페이스에서 설정한 동작? 기능을 사용 가능하다는 사실만 알고 개발하면 된다.

의존성 주입은 제어의 역전 기술 중 하나다.

  • 제어의 역전 : 개발자가 제어해야할 영역을 프레임워크에게 믿고 맏기는 것
  • 의존성 주입 : 개발자가 필요한 자원(클래스,함수..)들을 외부에서 생성자를 통해 넣어준다.

컨트롤러의 생성자를 통해 의존성을 주입함으로써 모듈에게 해당 서비스를 위임하는 느낌이라고 생각을 한다.

정리

제어의 역전은 '나 말고 프레임워크가 제어할거야' 이면 의존성 주입은 프레임 워크가 '너가 필요한 클래스 등을 너 대신 내가 관리해줄게'이다. 어? 헷갈린다. 제어의 역전이 의존성 주입보다 더 큰 추상적인 개념이고, 이를 구현한게 DI, 의존성 주입이다. 이 DI를 통해 제어의 역전을 구현한 프레임워크가 Nest다.

참고 사이트

https://www.wisewiredbooks.com/nestjs/overview/04-provider.html
https://docs.nestjs.com/fundamentals/custom-providers#di-fundamentals

profile
안녕하세요

0개의 댓글