NODE

Nest.js의 @Injectable() 은 뭘까 ? (부제: 의존성주입)

Tree 2024. 10. 20. 12:19

NestJS는 여러 모듈로 이루어집니다. NestJS에서 @Module() 데코레이터는 그러한 모듈을 만들 때 사용합니다.

모듈은 providers, controllers, impoers, exports를 정의하며 최소 하나 이상의 @Conroller()나 @Provider()를 포함합니다.

@Injectable()

@Injectable() 데코레이터는 의존성 주입(Dependency Injection) 시스템의 핵심 부분입니다.

  • 목적: @Injectable() 데코레이터는 클래스를 NestJS의 의존성 주입 시스템에 등록합니다.
  • 기능:
    • 해당 클래스가 NestJS 애플리케이션의 다른 부분에 주입될 수 있음을 나타냅니다.
    • NestJS IoC(Inversion of Control) 컨테이너에 클래스를 등록합니다.
  • 사용 위치: 주로 서비스, 리포지토리, 팩토리 등의 클래스 위에 사용됩니다.

의존성 주입이란?

  • 클래스가 필요로 하는 의존성(다른 클래스나 서비스)을 외부에서 제공받는 디자인 패턴입니다.
  • NestJS에서는 이를 자동으로 처리하는 IoC(Inversion of Control) 컨테이너를 제공합니다.

의존성 주입을 사용하지 않는 경우

class UserService {
  constructor() {
    this.database = new Database(); // 의존성을 내부에서 직접 생성
  }

  getUser(id) {
    return this.database.find(id);
  }
}

class Database {
  find(id) {
    // 데이터베이스에서 사용자를 찾는 로직
    return { id: id, name: "User " + id };
  }
}

const userService = new UserService();
console.log(userService.getUser(1));

 

의존성 주입을 사용하는 경우

class UserService {
  constructor(database) {
    this.database = database; // 의존성을 외부에서 주입받음
  }

  getUser(id) {
    return this.database.find(id);
  }
}

class Database {
  find(id) {
    // 데이터베이스에서 사용자를 찾는 로직
    return { id: id, name: "User " + id };
  }
}

const database = new Database();
const userService = new UserService(database);
console.log(userService.getUser(1));

 

 

[ 프론트 개발자의 관점 ]

 

props 로 인자를 내려주는거랑 의존성 주입과 어떤 차이가 있는 것인지..?

 

유사점

  1. 외부에서 데이터/의존성을 주입한다는 기본 개념
  2. 컴포넌트/클래스의 재사용성과 테스트 용이성 향상

사용 목적

 

  • Props: 주로 UI 렌더링에 필요한 데이터 전달
  • DI: 주로 서비스, 유틸리티 등의 기능적 의존성 주입

생명주기

  • Props: 컴포넌트가 렌더링될 때마다 새로운 값을 받을 수 있음
  • DI: 주로 객체 생성 시점에 의존성이 주입되며, 객체의 수명 동안 유지

변경 가능성

  • Props: 일반적으로 불변(immutable)으로 취급
  • DI: 주입된 의존성은 수정 가능할 수 있음 (인스턴스의 상태 변경 등)

 

Nest 사용예시

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

@Injectable()
export class UserService {
  // 서비스 로직
}

@InjectRepository()

NestJS에서 TypeORM과 함께 사용될 때 특히 중요한 역할을 합니다.

  • 목적: @InjectRepository() 데코레이터는 TypeORM의 Repository를 서비스나 다른 클래스에 주입하는 데 사용됩니다.
  • 기능:
    • 특정 엔티티에 대한 TypeORM Repository를 현재 클래스에 주입합니다.
    • NestJS의 의존성 주입 시스템과 TypeORM을 연결합니다.
  • 사용 위치: 주로 서비스 클래스의 생성자에서 사용됩니다.

사용예시

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
  ) {}

  // 서비스 메서드들...
}