본문 바로가기

Node.js

[Node] 노드의 내장 객체들

말 그대로 빠르게 노드 프로그래밍을 할 때 자주 사용되는 노드의 내장 객체들에 대해 하나씩 살펴보자

 

 

 

global

- 전역 객체 : 모든 파일에서 접근 가능

- 생략 가능 : console 객체도 원래는 global.console 이었음

- 남용 주의 : 프로그램의 규모가 커질수록 어떤 파일에서 global 객체에 값을 대입했는지 찾기 힘들어져 유지 보수에 어려움을 겪을 수 있음

 

console

- 디버깅과 에러 내용 및 코드 실행 시간 확인에 사용

- console.log 메서드가 대표적

- console.time(레이블) : time과 timeEnd 사이의 시간을 측정

- console.error(에러 내용) : 에러를 콘솔에 표시

- console.table(배열) : 테이블 형식으로 표현

- console.dir(객체, 옵션) : 객체를 콘솔에 표시할 때 사용

- console.trace(레이블) : 에러 발생 위치 추적

 

타이머

- setTimeout(콜백 함수, 밀리초) : 주어진 밀리초 이후에 콜백함수 실행

- setInterval(콜백 함수, 밀리초) : 주어진 밀리초마다 콜백함수를 반복 실행

- setImmediate(콜백 함수) : 콜백함수를 즉시 실행

- clearTimeout(아이디) : setTimeout을 취소 : 아이디 반환

- clearInterval(아이디) : setInterval을 취소 : 아이디 반환

- clearImmediate(아이디) : setImmediate를 취소 : 아이디 반환

const timeout = setTimeout(() => {
  console.log('1.5초 후 실행');
}, 1500);

const interval = setInterval(() => {
  console.log('1초마다 실행');
}, 1000);

const timeout2 = setTimeout(() => {
  console.log('실행되지 않습니다');
}, 3000);

setTimeout(() => {
  clearTimeout(timeout2);
  clearInterval(interval);
}, 2500);

const immediate = setImmediate(() => {
  console.log('즉시 실행');
});

const immediate2 = setImmediate(() => {
  console.log('실행되지 않습니다');
});

clearImmediate(immediate2);
즉시 실행 # 0초, immediate2는 바로 clearImmediate를 사용해서 취소했으므로 실행X
1초마다 실행 # interval
1.5초 후 실행 # timeout
1초마다 실행 # interval
# 2.5초가 지났을 때 clearTimeout과 clearInterval이 각각 timeout2와 interval을 취소

❗️setTimeout(콜백, 0)은 사용하지 않는게 좋다

- setImmediat(콜백)과 setTimeout(콜백, 0)에 담긴 콜백 함수는 같아 보이지만 파일 시스템 접근, 네트워킹 같은 I/O 작업의 콜백함수안에서 타이머를 호출하는 경우 setImmediate가 먼저 실행된다. 하지만 항상 먼저 실행되는 것은 아님! 그러므로 헷갈리지 않기 위해 setTimeout(콜백, 0)은 사용하지 않는 것을 권장

 

 

__filename, __dirname

- 각각 실행 시, 현재 파일명과 현재 파일 경로로 바뀜

 

module, exports

- module.exports와 exports는 둘다 모듈을 만들 때 사용하지만, 차이점은 module.exports는 한번에 여러개 변수를 대입할 수 있는 반면 exports 객체에 각각의 변수를 하나씩 넣을 수 있다. → 둘다 같은 객체를 참조하고 있기 때문

- exports는 module.exports를 참조하고 module.exports는 하나의 객체를 참조하므로 결국 exports도 그 객체를 참조하는 것

- 이런 혼동을 막기 위해 exports 객체와 module.exports를 동시에 사용하지 않는 것이 좋다.

 

this

- module.exports 또는 exports 객체를 가리킴

- 함수 선언문 내부의 this는 global 객체를 가리킴

 

require

// require.js
console.log('require가 가장 위에 오지 않아도 됩니다.');

module.exports = '저를 찾아보세요.';

require('./var');

console.log('require.cache입니다.');
console.log(require.cache);
console.log('require.main입니다.');
console.log(require.main === module);
console.log(require.main.filename);
$ node require
require가 가장 위에 오지 않아도 됩니다.
require.cache입니다.
[Object: null prototype] {
  'C:\\Users\\zerocho\\require.js': Module {
    id: '.',
    exports: '저를 찾아보세요.',
    parent: null,
    filename: 'C:\\Users\\zerocho\\require.js',
    loaded: false,
    children: [ [Module] ],
    paths: [
      'C:\\Users\\zerocho\\node_modules',
      'C:\\Users\\node_modules',
      'C:\\node_modules'
    ]
  },
  'C:\\Users\\zerocho\\var.js': Module {
    id: 'C:\\Users\\zerocho\\var.js',
    exports: { odd: '홀수입니다', even: '짝수입니다' },
    parent: Module {
      id: '.',
      exports: '저를 찾아보세요.',
      parent: null,
      filename: 'C:\\Users\\zerocho\\require.js',
      loaded: false,
      children: [Array],
      paths: [Array]
    },
    filename: 'C:\\Users\\zerocho\\var.js',
    loaded: true,
    children: [],
    paths: [
      'C:\\Users\\zerocho\\node_modules',
      'C:\\Users\\node_modules',
      'C:\\node_modules'
    ]
  }
}
require.main입니다.
true
C:\\Users\\zerocho\\require.js

require가 반드시 파일 최상단에 위치할 필요가 없음

module.exports도 최하단에 위치할 필요가 없음

require.cache : 파일에 대한 정보, 캐시형태로 저장

require.main : 노드 실행 시 첫 모듈을 가리킴

require.main === module : 현재 파일이 첫 모듈인지 알아보기 위한 코드

require.main.filename : 첫 모듈의 이름을 알아보기 위한 코드

 

process.env

- 시스템 환경 변수 정보 출력

- 서비스의 중요한 키를 저장하는 공간으로도 사용

 

process.nextTick(콜백)

- 이벤트 루프가 다른 콜백함수들보다 nextTick의 콜백함수를 우선적으로 처리하도록 만듦.

- setImmediate나 setTimeout보다 먼저 실행

- resolve된 Promise도 다른 콜백들보다 우선시 됨

→ nextTick과 Promise를 마이크로태스크라고 따로 구분지어 부름

 

process.exit(코드)

- 실행 중인 노드 프로세스를 종료

 

process

- 현재 실행되고 있는 노드 프로세스에 대한 정보를 담음

$ node
> process.version
v14.0.0 // 설치된 노드의 버전입니다.
> process.arch
x64 // 프로세서 아키텍처 정보입니다. arm, ia32 등의 값일 수도 있습니다.
> process.platform
win32 // 운영체제 플랫폼 정보입니다. linux나 darwin, freebsd등의 값일 수도 있습니다.
> process.pid
14736 // 현재 프로세스의 아이디입니다. 프로세스를 여러 개 가질 때 구분할 수 있습니다.
> process.uptime()
199.36 // 프로세스가 시작된 후 흐른 시간입니다. 단위는 초입니다.
> process.execPath
C:\\Program Files\\nodejs\\node.exe // 노드의 경로입니다.
> process.cwd()
C:\\Users\\zerocho // 현재 프로세스가 실행되는 위치입니다.
> process.cpuUsage()
{ user: 390000, system: 203000 } // 현재 cpu 사용량입니다.

 

 

 

 


Reference

- Node.js 교과서 개정 2판