본문 바로가기
개발정리 (nodeJS)

[nodeJS] Node.js에서 생명 주기 활용하기

by 할리갈리0 2025. 1. 31.

Node.js는 서버 측 애플리케이션을 효율적으로 관리하기 위한 다양한 내장 이벤트를 제공합니다. 그중 process.on 이벤트 리스너는 애플리케이션의 생명 주기 동안 발생하는 중요한 이벤트를 처리하는 데 유용합니다.

1. process.on 이벤트 리스너

  • Node.js의 process 객체는 실행 중인 애플리케이션의 상태를 제어하고 정보를 제공하는 핵심 객체
  • process.on 메서드는 특정 이벤트를 감지하고 해당 이벤트가 발생했을 때 실행할 리스너 등록 가능

주요 이벤트

  1. exit: 애플리케이션이 종료될 때 발생.
  2. SIGINT: Ctrl+C 입력 시 발생.
  3. uncaughtException: 처리되지 않은 예외가 발생했을 때 발생.
  4. SIGTERM: 운영 체제에서 종료 신호를 보낼 때 발생.
  5. warning: 경고가 발생했을 때 발생.

 

2. 기본 구조: 이벤트 리스너 등록하기

process.on('eventName', (callback) => {
  // 이벤트 발생 시 실행할 로직
});
process.on('exit', (code) => {
  console.log(`애플리케이션 종료! 종료 코드: ${code}`);
});

console.log('애플리케이션 실행 중...');

 

출력 결과:

애플리케이션 실행 중...
애플리케이션 종료! 종료 코드: 0

 

3. 애플리케이션 종료 시 리소스 정리

애플리케이션이 종료될 때 데이터베이스 연결 종료, 파일 저장, 로그 기록 등의 작업이 필요한 경우, process.on('exit') 또는 process.on('SIGINT') 활용 가능

 

데이터베이스 연결 종료

const db = {
  close: () => console.log('데이터베이스 연결 종료.')
};

process.on('exit', () => {
  db.close();
});

console.log('애플리케이션 실행 중...');
setTimeout(() => {
  console.log('프로세스 종료 중...');
  process.exit();
}, 2000);

 

출력 결과:

애플리케이션 실행 중...
프로세스 종료 중...
데이터베이스 연결 종료.

 

4. SIGINT: Ctrl+C 이벤트 처리

SIGINT 이벤트는 사용자가 Ctrl+C를 입력하여 애플리케이션을 강제로 종료하려 할 때 발생하여, 애플리케이션이 종료되기 전에 필요한 작업 수행 가능

 

Ctrl+C로 애플리케이션 종료 처리

process.on('SIGINT', () => {
  console.log('Ctrl+C 입력 감지! 애플리케이션 종료 중...');
  process.exit();
});

console.log('Ctrl+C를 눌러 종료하세요.');

 

출력 결과:

Ctrl+C를 눌러 종료하세요.
Ctrl+C 입력 감지! 애플리케이션 종료 중...

 

5. uncaughtException: 처리되지 않은 예외

Node.js 애플리케이션에서 발생한 예외가 try-catch로 처리되지 않으면 발생하는 uncaughtException 이벤트를 활용하여 예외를 기록하거나, 필요에 따라 애플리케이션을 안전하게 종료 가능

 

처리되지 않은 예외 기록

uncaughtException 이벤트는 긴급 상황에서만 사용하는 것이 좋으며, 애플리케이션을 정상적으로 실행하는 데 의존하지 않는 것이 권장

process.on('uncaughtException', (err) => {
  console.error(`처리되지 않은 예외 발생: ${err.message}`);
  process.exit(1); // 프로세스를 강제 종료
});

// 의도적으로 예외 발생
setTimeout(() => {
  throw new Error('예기치 못한 오류!');
}, 1000);

 

출력 결과:

처리되지 않은 예외 발생: 예기치 못한 오류! 

 

6. SIGTERM: 운영 체제 종료 신호 처리

SIGTERM은 운영 체제가 애플리케이션을 종료할 때 보내는 신호로 서버 환경에서 컨테이너 종료 시 중요한 리소스를 정리하는 데 유용

 

서버 종료 처리

const http = require('http');

const server = http.createServer((req, res) => {
  res.end('서버 실행 중');
});

server.listen(3000, () => console.log('서버가 <http://localhost:3000> 에서 실행 중입니다.'));

process.on('SIGTERM', () => {
  console.log('SIGTERM 신호 감지. 서버 종료 중...');
  server.close(() => {
    console.log('서버가 종료되었습니다.');
    process.exit(0);
  });
});

 

출력 결과:

서버가 <http://localhost:3000> 에서 실행 중입니다.
SIGTERM 신호 감지. 서버 종료 중...
서버가 종료되었습니다.

 

7. 이벤트 리스너 제거 및 중복 방지

이벤트 리스너 제거

등록된 이벤트 리스너를 제거하려면 process.off 또는 process.removeListener 사용

const onExit = () => {
  console.log('애플리케이션 종료 중...');
};

process.on('exit', onExit);
process.off('exit', onExit);

console.log('이벤트 리스너 제거 후 실행');

 

출력 결과:

이벤트 리스너 제거 후 실행

 

중복 리스너 방지

process.on을 여러 번 호출하면 동일한 이벤트에 대해 중복 리스너가 등록될 수 있어,

이를 방지하려면 process.listenerCount 활용

if (process.listenerCount('exit') === 0) {
  process.on('exit', () => {
    console.log('애플리케이션 종료 처리');
  });
}

 

 

Node.js의 process.on 이벤트 리스너는 애플리케이션의 종료 및 오류 처리를 효과적으로 관리할 수 있는 강력한 도구입니다.

적절한 이벤트 핸들링은 애플리케이션의 안정성과 신뢰성을 높이는 데 큰 기여를 합니다.

반응형