본문 바로가기

내일배움캠프 노드 4기/Today I Learned

[Nest.js] IoC와 DI

IoC (Inversion of Control) : 제어 역전

기존에는 어떤 서비스를 사용하고 싶으면 아래와 같은 코드를 직접 작성해야 했다.

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();
  }
  ...
}

 

어떤 객체를 사용하고 싶을 때 객체의 생성부터 소멸까지 직접 관리해야 하고 직접 생성 시 의존하는 서비스가 변경되면 그에 맞춰 코드를 수정해야 했다 ex)express

 

IoC는? 객체를 직접 생성하지 않고 객체의 생명주기 관리를 다른 곳(Nest.js IoC 컨테이너)에 위임한다.

객체의 제어권이 컨테이너로 넘어가기 때문에 IoC(제어 역전) 이라고 한다.

IoC는 모듈 간 결합도를 낮추기 때문에 하나의 모듈이 변경되어도 다른 모듈들에는 영향을 최소화되어 웹 어플리케이션을 지속 가능하고 확장성 있게 해줍니다!

 

IoC의 장점 

  • 개발자가 비즈니스 로직에 집중할 수 있다.

 

라이브러리와 프레임워크의 차이

  • 라이브러리
    • 제어권이 나에게 있다.
    • 내 코드가 필요할 때마다 내가 사용하고 싶은 라이브러리를 사용한다.
  • 프레임워크
    • 제어권이 프레임워크에 있다.
    • 나의 코드를 프레임워크가 필요로 하는 경우에 프레임워크가 알아서 실행시킨다.

DI (Dependency Injection) : 의존성 주입

IoC를 수행하는 방법중 하나로 객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입 시켜주는 방식이다.

Nest.js에서는 생성자를 통한 DI를 가장 기본적인 IoC 테크닉이라고 한다.

constructor(private readonly appService: AppService) {} // 얼마나 편하게요~