[Nest.js] @Injectable() 데코레이터로 의존성 주입 이해하기

궁금하면 500원·2024년 8월 1일
0

@Injectable()

Nest.js에서 @Injectable() 데코레이터는 의존성 주입(Dependency Injection, DI)을
사용할 수 있도록 클래스에 적용하는 데코레이터입니다.

이 데코레이터를 통해 Nest.js는 해당 클래스를 Provider로 인식하고,
다른 클래스에서 필요할 때 의존성을 주입하여 사용할 수 있습니다.

의존성 주입(Dependency Injection) 개념

의존성 주입은 객체가 다른 객체의 인스턴스에 의존할 때,
직접 해당 인스턴스를 생성하지 않고 외부에서 주입하는 설계 패턴입니다.

이를 통해 객체 간 결합도를 줄이고, 코드의 재사용성과 테스트 가능성을 높이는 장점이 있습니다.

Nest.js에서는 클래스 간 의존성을 관리하고 주입할 때 @Injectable()
데코레이터가 필수적으로 사용됩니다.

@Injectable()의 역할

1. Provider로 등록

@Injectable() 데코레이터를 사용하면 해당 클래스는
Nest.js의 의존성 주입 시스템에서 Provider로 인식됩니다.

이를 통해 Nest.js는 이 클래스를 인스턴스화하고, 필요한 곳에 자동으로 주입할 수 있습니다.

자동 인스턴스 생성

@Injectable() 데코레이터가 적용된 클래스는 애플리케이션의 런타임 동안
Nest.js의 의존성 주입 컨테이너에 의해 관리됩니다.

Nest.js는 이 클래스의 인스턴스를 직접 생성하고 관리하며,
다른 클래스에서 해당 클래스가 필요할 때 주입해줍니다.

다른 클래스에 주입 가능

@Injectable()이 적용된 클래스를 다른 클래스에서 의존성으로 주입할 수 있습니다.

주입받는 클래스는 생성자에서 해당 클래스를 참조하게 되며,
이를 통해 필요한 메서드를 호출하거나 값을 사용할 수 있습니다.

Injectable() 사용 예시

import { Injectable } from '@nestjs/common';

@Injectable()
export class MyService {
  getHello(): string {
    return 'Hello, Nest!';
  }
}

위의 예시에서 MyService 클래스는 @Injectable() 데코레이터로 감싸져 있습니다.

이로 인해 Nest.js는 이 클래스를 의존성 주입 시스템에서 사용할 수 있도록 관리합니다.

이제 MyService를 다른 클래스에 주입할 수 있습니다.

import { Controller, Get } from '@nestjs/common';
import { MyService } from './my-service';

@Controller('example')
export class ExampleController {
  constructor(private readonly myService: MyService) {}

  @Get()
  getHello(): string {
    return this.myService.getHello();
  }
}

ExampleController 클래스는 생성자에서 MyService를 주입받고 있습니다.

Nest.js는 MyService의 인스턴스를 자동으로 생성하여
ExampleController의 생성자에 전달합니다.

의존성 주입의 과정

  • 주입할 객체 정의: @Injectable() 데코레이터로 클래스를 정의하여 Provider로 등록합니다.
  • Nest.js 모듈에 Provider 등록: 이 클래스를 제공할 모듈의 providers 배열에 등록합니다.
  • 주입: 다른 클래스에서 해당 Provider를 생성자에서 주입받아 사용할 수 있습니다.

@Injectable()의 주요 장점

  1. 유지보수 용이성: 클래스 간 의존성을 명확하게 정의하고, 결합도를 낮출 수 있어
    코드의 유지보수가 용이합니다.
  2. 테스트 편리성: 의존성 주입을 통해 각 클래스의 의존성을 쉽게 대체(mock)할 수 있으므로,
    단위 테스트 작성이 쉬워집니다.
  3. 재사용성: 한 번 정의된 Provider는 애플리케이션 내에서 어디서든지 주입받아 사용할 수 있습니다.

Nest.js 의존성 주입 컨테이너

Nest.js는 자체 DI 컨테이너를 통해 @Injectable() 데코레이터가 붙은 클래스를 관리합니다.

이 컨테이너는 Nest 애플리케이션이 시작될 때 모든 Provider를 스캔하고, 필요한 인스턴스를 생성하여 다른 클래스에 주입합니다.

결론

@Injectable()은 Nest.js에서 클래스가 의존성 주입을 받을 수 있게 하는 데코레이터입니다.

의존성 주입을 통해 클래스 간 결합도를 낮추고 코드 재사용성과 테스트 가능성을 높입니다.

@Injectable() 데코레이터는 Provider로 사용할 클래스를 지정하는 역할을 합니다.

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글