framework/NestJS
⏳ NestJS Lifecycle Events – 애플리케이션 생명주기 관리 완전 가이드
octo54
2025. 5. 19. 10:09
반응형
⏳ NestJS Lifecycle Events – 애플리케이션 생명주기 관리 완전 가이드
NestJS에서 **Lifecycle Events(생명주기 이벤트)**는 애플리케이션의 특정 상태 변화 시 발생하는 이벤트를 처리할 수 있는 중요한 개념입니다.
이번 글은 NestJS 공식 문서 Lifecycle Events를 기반으로,
애플리케이션 상태 변화를 감지하고 관리하는 실무 기법을 설명합니다.
💡 "서비스 시작과 종료를 적절히 관리하지 않으면 메모리 누수와 데이터 손실이 발생할 수 있습니다."
Lifecycle Events를 활용하여 안전하고 효율적인 애플리케이션을 설계해봅시다.
✅ Lifecycle Events란?
NestJS에서 애플리케이션의 상태가 변경될 때 발생하는 이벤트입니다.
서버 시작, 종료, 모듈 초기화 등 다양한 시점에서 처리할 수 있습니다.
🪓 주요 이벤트 목록
이벤트 설명
onModuleInit | 모듈 초기화 직후 발생 |
onModuleDestroy | 모듈 종료 직전 발생 |
onApplicationBootstrap | 모든 모듈 초기화 후 발생 |
beforeApplicationShutdown | 애플리케이션 종료 직전 발생 |
onApplicationShutdown | 애플리케이션이 실제로 종료될 때 발생 |
🌟 1️⃣ 모듈 초기화 이벤트 – onModuleInit
✅ 사용 예시
@Injectable()
export class AppService implements OnModuleInit {
onModuleInit() {
console.log('🚀 모듈 초기화 완료');
}
}
- 모듈이 생성될 때 실행
- 주로 초기 설정이나 의존성 주입 검증에 사용
🌟 2️⃣ 애플리케이션 부트스트랩 완료 이벤트 – onApplicationBootstrap
반응형
✅ 사용 예시
@Injectable()
export class AppService implements OnApplicationBootstrap {
onApplicationBootstrap() {
console.log('✅ 애플리케이션 부트스트랩 완료');
}
}
- 모든 모듈이 초기화된 후에 실행됩니다.
- 서버 시작 시 초기 데이터 로딩이나 스케줄러 시작에 사용됩니다.
📺 광고
애플리케이션 초기화와 종료 관리는 안정성 측면에서 중요한 요소입니다.
이 지점은 애플리케이션 관리 팁을 제공하는 핵심 구간으로, 애드센스 광고 삽입에 적합합니다.
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-XXXXXX"
data-ad-slot="YYYYYY"
data-ad-format="auto"
data-full-width-responsive="true"></ins>
🌟 3️⃣ 애플리케이션 종료 직전 이벤트 – beforeApplicationShutdown
✅ 사용 예시
@Injectable()
export class AppService implements BeforeApplicationShutdown {
beforeApplicationShutdown(signal: string) {
console.log(`⚠️ 애플리케이션 종료 직전 - 신호: ${signal}`);
}
}
- 서버 종료 시 정리 작업이 필요할 때 사용
- 데이터베이스 연결 해제 또는 캐시 클리어 등을 수행합니다.
🌟 4️⃣ 애플리케이션 종료 이벤트 – onApplicationShutdown
✅ 사용 예시
@Injectable()
export class AppService implements OnApplicationShutdown {
onApplicationShutdown(signal: string) {
console.log(`🛑 애플리케이션 종료 - 신호: ${signal}`);
}
}
- 서버가 실제로 종료되기 직전에 호출됩니다.
- 파일 스트림 정리나 로그 수집기 종료 등에 사용됩니다.
🌟 5️⃣ 모듈 종료 이벤트 – onModuleDestroy
✅ 사용 예시
@Injectable()
export class AppService implements OnModuleDestroy {
onModuleDestroy() {
console.log('🔻 모듈 종료');
}
}
- 모듈이 파괴될 때 실행되어, 자원 해제 작업에 적합합니다.
🛠️ 실무 활용 – 서버 재시작 시 데이터 복구
✅ 서버 재시작 감지
@Injectable()
export class AppService implements OnApplicationBootstrap, OnApplicationShutdown {
onApplicationBootstrap() {
console.log('✅ 서버 부팅 완료 - 데이터 복구 시작');
this.restoreBackup();
}
onApplicationShutdown(signal: string) {
console.log(`🛑 서버 종료 - 데이터 백업 수행: ${signal}`);
this.createBackup();
}
private restoreBackup() {
console.log('📂 데이터 복구 중...');
// 데이터 복구 로직
}
private createBackup() {
console.log('💾 데이터 백업 중...');
// 데이터 백업 로직
}
}
🚀 서버 종료 이벤트 감지 (SIGINT)
✅ 서버 종료 시 데이터 정리
@Injectable()
export class AppService implements BeforeApplicationShutdown {
beforeApplicationShutdown(signal: string) {
if (signal === 'SIGINT') {
console.log('🛑 서버 강제 종료 - 데이터 저장 중...');
this.saveCriticalData();
}
}
private saveCriticalData() {
console.log('🔒 중요한 데이터 저장 완료');
}
}
🧠 실무 활용 전략
이벤트 사용 사례
onModuleInit | 모듈 초기화 설정 (환경 변수 로딩) |
onApplicationBootstrap | 서버 부팅 시 초기 데이터 로딩 |
beforeApplicationShutdown | 종료 전 데이터 백업 및 연결 해제 |
onApplicationShutdown | 종료 시 로그 정리 및 외부 리소스 해제 |
onModuleDestroy | 모듈 파괴 시 연결 해제 (DB, 캐시) |
🔥 주의 사항
- 비동기 처리 주의:
- 종료 이벤트에서 비동기 작업이 완료되지 않으면 강제 종료됩니다.
- await을 사용하여 명시적으로 완료시켜야 합니다.
- 정리 작업을 놓치면 데이터 손실 발생:
- 서버 강제 종료 시 발생할 수 있는 데이터 손실을 방지하기 위해
모든 중요한 데이터는 미리 백업하는 것이 좋습니다.
- 서버 강제 종료 시 발생할 수 있는 데이터 손실을 방지하기 위해
- Signal 처리 유의:
- SIGINT, SIGTERM 등 다양한 종료 신호를 감지하도록 설정해야 합니다.
- 다중 처리로 인한 데이터 손실 방지도 고려해야 합니다.
🔚 마무리 요약
이벤트 설명
onModuleInit | 모듈이 초기화될 때 실행 |
onApplicationBootstrap | 애플리케이션이 완전히 시작된 후 실행 |
beforeApplicationShutdown | 애플리케이션이 종료되기 직전에 실행 |
onApplicationShutdown | 실제 종료 시점에 실행 |
onModuleDestroy | 모듈이 파괴될 때 실행 |
NestJS Lifecycle Events,NestJS 서버 종료,NestJS 모듈 초기화,NestJS 모듈 종료,NestJS 서버 재시작,NestJS 데이터 백업,NestJS 서버 안정성,NestJS 종료 처리,NestJS 신호 감지,NestJS 서버 관리