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