HooneyLog
© 2026 Seunghoon Shin. All rights reserved.
모든 게시글
nest.js
2024. 12. 20.•
2

의존성 주입과 IoC컨테이너

Seunghoon Shin
작성자 Seunghoon Shin풀스택 개발자

의존성 주입과 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(); } }
  • 위 코드에서는 Consumer가 ServiceA의 의존성을 직접 생성합니다. 이런 방식은 결합도가 높아져 테스트나 유지보수가 어렵습니다.

의존성 주입을 사용한 코드

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());
  • Consumer는 ServiceA에 직접 의존하지 않고 외부에서 주입받습니다.

2. IoC 컨테이너

정의

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

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

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

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

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

작동 방식

  1. @Injectable() 데코레이터 사용:

    Nest.js에서 @Injectable() 데코레이터를 붙이면 IoC 컨테이너가 해당 클래스를 관리하고 의존성을 주입할 수 있도록 만듭니다.

  2. 의존성 등록:

    각 모듈의 providers에 의존성을 등록하면 IoC 컨테이너가 이를 관리합니다.

예제

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(); } }
  • ServiceA와 Consumer는 모두 @Injectable()로 IoC 컨테이너에 등록되었습니다.
  • Nest.js는 IoC 컨테이너를 통해 Consumer에 ServiceA를 자동으로 주입합니다.

IoC와 DI의 관계

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

요약

  1. DI (의존성 주입):
    • 객체가 필요한 의존성을 외부에서 주입받는 방식.
    • 결합도를 낮추고 유지보수를 쉽게 만듦.
  2. IoC 컨테이너:
    • 객체의 생성과 의존성 관리를 담당.
    • Nest.js의 핵심 구성 요소로, @Injectable 등을 활용해 동작.
← 이전 글NestJS 구조 파헤치기: Module, Controller, Service의 역할과 흐름
다음 글 →Axios 인터셉터로 응답 및 요청 관리하기