[node] global 전역 객체

jaylight·2021년 2월 21일
3

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(콜백) vs setTimeout(콜백, 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.exportsexports 객체를 참조하기 때문이다.

module.exports = {
  odd,
  even,
}
exports.odd = '홀수입니다'
exports.even = '짝수입니다'

다만, module.exports에는 어떤 값이든 대입 가능하지만, exports에는 반드시 객체처럼 속성명-속성값 형태로 대입해야한다. exports에 다른 값을 대입하면 참조 관계가 끊겨 모듈로써 기능하지 않으므로, 한 모듈에서 exports 객체와 module.exports를 동시에 사용하는 것을 지양한다.

require

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

process.env에는 시스템 환경 변수를 담고 있으며 대표적으로 UV_THREADPOOL_SIZE, NODE_OPTIONS가 있다. UV_THREADPOOL_SIZE는 node 실행에 기본적으로 사용하는 스레드풀의 스레드 갯수를 조정하며, NODE_OPTIONS에서는 node 실행 시 옵션들을 입력받는 환경 변수이다. 또한, 시스템 환경변수 외에도 임의의 환경변수들을 저장할 수 있으며, 보안이 중요한 서버나 데이터베이스 비밀번호, API키 등을 저장하는 공간으로 활용할 수 있다.

process.nextTick(콜백)

이벤트루프는 nextTick(콜백)을 다른 콜백함수보다 우선적으로 처리한다. resolve된 Promise 함수 또한 이와 유사하게 다른 콜백보다 우선되어 실행되며, 이러한 우선 처리되는 함수들을 microtask로 따로 구분지어 부른다.

정보 출처: node.js 교과서 (제 2판)

0개의 댓글