
@Injectable() 데코레이터와 모듈의 providers 등록으로 의존성을 자동 주입합니다.NestJS에서 의존성 주입과 IoC 컨테이너는 모듈 간 의존성을 효율적으로 관리하기 위한 핵심 개념입니다. 두 개념의 정의와 역할, 그리고 둘의 관계를 코드와 함께 정리합니다.
의존성 주입은 객체 간의 의존성을 외부에서 주입받는 방식으로 관리하는 디자인 패턴입니다. 객체가 스스로 필요한 의존성을 생성하거나 찾는 대신, 외부에서 제공받습니다.
typescriptclass ServiceA { sayHello() { return 'Hello from ServiceA'; } } class Consumer { private service: ServiceA; constructor() { this.service = new ServiceA(); // 직접 의존성을 생성 } useService() { return this.service.sayHello(); } }
위 코드에서는 Consumer가 ServiceA의 의존성을 직접 생성합니다. 이런 방식은 결합도가 높아져 테스트나 유지보수가 어렵습니다.
typescriptclass 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에 직접 의존하지 않고 외부에서 주입받습니다.
IoC 컨테이너는 애플리케이션의 객체 생성과 의존성 관리를 담당하는 컴포넌트입니다. 컨테이너가 객체를 직접 생성하고 필요한 의존성을 주입합니다.
NestJS는 IoC 컨테이너를 사용해 다음을 처리합니다.
@Injectable() 데코레이터 사용: 클래스에 @Injectable() 데코레이터를 붙이면 IoC 컨테이너가 해당 클래스를 관리하고 의존성을 주입할 수 있습니다.providers에 의존성을 등록하면 IoC 컨테이너가 이를 관리합니다.typescriptimport { 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 컨테이너에 등록되었습니다.Consumer에 ServiceA를 자동으로 주입합니다.@Injectable() 등을 활용해 동작합니다.// Comments