Node.js 전역객체와 전역 변수
노드는 실행중인 프로그램 어디에서든지 접근할 수 있는 전역 변수 및 전역 객체를 제공합니다. console
, module
등이 이러한 전역 객체에 해당하며 모듈을 불러오지 않고도 사용할 수 있습니다.
이것은 웹 브라우저에서 지원하는 전역 객체인 window
, document
객체 등과 비슷합니다. (노드에는 웹 브라우저에서 사용가능한 window, document 등의 객체는 존재하지 않습니다.)
전역(global) 객체
전역 객체는 모든 노드 프로그램에서 접근할 수 있습니다. 전역 객체는 global.console
처럼 사용이 가능하나, global
은 생략이 가능합니다.
global 객체에 정의된 내용들은 repl 환경에서 global
객체를 확인해 보면 알 수 있습니다. 많은 속성이 담겨 있지만 그 중 몇몇 속성들부터 확인해 보겠습니다.
/* 전역 객체 */
buffer // 파일과 네트워크 입출력 작업에 사용
console // 콘솔창에 결과를 출력
module // 모듈 객체
exports // 모듈을 다루는 객체
require // 모듈을 가져오는 객체
process // 프로세스의 실행에 대한 정보를 다루는 객체
setImmediate // 타이머 함수
setInterval // 타이머 함수
setTimeout // 타이머 함수
stream // 스트림 기반 데이터 전송
전역 변수
자주사용되는 전역변수로는 __filename
, __dirname
등이 있습니다.
/* 실행한 파일의 전체 경로 출력 */
console.log('file name : %s', __filename);
//-> file name : /Users/path/to/filename.js
/* 실행한 파일이 들어있는 디렉토리의 전체 경로 출력 */
console.log('dir name : %s', __dirname);
//-> file name : /Users/path/to/dir
console
console 역시 global 객체에 들어있습니다. 지금까지 사용했던 console.log()
메서드 외에도 다양한 메서드가 정의되어 있으며, 몇몇 메서드들을 확인해 보겠습니다.
예제
// log
console.log('Number : %d', 10);
//=> Number : 10
console.log('String : %s', 'Alice');
//=> String : Alice
// error
console.error("Error message");
// time, timeEnd
let result = 0;
console.time('duration_sum');
for (let i = 0; i < 1000; i++) {
result += i
}
console.timeEnd('duration_sum');
console 메서드
메소드 | 설명 |
---|---|
console.dir(object) | 객체의 속성을 출력 |
console.error(msg) | 에러를 출력 |
console.time(id) | 같은 id를 가진 timeEnd와 대응되며 time과 timeEnd 사이의 실행시간을 측정 |
console.timeEnd(id) | 같은 id를 가진 time과 대응되며 time과 timeEnd 사이의 실행시간을 측정 |
process
process 객체는 실행중인 노드 프로세스에 대한 정보를 담고 있는 객체입니다. process 객체 내부에는 프로세스에 대한 정보를 확인할 수 있는 다양한 속성이 있으며, repl 등을 이용해서 확인해 볼 수 있습니다.
$ node
> pocess
// 결과
process {
title: 'node',
version: 'v8.11.3', // 실행중인 노드의 버전
arch: 'x64', // 프로세서 정보
platform: 'darwin', // 운영체제 정보
argv: [ '/Users/path/to/node' ], // 프로세스에 전달된 인수 배열
env: { // 시스템 환경변수
LANG: 'ko_KR.UTF-8',
PWD: '/Users/present/working/directory',
JAVA_HOME: '/Library/Java/Home',
},
pid: 1915, // 프로세스 아이디
}
process를 이용하면 프로세스의 실행 자체를 컨트롤 할 수도 있습니다. process의 여러 속성 중 몇가지 중요한 속성들을 확인해 보겠습니다.
process.cwd(); // 현재 작업 디렉터리
//-> '/Users/path/to/directory'
process.cpuUsage(); // cpu 사용량
//-> { user: 97532, system: 25189 }
process.uptime(); // 프로세스 지속시간
// 144.106
process.memoryUsage(); // 메모리 사용량
//-> { rss: 21491712, heapTotal: 7684096, heapUsed: 5167472, external: 8698 }
process.exit(); // 프로세스 실행 정지
process.argv
process.argv
속성은 웹 개발 보다는 CLI 프로그램을 만들 때 유용합니다. argv 속성을 사용하면 Node.js 프로세스가 시작될 때 전달 된 Command line 인수 배열을 반환합니다.
다음과 같이 노드 애플리케이션을 실행 시킬 때 인수를 함꼐 입력하는 애플리케이션을 생각해 보죠.
# node 프로세스 실행하기
node index.js 10 20
이렇게 할 경우 실행시 프로세스에 전달된 인수값은 바로 process.argv
를 통해서 확인할 수 있습니다.
process.argv // 커맨드 라인 매개변수 정보 확인
// ['node', 'path/to/index.js', '10', '20']
결과에서 보는것과 같이, 배열의 첫번째와 두번째는 프로세스 타이틀과 경로이며, 세번째 값부터가 프로세스 실행 시 인수로 전달된 값입니다.
// 인수로 전달된 숫자의 합을 출력하기
console.log(process.argv);
const nums = process.argv.slice(2);
var sum = 0;
nums.forEach(function (num) {
const n = Number(num);
sum += n;
});
console.log(sum);
이를 바탕으로 node.js 기반의 다양한 커맨드라인 응용 프로그램을 만들 수 있습니다.
process.env
process.env
는 시스템 환경변수를 저장하고 있습니다. 서비스를 개발할 때에는 process.env의 속성으로 중요한 서비스의 키를 저장하는 용도로 사용합니다. 이를 이용해 우리가 작성하는 코드상에 서비스의 비밀번호나 API 키를 노출하는 것을 방지할 수 있습니다.
/* Example */
// 환경변수 DEBUG를 1로 설정하면 디버그 정보를 기록하기
const debug = process.env.DEBUG === "1" ? console.log : function() {};
debug("DEBUG"); // console.log("DEBUG")
process.nextTick
process.nextTick()
은 인자로 콜백함수를 받으며, nextTick의 인자로 전달된 콜백함수는 setTimeout 등 다른 콜백함수보다 우선적으로 실행됩니다.
setTimeout(() => {
console.log("timeout");
}, 0);
process.nextTick(() => {
console.log("nextTick")
});
// 출력결과
nextTick
timeout
위 코드를 실행해보면 nextTick이 timeout보다 먼저 출력되는 것을 확인할 수 있습니다.
지금까지 살펴본 전역 객체 이외에도 buffer
, stream
등 중요한 전역 객체들이 더 있습니다. 해당 객체들은 해당 파트에서 별도로 확인해 보겠습니다.