global
global
은 전역 객체로, node 환경 내에서 모든 파일에서 접근 가능하고 내부의 메서드를 global
표기를 생략하고 사용이 가능하다. 내부에 message
, console
,
message
파일 간 간단한 데이터 공유에 활용할 수 있으며, global.message
에 메시지를 할당하면 다른 모듈들에서도 접근이 가능해짐
// globalA.js
module.exports() = () => global.message;
// globalB.js
const A = require('./globalA');
global.message = '안녕하세요';
console.log(A());
globalB
를 실행하면, 내부에 담긴 globalA
모듈 함수인 global.message를 호출하지만, 호출된 결과값으로 globalB.js
에서 message에 대입한 '안녕하세요'가 반환됨
global 객체 남용
global 객체를 남용할 경우, 프로그램 규모가 커졌을 때, 객체에 대입된 값 추적이 어려워지므로, 모듈 형식으로 만들어서 명시적으로 값을 불러오는 것을 추천
console
개발 중 디버깅을 위해 변수 내부 값 확인, 에러 내용 표시, 코드 실행 시간 표시 등을 위해 사용하며, 대표적인 메서드로 console.log 가 있음
console.time(레이블)
: console.timeEnd(레이블)과 대응되어 같은 레이블을 가진 time ~ timeEnd 사이의 시간 측정console.log(내용)
: 평범한 로그를 콘솔에 표시하며 ,
로 연결하여 여러 내용을 동시에 표기 가능console.error(에러 내용)
: 에러를 콘솔에 표시console.table(배열)
: 배열의 요소로 객체 리터럴을 넣으면 객체 속성들이 테이블 형식으로 표현console.dir(객체, 옵션)
: 객체를 콘솔에 표시할 때 활용, 옵션에 colors, depth를 지정하여 표기 방식을 설정할 수 있음console.trace(테이블)
: 에러가 어디서 발생했는지 추적할 때 활용setTimeout(콜백 함수, 밀리초)
: 주어진 밀리초(1,000분의 1초) 이후에 콜백 함수를 실행setInterval(콜백 함수, 밀리초)
: 주어진 밀리초마다 콜백 함수를 반복 실행setImmediate(콜백 함수)
: 콜백 함수를 즉시 실행위 타이머 함수는 모두 아이디를 반환하며, 해당 아이디를 활용하여 타이머 취소가 가능
clearTimeout(아이디)
: setTimeout을 취소clearInterval(아이디)
: setInterval을 취소clearImmediate(아이디)
: setImmediate를 취소
setImmediate(콜백)
vssetTimeout(콜백, 0)
- 두 함수 모두 인자의 콜백을 즉시 실행시키지만, 두 가지를 동시에 사용할 경우 상황에 따라 먼저 실행되는 함수는 다르게 나타남
- 파일 시스템 접근, 네트워킹 같은 I/O 작업의 콜백 함수 안에서 타이머를 호출하는 경우,
setImmediate(콜백)
가setTimeout(콜백, 0)
보다 먼저 실행- 위와 같은 예외 상황을 고려해서, 가능하면
setTimeout(콜백, 0)
은 사용하지 않는 것을 권장
__filename
, __dirname
위 키워드는 현재 파일 경로나 파일명에 대한 정보를 제공한다.
console.log(__filename)
console.log(__dirname)
C:\Users\zerocho\filename.js
C:\Users\zerocho
__dirname
으로 경로 확인 시, 문자열로 반환되며, OS에 따라 /
, \
로 반환되는 구분자 문제가 있어서, path
모듈을 함께 활용함
module
, exports
, require
exports
module
객체에 포함된 exports (module.exports
) 대신, exports
객체로도 모듈 생성이 가능하며, 두 방법 모두 동일하게 동작한다. 이는 module.exports
가 exports
객체를 참조하기 때문이다.
module.exports = {
odd,
even,
}
exports.odd = '홀수입니다'
exports.even = '짝수입니다'
다만, module.exports
에는 어떤 값이든 대입 가능하지만, exports
에는 반드시 객체처럼 속성명-속성값
형태로 대입해야한다. exports
에 다른 값을 대입하면 참조 관계가 끊겨 모듈로써 기능하지 않으므로, 한 모듈에서 exports
객체와 module.exports
를 동시에 사용하는 것을 지양한다.
require와 module.exports는 통상적으로 파일의 최상단과 최하단에서 사용하지만, 위치가 반드시 고정되는 것은 아니다.
require.cache
객체에는 속성 값으로 각 파일의 모듈 객체가 들어있어서, 한 번 require한 파일은 위 객체에 정보가 저장되어서 새로 require할 때 새로 불러오지 않고, 캐시된 정보를 재사용한다. 캐시된 속성 정보로는 module.exports한 부분, 로딩 여부, 부모 자식 모듈 관계 등을 포함한다.
require.main
은 node 실행 시 첫 모듈을 가리키며, 현재 파일이 첫 모듈인지 알아보려면, require.main == module
을 활용하여 boolean 값을 반환받을 수 있으며, 첫 모듈 이름을 알아보려면 require.main.filename
을 활용한다.
process
process 객체는 현재 실행 중인 node 프로세스에 대한 정보를 담고 있으며, REPL에 각 메서드를 입력하며 값을 확인할 수 있다.
> process.version // 설치된 노트 버전
> process.arch // 프로세서 아키텍처 정보
> process.platform // 운영체제 플랫폼
> process.pid // 현재 프로세스 id (프로세스가 여러 개일때 구분을 가능하게 함)
> process.uptime() // 프로세스가 시작된 후 지난 시간
> process.execPath // 노드의 경로
> process.cwd() // 현재 프로세스 실행 위치
> process.cpuUsage() // 현재 cpu 사용량
process.env에는 시스템 환경 변수를 담고 있으며 대표적으로 UV_THREADPOOL_SIZE
, NODE_OPTIONS
가 있다. UV_THREADPOOL_SIZE
는 node 실행에 기본적으로 사용하는 스레드풀의 스레드 갯수를 조정하며, NODE_OPTIONS
에서는 node 실행 시 옵션들을 입력받는 환경 변수이다. 또한, 시스템 환경변수 외에도 임의의 환경변수들을 저장할 수 있으며, 보안이 중요한 서버나 데이터베이스 비밀번호, API키 등을 저장하는 공간으로 활용할 수 있다.
이벤트루프는 nextTick(콜백)을 다른 콜백함수보다 우선적으로 처리한다. resolve된 Promise 함수 또한 이와 유사하게 다른 콜백보다 우선되어 실행되며, 이러한 우선 처리되는 함수들을 microtask로 따로 구분지어 부른다.
정보 출처: node.js 교과서 (제 2판)