HooneyLog

의존성 주입과 IoC컨테이너

프로필 이미지

Seunghoon Shin

2024년 12월 20일 12:17

의존성 주입과 IoC 컨테이너

Nest.js에서 의존성 주입과 IoC 컨테이너는 애플리케이션의 모듈 간 의존성을 효율적으로 관리하기 위한 핵심 개념입니다. 이를 이해하려면 각각의 정의와 역할을 알아볼 필요가 있습니다.

1. 의존성 주입

정의

의존성 주입은 객체 간의 의존성을 외부에서 주입받는 방식으로 관리하는 디자인 패턴입니다.

일반적으로 객체는 스스로 필요한 의존성을 생성하거나 찾는 대신, 외부에서 제공받습니다.

장점

  • 결합도 감소: 객체가 의존성을 직접 생성하지 않으므로 모듈 간의 결합도가 낮아집니다.
  • 테스트 용이성: Mock 객체를 쉽게 주입할 수 있어 유닛 테스트가 간단해집니다.
  • 유지보수성 향상: 의존성을 중앙에서 관리하므로 코드 변경이 적은 부분에 영향을 미칩니다.
  • 예제

    의존성 주입 없이

    class ServiceA {
      sayHello() {
        return 'Hello from ServiceA';
      }
    }
    
    class Consumer {
      private service: ServiceA;
    
      constructor() {
        this.service = new ServiceA(); // 직접 의존성을 생성
      }
    
      useService() {
        return this.service.sayHello();
      }
    }
    
  • 위 코드에서는 ConsumerServiceA의 의존성을 직접 생성합니다. 이런 방식은 결합도가 높아져 테스트나 유지보수가 어렵습니다.
  • 의존성 주입을 사용한 코드

    class ServiceA {
      sayHello() {
        return 'Hello from ServiceA';
      }
    }
    
    class Consumer {
      constructor(private service: ServiceA) {} // 의존성을 외부에서 주입받음
    
      useService() {
        return this.service.sayHello();
      }
    }
    
    // 의존성을 주입
    const serviceA = new ServiceA();
    const consumer = new Consumer(serviceA);
    console.log(consumer.useService());
    
  • ConsumerServiceA에 직접 의존하지 않고 외부에서 주입받습니다.

  • 2. IoC 컨테이너

    정의

    IoC 컨테이너는 애플리케이션의 객체 생성 및 의존성 관리를 담당하는 컴포넌트입니다.

    컨테이너는 객체를 직접 생성하고 필요한 의존성을 주입합니다.

    Nest.js에서 IoC 컨테이너의 역할

    Nest.js는 IoC 컨테이너를 사용하여:

  • 객체(서비스, 컨트롤러 등)를 생성합니다.
  • 객체 간 의존성을 자동으로 주입합니다.
  • 객체의 생명주기를 관리합니다.
  • 작동 방식

  • @Injectable() 데코레이터 사용:
  • 의존성 등록:
  • 예제

    import { Injectable } from '@nestjs/common';
    
    @Injectable()
    export class ServiceA {
      sayHello() {
        return 'Hello from ServiceA';
      }
    }
    
    import { Injectable } from '@nestjs/common';
    import { ServiceA } from './service-a';
    
    @Injectable()
    export class Consumer {
      constructor(private readonly serviceA: ServiceA) {} // 의존성을 IoC 컨테이너에서 주입받음
    
      useService() {
        return this.serviceA.sayHello();
      }
    }
    
  • ServiceAConsumer는 모두 @Injectable()로 IoC 컨테이너에 등록되었습니다.
  • Nest.js는 IoC 컨테이너를 통해 ConsumerServiceA를 자동으로 주입합니다.

  • IoC와 DI의 관계

  • DI는 IoC의 구현 방식 중 하나입니다.
  • IoC는 객체의 생성 및 관리 권한을 개발자가 아닌 컨테이너에 위임하는 개념입니다.
  • DI는 IoC 컨테이너가 객체 간 의존성을 주입하는 방식입니다.

  • 요약

  • DI (의존성 주입):
  • IoC 컨테이너: