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 등 중요한 전역 객체들이 더 있습니다. 해당 객체들은 해당 파트에서 별도로 확인해 보겠습니다.