본문 바로가기
Back-End Frameworks/Node.js

2)Nodejs_기능 정리_노드 내장 모듈(1) REPL, Global, console, Timer, module, exports, require, process

by Downy_J 2023. 7. 4.
728x90
반응형
SMALL


REPL

JS는 Script언어라 컴파일이 따로 필요 없이 즉석해 코드 실행이 된다

 

Node에서도 비슷한 콘솔을 제공하며

코드를 읽고(Read), 읽은걸 해석(Eval)하고, 해석 끝난 결과 반환(Print)하고, 이를 종료 할때까지 반복(Loop)한다

하여 REPL 이라 부른다

 

그럼 어디다 작성을 하나.. 콘솔이 어딧으?

VS Code에서 [Control] + [ ` ]을 누르면 바로 콘솔창이 띄워진다

그럼. . node를

 

실행 해 보자!

준비 완료!

> 모양으로 바껴있다면 이제 JS코드를 써도 좋다

(일반 cmd창 띄워 해도 상관 읎음. .)

노드는 이렇게 터미널에 작성하는걸로도 html페이지의 콘솔창에 쓰는거랑 동일하게 작성이 됨.


JS 파일 실행

코드 직접 입력 말고

이번엔 .js 파일을 실행 해보자

이 경로의 파일을 실행 할거다
그 안에는 이런게 들어있
node [ JS파일 경로]를 입력해주면 이렇게 함수가 실행되는걸 볼 수있다

모든 개발 언어가 이렇게 실행이 되나 모르겠는데
내가 아는 선에선 Python의 크롤러를 만들어 스케줄러로 자동 실행 했던 기억이 있다( 어떻게 했나 모름. . 내가안해서 ㅜㅜ)

모듈화

브라우저의 JS와 노드의 JS의 차이라면 

모듈일것 같다

 

모듈화 시켜놓으면 여러 프로그램에서 해당 모듈만 그냥 갖다 쓸수 있는거다

프로그램 모듈 도입
---------------->
1번 모듈 A로
---------------->
프로그램 A
2번 모듈 A, B로
---------------->
 
3번 모듈 B로
---------------->
프로그램 B
index.js func.js var.js 결과
여기선 앞의 두 모듈을 불러오고 있다
모듈로부터 값을 불러올땐
처음의 checkOddOrEven이라는 변수명을 checkNumber로 바꿔 담을수 있다는걸 알수 있음
require() 안에 불러올 모듈 주소 위치 적고 뒤의 확장자 명은 생략해도 두관함

지금은 저걸로 불러와 아까 모듈안에 있는 값을 사용하는 모습이며 다시 모듈 에 함수를 대입 한 모양이다
홀, 짝 변수 두개 선언해준다음 module.exports 에 각 변수 대입해 줬다

이제 다른 파일에서 이 파일을 불러오면 저 대입된 모듈이 사용될거다
이렇게 모듈화 시켜 놓으면 편히 하다는 장점과 함께 모듈간 관계가 얽히게되면 그 구조 파악이 쉽지 않나느 단점이 함께 존재함

노드 내장 객체

노드엔 기본 내장 객체와 내장 모듈이 있다

지금 그거 알아볼거다


Global

브라우저의 window와 같은 전역 객체다

global 객체 내부에는 아주 많은 속성들이 존재함

 

consol.log(); 도 사실

global.consol.log()다

단지 생략이 되서 안썻을 뿐..

이걸 뭐 다 외우고 알 필요는 없고 자주 쓰는것만 알면 될거 같음

 

globalA globalB

앞에 global을 붙이는걸로 이렇게도 되네..

 

globalA 모듈의 함수는 global.message 값을 반환.

globalB는 global 객체에 속성명이 message인 값을 대입한뒤 globalA 모듈 함수를 호출.

그래서 콘솔의 결과가 globalB에 넣은 global.message 값을 globalA에서도 접근이 됨을 알수 있음

 

global 객체를 남용하면 안됨!!

규모가 커질수록

어떤 파일에서 이 global 객체에

값을 대입 했는가 찾기가 어렵기 땜에

유지보수를 생각하다면 명시적으로 모듈 만들어

쓰는게 오히려 좋다


console

주로 디버깅 할 때 씀

 

변수에 값은 잘 들어가 있는지,

에러시 에러내용이 뭔지,

코드의 실행 시간을 알고싶거나, 등에 쓰임

.log(내용) 평범한 로그를 출력
.time(레이블) .timeEnd()와 세트로 사용되어 이 둘 사이 시간을 측정.
.error(에러 내용) 에러를 콘솔에 출력
.table(레이블) 배열의 요소로 객첼르 넣으면, 객체의 속성들이 테이블 형식으로 출력됨
.dir(개체, 옵션) 객체를 콘솔에 표시.
.trace(레이블) 에러가 어디서 뜬건지 추적.
일반적으로 에러 뜨면 그 위치 알려주기때문에 자주 쓰이진 않음

Timer

setTimeout(콜백 함수, 밀리초); 주어진 시간(밀리초)이후 콜백 함수 실행
sertInterval(콜백 함수, 밀리초); 주어진 시간(밀리초) 마다 콜백 함수 실행
setImmediate(콜백 함수); 콜백 함수 즉시 실행
clearTimout(id); setTimeout 취소
clearInterval(id); sertInterval 취소
clearImmediate(id); setImmediate 취소

< 진행 순서 >

  1. (0초) immediate, immediate2
  2. (1초) interval
  3. (1.5초) timeout
  4. (2초) interval
  5. (2.5초) timeout2, interval

__filename

__dirname

노드는 파일들이 모듈로써 서로 관계되는 경우가 많음

때문에 파일의 경로 혹은 파일명을 알아야 한다

 

console.log(__filename) 현재 파일 명
console.log(__dirname) 현재 파일 경로

module, exports, require

모듈을 만들때 module.exports만 썻는데

module객체 말고 exports 객체로도 모듈을 만들수 있다

 

위에 var.js 파일을 수정해서 이렇게. .

Before After

해되 된다.

 

이게 되는 이유는

console.log(module.exports === exports);

true

 

불러올때 쓰는 require는 함수다

함수는 객체고 그렇다면 require는 객체로서 속성들이 있다

속성 값으로 각 파일의 모듈 객체가 들어있다

그래서 한번 require 하면 require.cache에 저장 되기때문에

재사용이 가능 해서 또 require 할 필요가 없다.

 

[ 모듈 사용시 주의 할 점 ]

모듈A와 모듈 B가 서로를 require한다면?

지금 이거 서로를 불러들이는거라 계속 반복 될거다..

 

moduleA의 module.exports가 함수가 아닌 { } 이런 빈객체가 됬다.

이런 현상을 순환 참조라 부르며 이런 경우가 있을시 참조 대상을 빈 객체로 만든다

 

에러가 뜨진 않고 그냥 빈객체로 만들어버리기에

동작함에 있어 이상이 발생할 수 있다

 

애초에 이런 식으로 프로그램 구조를 짜지 말자


process

현재 실행하는 node process의 정보를 담고 있음.

process.version 설치된 노드 버전
process.arch 프로세서 아키텍쳐 정보
process.platform OS 플랫폼 정보.
process.pid 현 프로세스의 아이디. 프로세스를 여러개 갖을 때 구분 할 수있다
process.uptime() 프로세스가 시작 후 흐른 시간. 단위는 초 다위
process.execPath 노드 경로
process.cwd() 현재 프로세스 실행 위치
process.cpuUsage() 현재 CPU 사용량

process.env

입력 하게 되면 노드가 설치되있는

이 컴퓨터의 시스템 환경 변수들이 출력이 된다

 

그리고 시스템 환경 변수는 노드에 직접 영향을 끼치기도 한다

 

이 process.env는 서비스의 중요한 키를 저장하는 곳으로도 쓰인다

서버나 DB의 비밀번호 그리고 각종 API키를 코드로 직접 써넣는건 위험하며

해킹을 당해 해당 코드가 유출이 될시에는 그곳에 남아있는 비밀번호들이 들어나 위험할수있다

 

 

이런 식으로 process.env 속성을 사용해야 한다

[넣는 방법 : dotenv ]

=>

 


process.nextTick(콜백)

이벤트 루프가

다른 콜백 함수들 보다 더

nextTick(() => { } 이 콜백 함수를 우선 처리하도록 만듦

 

그러니깐 태스트 큐가 있고 마이크로태스트 큐가 있는데

저 순서대로 했는데 결과가 이렇게 나오는 이유는

 

process.nextTick()와 Promise.resolve()는 마이크로태스크 큐기 때문

 

그러나

이런 마이크로태스크 큐를 재귀호출 하면

이벤트 루프는 다른 콜백 함수보다 더 

우선시 처리 하므로 다른 콜백 함수가

실행 안될 수도 있음

 

의문. . 이걸 어따 쓰지??

A B C D  이렇게 각자 다르게 개발할 일이 있나?

우선순위를 둬가면서??

차피 코드는 위에서 아래로 흐르고

호이스팅 이라고 무조건 상위로 올려버리는것도

순서대로 움직이는데...

흠............... 이해 못하겠네 이걸 어따쓴다는거여???


process.exit()

실행중인 노드 서버를 종료

process.exit() 메서드는 인수로 코드번호를 줄 수있음

저대로 하거나 0을 주면 정상종료

1을 주면 비정상종료 를 한다

 

에러나서 비정상 종료를 해야 한다면 1을 넣음 된다

728x90