728x90
반응형
1. process 객체란
process는 현재 실행 중인 Node.js 프로세스에 대한 정보와 제어 기능을 제공하는 글로벌 객체입니다. 환경 변수 접근, 명령줄 인자 파싱, 프로세스 종료, 표준 입출력 스트림 등 시스템 수준의 다양한 기능을 제공합니다.
2. 프로세스 정보
2.1 기본 정보
// Node.js 버전 정보
console.log(process.version); // v20.10.0
console.log(process.versions); // { node: '20.10.0', v8: '11.3.244.8', ... }
// 프로세스 ID
console.log(process.pid); // 12345
console.log(process.ppid); // 부모 프로세스 ID
// 플랫폼 정보
console.log(process.platform); // darwin, win32, linux
console.log(process.arch); // x64, arm64
// 실행 경로
console.log(process.execPath); // /usr/local/bin/node
console.log(process.cwd()); // 현재 작업 디렉토리
// 실행 시간 (초)
console.log(process.uptime()); // 프로세스 실행 시간
2.2 메모리 사용량
const memoryUsage = process.memoryUsage();
console.log(memoryUsage);
/*
{
rss: 30000000, // 전체 메모리 사용량
heapTotal: 6000000, // V8 힙 전체 크기
heapUsed: 4000000, // V8 힙 사용량
external: 1000000, // V8 외부 메모리 (Buffer 등)
arrayBuffers: 500000 // ArrayBuffer 메모리
}
*/
// 사람이 읽기 쉬운 형식으로 변환
function formatMemory(bytes) {
return (bytes / 1024 / 1024).toFixed(2) + ' MB';
}
console.log('RSS:', formatMemory(memoryUsage.rss));
console.log('Heap Used:', formatMemory(memoryUsage.heapUsed));
2.3 CPU 사용량
// CPU 사용 시간 (마이크로초)
const cpuUsage = process.cpuUsage();
console.log(cpuUsage);
// { user: 100000, system: 50000 }
// 이전 측정값과 비교
const startUsage = process.cpuUsage();
// ... 작업 수행
const endUsage = process.cpuUsage(startUsage);
console.log('사용자 CPU:', endUsage.user, 'μs');
console.log('시스템 CPU:', endUsage.system, 'μs');
3. 환경 변수
// 환경 변수 읽기
console.log(process.env.NODE_ENV); // development
console.log(process.env.PATH);
console.log(process.env.HOME);
// 환경 변수 설정
process.env.MY_VAR = 'value';
console.log(process.env.MY_VAR); // value
// 환경 변수 삭제
delete process.env.MY_VAR;
// 모든 환경 변수 출력
console.log(process.env);
// 환경 변수 기반 설정
const config = {
port: process.env.PORT || 3000,
nodeEnv: process.env.NODE_ENV || 'development',
dbUrl: process.env.DATABASE_URL
};
4. 명령줄 인자
// node app.js arg1 arg2 --name=value
console.log(process.argv);
/*
[
'/usr/local/bin/node', // Node.js 실행 경로
'/path/to/app.js', // 스크립트 경로
'arg1', // 첫 번째 인자
'arg2', // 두 번째 인자
'--name=value' // 옵션 인자
]
*/
// 실제 인자만 추출
const args = process.argv.slice(2);
console.log(args); // ['arg1', 'arg2', '--name=value']
// 간단한 인자 파싱
function parseArgs(args) {
const result = { _: [] };
for (const arg of args) {
if (arg.startsWith('--')) {
const [key, value] = arg.slice(2).split('=');
result[key] = value || true;
} else if (arg.startsWith('-')) {
result[arg.slice(1)] = true;
} else {
result._.push(arg);
}
}
return result;
}
console.log(parseArgs(process.argv.slice(2)));
// { _: ['arg1', 'arg2'], name: 'value' }
5. 프로세스 종료
5.1 정상 종료
// 종료 코드와 함께 종료
process.exit(0); // 성공
process.exit(1); // 에러
// 종료 코드 설정 (즉시 종료하지 않음)
process.exitCode = 1;
// 비동기 작업 완료 후 종료
async function cleanup() {
await saveData();
process.exit(0);
}
5.2 종료 이벤트
// 프로세스 종료 직전 (동기 코드만 실행 가능)
process.on('exit', (code) => {
console.log('프로세스 종료, 코드:', code);
// 비동기 작업 불가
});
// 이벤트 루프가 비어있을 때 (비동기 작업 가능)
process.on('beforeExit', (code) => {
console.log('beforeExit, 코드:', code);
// 여기서 비동기 작업을 추가하면 프로세스가 계속 실행됨
});
반응형
6. 시그널 처리
// SIGINT (Ctrl+C)
process.on('SIGINT', () => {
console.log('Ctrl+C 감지');
process.exit(0);
});
// SIGTERM (종료 시그널)
process.on('SIGTERM', () => {
console.log('SIGTERM 수신, 정리 작업 수행...');
cleanup().then(() => process.exit(0));
});
// SIGHUP (터미널 종료)
process.on('SIGHUP', () => {
console.log('터미널 연결 종료');
});
// Windows에서는 일부 시그널이 지원되지 않음
7. 표준 입출력 스트림
7.1 stdout, stderr
// 표준 출력
process.stdout.write('Hello\n');
// 표준 에러
process.stderr.write('에러 메시지\n');
// TTY 확인
if (process.stdout.isTTY) {
console.log('터미널에서 실행 중');
console.log('터미널 크기:', process.stdout.columns, 'x', process.stdout.rows);
}
7.2 stdin
// 표준 입력 읽기
process.stdin.setEncoding('utf8');
process.stdin.on('data', (data) => {
console.log('입력:', data.trim());
});
// 한 줄씩 읽기
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('이름을 입력하세요: ', (answer) => {
console.log('안녕하세요,', answer);
rl.close();
});
8. 에러 처리
// 처리되지 않은 예외
process.on('uncaughtException', (err) => {
console.error('처리되지 않은 예외:', err);
// 로그 저장 후 종료 권장
process.exit(1);
});
// 처리되지 않은 프로미스 거부
process.on('unhandledRejection', (reason, promise) => {
console.error('처리되지 않은 프로미스 거부:', reason);
});
// 경고 메시지
process.on('warning', (warning) => {
console.warn('경고:', warning.name, warning.message);
});
// 경고 발생시키기
process.emitWarning('이것은 경고입니다', 'CustomWarning');
9. 기타 유용한 메서드
// 고해상도 시간 측정
const start = process.hrtime.bigint();
// ... 작업 수행
const end = process.hrtime.bigint();
console.log(`소요 시간: ${end - start} 나노초`);
// 다음 틱에 콜백 실행
process.nextTick(() => {
console.log('다음 틱에서 실행');
});
// 작업 디렉토리 변경
process.chdir('/tmp');
console.log(process.cwd()); // /tmp
// 사용자/그룹 ID (Unix)
console.log(process.getuid()); // 사용자 ID
console.log(process.getgid()); // 그룹 ID
결론
process 객체는 Node.js 프로세스의 정보 조회와 제어를 위한 핵심 글로벌 객체입니다. 환경 변수(process.env), 명령줄 인자(process.argv), 종료 처리(process.exit), 시그널 처리, 표준 입출력 스트림 등 시스템 수준의 다양한 기능을 제공합니다. 프로덕션 환경에서는 uncaughtException과 unhandledRejection 이벤트를 반드시 처리해야 합니다.
728x90
반응형
'Node.js' 카테고리의 다른 글
| Node.js의 타이머 함수(Timer Functions) (0) | 2026.02.25 |
|---|---|
| Node.js의 콘솔 객체(console object) (0) | 2026.02.25 |
| Node.js의 글로벌 객체(Global Objects) (0) | 2026.02.24 |
| Node.js의 버퍼(Buffer) 사용법 (0) | 2026.02.24 |
| Node.js의 스트림 모듈(stream module) (0) | 2026.02.24 |