[nest.js] IOC 와 DI(의존성 주입)

김민재·2024년 4월 22일

nest.js

목록 보기
8/63

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 동작 방식

    1. 클래스는 필요한 의존성을 명시적으로 정의
    2. DI 컨테이너 또는 IOC(Inversion of Control) 컨테이너는 이러한 의존성을 관리한다. 이 컨테이너는 필요한 의존성을 찾아서 인스턴스를 생성하고, 이를 요청한 클래스에 주입한다.
    3. 클래스는 직접적으로 의존성을 생성하거나 관리할 필요 없이 해당 의존성을 사용할 수 있게 해준다.
profile
개발 경험치 쌓는 곳

0개의 댓글