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, 캐시)

🔥 주의 사항

  1. 비동기 처리 주의:
    • 종료 이벤트에서 비동기 작업이 완료되지 않으면 강제 종료됩니다.
    • await을 사용하여 명시적으로 완료시켜야 합니다.
  2. 정리 작업을 놓치면 데이터 손실 발생:
    • 서버 강제 종료 시 발생할 수 있는 데이터 손실을 방지하기 위해
      모든 중요한 데이터는 미리 백업하는 것이 좋습니다.
  3. Signal 처리 유의:
    • SIGINT, SIGTERM 등 다양한 종료 신호를 감지하도록 설정해야 합니다.
    • 다중 처리로 인한 데이터 손실 방지도 고려해야 합니다.

🔚 마무리 요약

이벤트 설명

onModuleInit 모듈이 초기화될 때 실행
onApplicationBootstrap 애플리케이션이 완전히 시작된 후 실행
beforeApplicationShutdown 애플리케이션이 종료되기 직전에 실행
onApplicationShutdown 실제 종료 시점에 실행
onModuleDestroy 모듈이 파괴될 때 실행

 

NestJS Lifecycle Events,NestJS 서버 종료,NestJS 모듈 초기화,NestJS 모듈 종료,NestJS 서버 재시작,NestJS 데이터 백업,NestJS 서버 안정성,NestJS 종료 처리,NestJS 신호 감지,NestJS 서버 관리