Node.js는 서버 측 애플리케이션을 효율적으로 관리하기 위한 다양한 내장 이벤트를 제공합니다. 그중 process.on 이벤트 리스너는 애플리케이션의 생명 주기 동안 발생하는 중요한 이벤트를 처리하는 데 유용합니다.
1. process.on 이벤트 리스너
- Node.js의 process 객체는 실행 중인 애플리케이션의 상태를 제어하고 정보를 제공하는 핵심 객체
- process.on 메서드는 특정 이벤트를 감지하고 해당 이벤트가 발생했을 때 실행할 리스너 등록 가능
주요 이벤트
- exit: 애플리케이션이 종료될 때 발생.
- SIGINT: Ctrl+C 입력 시 발생.
- uncaughtException: 처리되지 않은 예외가 발생했을 때 발생.
- SIGTERM: 운영 체제에서 종료 신호를 보낼 때 발생.
- 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 이벤트 리스너는 애플리케이션의 종료 및 오류 처리를 효과적으로 관리할 수 있는 강력한 도구입니다.
적절한 이벤트 핸들링은 애플리케이션의 안정성과 신뢰성을 높이는 데 큰 기여를 합니다.
'개발정리 (nodeJS)' 카테고리의 다른 글
[nodeJS] Node.js에서 이벤트 기반 아키텍처 구현하기 (0) | 2025.01.24 |
---|---|
[nodeJS] Node.js에서 DB 프로시저 활용하기 (0) | 2024.12.31 |
[nodeJS] Node.js에서 SQLite를 사용한 로컬 데이터베이스 구축하기 (1) | 2024.12.18 |
[nodeJS] Node.js와 Apache Kafka를 사용한 스트리밍 데이터 처리 (1) | 2024.12.03 |
[nodeJS] Node.js에서 Bcrypt를 사용한 비밀번호 해싱 및 검증하기 (0) | 2024.11.21 |