Search

constructor vs onModuleInit()

개요

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()