[Node.js 교과서] 내장 객체

fe.syhan·2023년 11월 28일
0

Node.js

목록 보기
3/4
post-thumbnail

Node.js 교과서


내장객체

global

브라우저의 window와 같은 전역 객체로 모든 파일에서 접근할 수 있다.
window.alert(); 메서드를 그냥 alert();으로 호출할 수 있는 것처럼 global도 생략할 수 있다.

📚 globalThis
노드에는 DOM이나 BOM이 없어 window/document 객체를 노드에 사용할 수 없다. 노드에서 window/document를 사용하면 에러가 발생한다. 따라서 이 둘을 아우르는 globalThis 객체가 있다. 브라우저 환경에서 globalThiswindow, 노드에서는 global이 된다.

console

브라우저에서의 console과 거의 비슷하다. 보통 디버깅을 위해 사용하는데 다양한 메서드들이 있고 새로운 메서드들이 계속 추가 되고 있다.

종류설명
time(레이블)timeEnd(레이블)과 대응되어 같은 레이블을 가진 time과 timeEnd 사이의 시간을 측정한다.
log(내용)평범한 로그를 콘솔에 표시한다.
console.log(내용1, 내용2, ...)처럼 여러 내용을 동시에 표시할 수도 있다.
error(에러 내용)                             에러를 콘솔에 표시한다.
table(배열)배열의 요소로 객체 리터럴을 넣으면, 객체의 속성들이 테이블 형식으로 표현된다.
dir(객체, 옵션)객체를 콘솔에 표시할 때 사용한다. 첫 번째 인수로 표시할 객체, 두 번째 인수로 옵션.옵션의 colors를 true로 하면 콘솔에 색이 추가되어 보겨 편하다.
depth는 객체 안의 객체를 몇 단계까지 보여줄지를 정한다. 기본값=2
trace(레이블)에러가 어디서 발생했는지 추적할 수 있게 한다. 보통은 에러 발생시 에러 위치를 알려주므로 사용하지 않지만 위치가 나오지 않는다면 사용할 만하다.
// console.js
const str = "abc";
const num = 1;
const bool = true;
const obj = {
  outside: {
    inside: {
      key: "value",
    },
  },
};

console.time("전체 시간");
console.log("평범한 로그. 쉼표로 구분해 여러 값을 찍을 수 있다.");
console.log(str, num, bool);
console.error("에러 메시지는 console.error에 담아주세요.");

console.table([
  { name: "승열", birth: 1993 },
  { name: "진우", birth: 1994 },
]);

console.dir(obj, { colors: false, depth: 2 });
console.dir(obj, { colors: true, depth: 1 });

console.time("시간 측정");
for (let i = 0; i < 10000; i++) {}
console.timeEnd("시간 측정");

function b() {
  console.trace('에러 위치 추적')
}
function a() {
  b();
}
a();

console.timeEnd('전체 시간')

타이머

타이머 기능을 제공하는 함수인 setTimeout, seInterval, setImmediatewindow대신 global객체 안에 있다.

종류설명
setTimeout(cm, ms)주어진 밀리초 이후에 콜백 함수를 실행
setInterval(cb, ms)주어진 밀리초마다 콜백 함수를 반복 실행
setImmediate(cb)콜백 함수를 즉시 실행

위 함수들은 모두 아이디를 반환하므로 아이디를 사용하면 타이머를 튀소할 수 있다.

종류설명
claerTimeout(id)setTimeout을 취소
claerInterval(id)setInterval을 취소
claerImmediate(id)setImmediate를 취소

process

process 객체는 현재 실행되고 있는 노드 프로세스에 대한 정보를 담고 있다.

$ node
> process.version
'v20.9.0' // 설치된 노드의 버전
> process.arch
'x64' // 프로세서 아키텍쳐 정보. linux, darwin, freebsd 등의 값일 수도 있다.
> process.platform
'win32' // 운영체제 플랫폼 정보. arm, ia32 등 다를 수 있다.
> process.pid
19264 // 현재 프로세스의 아이디.
> process.uptime()
109.5123737 // 프로세스가 시작된 후 흐른 시간.단위는 초
> process.execPath
'C:\\Users\\yeol\\AppData\\Roaming\\nvm\\v20.9.0\\node.exe'
// 노드의 경로
> process.cwd()
'D:\\바탕화면\\study\\node.js' // 현재 프로세스가 실행되는 위치
> process.cpuUsage()
{ user: 218000, system: 93000 } // 현재 CPU 사용량

이 정보들의 사용 빈도는 그리 높지 않지만, 일반적으로 운영체제나 실행 환경별로 다른 동작을 하고 싶을 때 사용한다.

process.env

REPL에 process.env를 입력하면 매우 많은 정보가 출력되는데, 이 정보들은 시스템의 환경 변수다.

시스템의 환경 변수 외에도 임의로 환경 변수를 저장할 수 있는데 서비스의 중요한 키를 저장하는 공간으로도 사용된다. 가령 서버나 데이터베이스의 비밀번호와 각종 API 키를 코드에 직접 입력하는 것은 위험하므로 아래와 같이 process.env의 속성으로 대체할 수 있다.

  const secretId = process.env.SECRET_ID;
  const secretCode = process.env.SECRET_CODE;

process.nextTick(cb)

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

  // nextTick.js
  setImmediate(() => {
    console.log("immediate");
  });
  process.nextTick(() => {
    console.log("nextTick");
  });
  setTimeout(() => {
    console.log("timeout");
  }, 0);
  Promise.resolve().then(() => console.log("promise"));

process.nextTicksetImmediatesetTimeout 보다 먼저 실행된다. resolvePromisenextTick처럼 다른 콜백들보다 우선시 된다.
그래서 process.nextTickPromise를 마이크로태스크(microtask)라고 따로 구분해서 부른다.

  $ node nextTick
  nextTick
  promise
  timeout
  immediate

process.exit(코드)

실행 중인 노드 프로세스를 종료한다. 서버 환경에서 이 함수를 사용하면 서버가 멈추므로 특수한 경우를 제외하고는 서버에서는 잘 사용하지 않는다.
하지만 서버 외의 독립적인 프로그램에서는 수동으로 노드를 멈추기 위해 사용한다.

// exit.js
let i = 1;
setInterval(() => {
  if(i === 5) {
	console.log('종료');
    process.exit();
  }
  console.log(i); 
  i+=1;
}, 1000);

process.exit() 메서드는 인수로 코드 번호를 줄 수 있다. 인수를 주지 않거나 0을 주면 정상 종료, 1을 주면 비정상 종료를 뜻한다.

기타 내장 객체

  • URL, URLSearchParams
  • AbortController, FormData, fetch, Headers, Request, Response, Event, EventTarget: 브라우저에서 사용하던 API가 노드에도 동일하게 있다.
  • TextDecorder: Buffer를 문자열로 바꾼다.
  • TextEncoder: 문자열을 Buffer로 바꾼다.
  • WebAssembly: 웹어셈블리 처리를 담당한다.

0개의 댓글