Ryu.log

[ NodeJS 09 ] global 객체 본문

Prev-content

[ NodeJS 09 ] global 객체

류뚝딱 2018. 8. 2. 18:16


1. global 객체

지금부터는  Node내장객체에 대해 알아보자.
브라우저에서 window라는 전역 객체를 많이 사용했을것이다.
그렇다면 Node에서 window를 찍어보면 어떻게 될까? 한번찍어보자.


window is not defined.. 찾을수 없다고나온다... window를 사용할 수가 없다.

그렇다면 Node에서는 전역 객체가 없는 것일까?... 아니다. Node에는 global이라는 새로운 전역 객체가 존재한다.

같은 방식으로 global을 찍어보면



global을 console.log()로 찍었을 때 위같은 정보들이 쏟아져나온다. ( 최신브라우저에서는 Node와 통일을위해  global객체를 반영했다. )

어짜피 쓰다 보면... 외워질 것이니 일단 각각이 무엇인지는 패스하고.

익숙한것 하나만 봐보자.



익숙한 setTimeout이 보인다.  

브라우저 window객체에서 setTimeout을 사용할때, window.setTimeout이라 쓰지않고, 그냥 setTimeout만 쓰는 이유는

어짜피 전역 객체인 window는 생략 가능하기 때문이다.


Node에서도 마찬가지로 global을 생략할 수 있다.

global.setTimeout -> setTimeout


전역 객체라는 것은 어디에서나 접근가능한 것을 전역객체라 하는데, 설명보다는 코드로 한번보자.

먼저 globalA.js와 globalB.js를 만들어보자.

// nodeStudy/globalB.js
global.message = '안녕하세요';
// nodeStudy/globalA.js
module.exports = () => global.message;

globalB.js에서 global의 message에 "안녕하세요"를 대입했는데 이것을,

globalA.js에서 별다른 require같은것 없이 사용이 가능하다.


이유는 전역 객체이기 때문에 파일 간 global이 공유되기 때문이다.


이번에는 globalA.js에서 module.exports를 했으니 그것을 globalB.js 에서 다시 사용해보자.

// nodeStudy/globalB.js
const A = require('./globalA')

global.message = '안녕하세요';
console.log(A());
globalA.js에서 화살표 함수를 통해서 내보내진 global.message

globalB.js에서 require되어 A라는 변수에 담기게 된다. 그렇다면 아래 console.log(A())의 결과를 예측해보자.



정상적으로 globalB.js에서 대입한 message속성을 globalA.js에서 받아 사용했다.

그렇다면 변수같은 것들을 선언할때 global을 사용하여 다 선언하면 더 쉽고, 좋지않을까 ? 라는 생각을 하게 되는데,

만약 그렇게 된다면.....



위사진을 보자 이전에 언급 했었지만, 기존 front-end 에서 사용했던 script 형식의 마구잡이 링크 방식과 별반차이가 없게된다.


협업하거나 코드를 작성하면서 global.message에 값을 누군가가 넣었나 ? 이런것을 확신할 수 없고,
그리고 누구나 접근가능한 global객체에는 누군가가 값을 바꿔버릴 수도 있다.

그런 이유로 global에 직접 값을 넣어서 사용 하는 일은 거의 없다고 보면되고, 
global이 모든파일에서 사용 가능하기 때문에 편하다고 생각할수도 있지만,
이런 편함이 프로그래밍에서는 위험이 될 수 있기 때문에 사용하지 않는게 좋다.


'Prev-content' 카테고리의 다른 글

[ React redux 01 ] Redux의 소개  (0) 2018.09.04
[ NodeJS 10 ] console 객체  (0) 2018.08.06
[ NodeJS 08 ] 모듈 시스템  (0) 2018.07.30
[ NodeJS 07 ] async / await  (0) 2018.07.27
[ NodeJS 06 ] 프로미스(Promise) API  (0) 2018.07.26
Comments