브라우저의 window
와 같은 전역 객체로 모든 파일에서 접근할 수 있다.
window.alert();
메서드를 그냥 alert();
으로 호출할 수 있는 것처럼 global
도 생략할 수 있다.
📚 globalThis
노드에는 DOM이나 BOM이 없어window
/document
객체를 노드에 사용할 수 없다. 노드에서window
/document
를 사용하면 에러가 발생한다. 따라서 이 둘을 아우르는globalThis
객체가 있다. 브라우저 환경에서globalThis
는window
, 노드에서는global
이 된다.
브라우저에서의 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
, setImmediate
는 window
대신 global
객체 안에 있다.
종류 | 설명 |
---|---|
setTimeout(cm, ms) | 주어진 밀리초 이후에 콜백 함수를 실행 |
setInterval(cb, ms) | 주어진 밀리초마다 콜백 함수를 반복 실행 |
setImmediate(cb) | 콜백 함수를 즉시 실행 |
위 함수들은 모두 아이디를 반환하므로 아이디를 사용하면 타이머를 튀소할 수 있다.
종류 | 설명 |
---|---|
claerTimeout(id) | setTimeout을 취소 |
claerInterval(id) | setInterval을 취소 |
claerImmediate(id) | setImmediate를 취소 |
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 사용량
이 정보들의 사용 빈도는 그리 높지 않지만, 일반적으로 운영체제나 실행 환경별로 다른 동작을 하고 싶을 때 사용한다.
REPL에 process.env를 입력하면 매우 많은 정보가 출력되는데, 이 정보들은 시스템의 환경 변수다.
시스템의 환경 변수 외에도 임의로 환경 변수를 저장할 수 있는데 서비스의 중요한 키를 저장하는 공간으로도 사용된다. 가령 서버나 데이터베이스의 비밀번호와 각종 API 키를 코드에 직접 입력하는 것은 위험하므로 아래와 같이 process.env
의 속성으로 대체할 수 있다.
const secretId = process.env.SECRET_ID;
const secretCode = process.env.SECRET_CODE;
이벤트 루프가 다른 콜백 함수들보다 nextTick
의 콜백 함수를 우선으로 처리하도록 한다.
// nextTick.js
setImmediate(() => {
console.log("immediate");
});
process.nextTick(() => {
console.log("nextTick");
});
setTimeout(() => {
console.log("timeout");
}, 0);
Promise.resolve().then(() => console.log("promise"));
process.nextTick
은 setImmediate
나 setTimeout
보다 먼저 실행된다. resolve
된 Promise
도 nextTick
처럼 다른 콜백들보다 우선시 된다.
그래서 process.nextTick
과 Promise
를 마이크로태스크(microtask)라고 따로 구분해서 부른다.
$ node nextTick
nextTick
promise
timeout
immediate
실행 중인 노드 프로세스를 종료한다. 서버 환경에서 이 함수를 사용하면 서버가 멈추므로 특수한 경우를 제외하고는 서버에서는 잘 사용하지 않는다.
하지만 서버 외의 독립적인 프로그램에서는 수동으로 노드를 멈추기 위해 사용한다.
// 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
: 웹어셈블리 처리를 담당한다.