- global
- 전역객체 (브라우저-window 와 같음)
- 수많은 속성 존재
- 파일 간에 간단한 데이터를 공유할 때 사용하기도 함
- 코드
(globalA.js)module.exports = () => global.message;
(globalB.js)
const A = require('./globalA'); global.message = '안녕하세요'; console.log(A());
(결과)
$ node globalB 안녕하세요
- global 객체의 속성 값을 대입하여 파일 간에 데이터를 공유할 수 있지만, 남용하면 어떤 객체에 값을 대입했는지 찾기 힘들어져 유지 보수에 어려움을 겪게 된다.
- 즉, 다른 파일의 값을 사용하고 싶다면 모듈을 만들자.
- 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('전체시간');
- 타이머
- 시간 메서드: 콜백함수를 주어지는 시간에 따라 실행하는 방법
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);
- filename, dirname
- 파일에 filename, dirname을 넣어두면 실행 시 현재 파일명과 파일 경로로 바뀜.
- 경로 구분자(\,/), 문자열로 반환될 가능성 등 때문에 path모듈과 함께 쓰임
- 코드
console.log(__filename); console.log(__dirname);
- 콘솔 결과
$ node filename.js C:\Users\zerocho\filename.js C:\Users\zerocho
- module.exports vs exports
- module.exports 와 exports는 동일하게 동작하며, 같은 객체를 참조(레퍼런스)한다
- 단, module.exports는 어떤 값이든 대입 가능하지만, exports는 반드시 프로퍼티와 값이 갖춰진 객체를 대입해야 한다
- 동시 사용은 지양한다
- 주의사항: 최상위 스코프의 this는 global이 아닌, module.exports 객체를 가리킨다. 함수 선언문 내부의 this는 global객체를 가리킨다.
- 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가 함수가 아니라 빈 객체로 표시됨
- 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 종료!