개요
NestJS에서 클래스(인스턴스)를 생성할 때 초기화 작업을 하는데 크게 constructor()와 onModuleInit()두 가지 방식으로 나눌 수 있다.
두 방식 모두 클래스가 생성될 때 실행된다는 공통점이 있지만, 실행 시점과 목적은 분명히 다르다.
constructor()와 onMonduleInit() 차이점과 쓰임새에 대해 자세히 알아보자
constructor(): 클래스의 생성자
NestJS에서는 기본적으로 클래시 기반의 의존성 주입(DI)를 사용한다.
constructor는 DI가 적용되는 지점이며, 의존성을 주입받는 역할을 한다.
@Injectable()
export class MyService {
constructor(private readonly userService: UserService) {
}
}
JavaScript
복사
특징
•
클래스 인스턴스가 생성되자마자 호출됨
•
DI를 통해 필요한 의존성을 주입함
•
async 키워드 사용 불가능 (비동기 로직 불가)
onModuleInit(): 모듈 초기화 훅
OnMonduleInit() 은 NestJS의 라이프사이클 인터페이스 중 하나이다.
OnModuleInit() 을 구현한 클래스에서 이 메서드는 모든 의존성 주입이 완료된 후 자동으로 호출된다.
import { Injectable, OnModuleInit } from '@nestjs/common';
@Injectable()
export class MyService implements OnModuleInit {
constructor(private readonly userService: UserService) {}
async onModuleInit() {
const user = await this.userService.findFirstUser();
}
}
JavaScript
복사
특징
•
클래스가 Nest 컨테이너에 의해 완전히 초기화된 후(생성자, DI) 호출됨
•
모든 의존성 주입이 완료된 상태
•
async 작업 가능 (비동기 초기화 OK)
•
NestJS에서 자동으로 호출해주는 라이프사이클 메서드
실행순서
constructor() → onModuleInit()
언제 무엇을 써야할까?
상황 | 선택 |
단순히 의존성 주입만 필요한 경우 | constructor |
의존성 주입 이후 특정 초기 작업이 필요한 경우 | onModuleInit() |
비동기 작업이 필요한 경우 (예: API 호출, DB 접근) | onModuleInit() |
이벤트 리스너 등록, 캐시 초기화 등 | onModuleInit() |