노드의 기능(2): 노드 내장 객체

노드 내장 객체

  1. global
  • 전역객체 (브라우저-window 와 같음)
  • 수많은 속성 존재
  • 파일 간에 간단한 데이터를 공유할 때 사용하기도 함
  • 코드
    (globalA.js)
module.exports = () => global.message;

(globalB.js)

const A = require('./globalA');
global.message = '안녕하세요';
console.log(A()); 

(결과)

$ node globalB
안녕하세요 
  • global 객체의 속성 값을 대입하여 파일 간에 데이터를 공유할 수 있지만, 남용하면 어떤 객체에 값을 대입했는지 찾기 힘들어져 유지 보수에 어려움을 겪게 된다.
  • 즉, 다른 파일의 값을 사용하고 싶다면 모듈을 만들자.
  1. console
  • global 객체 안 프로퍼티(속성)
  • 디버깅을 위해 사용
  • console
    console.time(라벨): console.timeEnd(라벨)과 대응되어 같은 라벨을 같인 time과 timeEnd 사이의 시간을 측정
    console.log(내용): 평범한 로그를 콘솔에 표시. console.error(에러 내용): 에러를 콘솔에 표시
    console.table(배열): 배열의 요소로 객체 리터럴을 넣으면 객체의 속성들이 테이블 형식으로 표현됨
    console.dir(객체, 옵션): 객체를 콘솔에 표시할 때 사용. 옵션의 종류는 colors(true로 설정하면 콘솔에 색이 추가됨), depth(객체 안의 객체를 몇 단계까지 보여줄지 결정)가 있음.
    console.trace(라벨): 에러가 어디서 발생했는지 추적 가능(대부분 에러 발생시 위치도 알려주지만, 간혹 안 알려주면 유용)
  • 코드
const string = 'abc';
const number = 1;
const boolean = true;
const obj = {
  outside: {
    inside: {
      key: 'value',
    },
  },
};
console.time('전체시간');
console.log('평범한 로그입니다 쉼표로 구분해 여러 값을 찍을 수 있습니다');
console.log(string, number, boolean);
console.error('에러 메시지는 console.error에 담아주세요');
console.table([{ name: '제로', birth: 1994 }, { name: 'hero', birth: 1988}]);
console.dir(obj, { colors: false, depth: 2 });
console.dir(obj, { colors: true, depth: 1 });
console.time('시간측정');
for (let i = 0; i < 100000; i++) {}
console.timeEnd('시간측정');
function b() {
  console.trace('에러 위치 추적');
}
function a() {
  b();
}
a();
console.timeEnd('전체시간');
  1. 타이머
  • 시간 메서드: 콜백함수를 주어지는 시간에 따라 실행하는 방법
    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);
  1. filename, dirname
  • 파일에 filename, dirname을 넣어두면 실행 시 현재 파일명과 파일 경로로 바뀜.
  • 경로 구분자(\,/), 문자열로 반환될 가능성 등 때문에 path모듈과 함께 쓰임
  • 코드
console.log(__filename);
console.log(__dirname);
  • 콘솔 결과
$ node filename.js
C:\Users\zerocho\filename.js
C:\Users\zerocho 
  1. module.exports vs exports
  • module.exports 와 exports는 동일하게 동작하며, 같은 객체를 참조(레퍼런스)한다
  • 단, module.exports는 어떤 값이든 대입 가능하지만, exports는 반드시 프로퍼티와 값이 갖춰진 객체를 대입해야 한다
  • 동시 사용은 지양한다
  • 주의사항: 최상위 스코프의 this는 global이 아닌, module.exports 객체를 가리킨다. 함수 선언문 내부의 this는 global객체를 가리킨다.
  1. require
  • 첫 모듈:
    require.main과 module이 동일하다(===)
    이름을 알아보려면 require.main.filename을 누르면 된다.
  • require.cache:
    각 모듈조각의 정보가 들어있다.
    만약 새로 require하기 원한다면 require.cache를 삭제하면 된다.
  • 순환참조:
    나중에 참조된 모듈이 빈 객체로 표시된다
  • 코드: 순환참조 코드
    (dep1.js)
const dep2 = require('./dep2');
console.log('require dep2', dep2);
module.exports = () => {
  console.log('dep2', dep2);
};

(dep2.js)

const dep1 = require('./dep1');
console.log('require dep1', dep1);
module.exports = () => {
  console.log('dep1', dep1);
};

(콘솔결과)

dep1 의 module.exports가 함수가 아니라 빈 객체로 표시됨
  1. process
  • 사용빈도가 높지 않지만, 실행환경별 다른 동작을 하고 싶을 때 사용되는 프로퍼티/메서드
    process.version : 설치된 노드의 버전
    process.arch : 프로세서 아키텍처 정보
    process.platform: 운영체제 플랫폼 정보
    process.pid: 현재 프로세스의 아이디
    process.uptime(): 프로세스가 시작된 후 흐른 시간(단위: 초)
    process.execPath: 노드의 경로
    process.cwd() : 현재 프로세스가 실행되는 위치
    process.cpuUsage(): 현재 cpu 사용량

process.env:
시스템의 환경 변수. 노드에 직접 영향을 미치기도 함.

  • NODE_OPTIONS: 노드를 실행할 때 옵션들을 입력받는 환경 변수
    코드: 노드의 메모리를 8GB까지 사용할 수 있도록 값을 부여
NODE_OPTIONS =--max-old-space-size=8192 
  • UV_THREADPOOL_SIZE: 노드에서 기본적으로 사용하는 스레드풀의 스레드 개수를 조절
    코드: 스레드풀의 스레드 개수가 8개
UV_THREADPOOL_SIZE=8
  • 서버나 데이터베이스의 비밀번호와 각종 API키 저장
    코드: 중요한 비밀번호를 process.env의 속성으로 대체
const secretId = process.env.SECRET_ID;
const secretCode = process.env.SECRET_CODE;

process.nextTick(콜백)

  • 이벤트 루프가 다른 콜백 함수보다 nextTick의 콜백 함수를 우선으로 처리하도록 만듬
  • 코드: 누가 먼저 실행될까?
setImmediate(() => {
  console.log('immediate');
});
process.nextTick(() => {
  console.log('nextTick');
});
setTimeout(() => {
  console.log('timeout');
}, 0);
Promise.resolve().then(() => console.log('promise'));
  • 콘솔 결과
$ node nextTick
nextTick
promise
timeout
immediate

process.exit(코드)

  • 실행 중인 노드 프로세스를 종료
  • 서버에서 사용하면 서버가 멈춤
  • 인수로 코드 번호를 줌
  • 인수를 주지 않거나 0을 줌: 정상종료
  • 인수로 1을 줌: 비정상 종료 /에러가 발생하여 종료하는 경우도 해당
  • 코드: setInterval로 반복되는 코드를 process.exit()로 멈춤
setInterval(() => {
  if (i === 5) {
    console.log('종료!');
    process.exit();
  }
  console.log(i);
  i += 1;
}, 1000);
  • 콘솔 결과
$ node exit
1
2
3
4
종료!

좋은 웹페이지 즐겨찾기