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 로 인자를 내려주는거랑 의존성 주입과 어떤 차이가 있는 것인지..?
유사점
- 외부에서 데이터/의존성을 주입한다는 기본 개념
- 컴포넌트/클래스의 재사용성과 테스트 용이성 향상
사용 목적
- 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>,
) {}
// 서비스 메서드들...
}