상세 컨텐츠

본문 제목

[Node.js] 3장 노드 기능 알아보기

21-22/21-22 Node.js

by Kimpeep 2021. 10. 11. 14:00

본문

728x90

1. REPL 사용하기

  • REPL이란?

출처: Node.js 교과서 개정2판(조현영 저) 90페이지

REPL : Read(읽고), Eval(해석하고), Print(결과물을 반환하고), Loop(종료할 때까지 반복한다)
     -> 컴파일을 하지 않고 즉석에서 자바스크립트 코드를 입력할 수 있는 노드의 콘솔
  • REPL 사용해보기
윈도 - 명령 프롬프트(cmd)를 열고 node 입력
맥, 리눅스 - 터미널을 열고 node 입력
VS Code - Ctrl + ` 을 누르고 node 입력
=> 명령 프롬프트, 터미널을 콘솔로 통칭

예시 코드

VS Code에서 실행

  • REPL 종료하기 : Ctrl + c를 두 번 누르기 or REPL 창에 .exit 입력

예시 코드

.exit으로 REPL 종료

 


 

2. JS 파일 실행하기

콘솔에서 node [자바스크립트 파일 경로]로 실행
확장자(.js)는 생략 가능

예시 코드

// helloWorld() 함수 정의
function helloWorld() {
  console.log("Hello world");
  helloNode(); // helloNode() 함수 호출
}

// helloNode() 함수 정의
function helloNode() {
  console.log("Hello Node");
}

helloWorld(); // helloWorld() 함수 호출

VS Code에서 작성한 모습

결과

 

파일/폴더 이름 제한
/, \, |, >, :, ", ?, * 등은 이름에 쓸 수 없음.

 


 

3. 모듈로 만들기

  • 모듈이란?
노드는 코드를 모듈로 만들 수 있다는 점 -> 브라우저의 자바스크립트와의 차이점
모듈 : 특정한 기능을 하는 함수나 변수들의 집합
        -> 모듈 자체로도 하나의 프로그램이면서 다른 프로그램의 부품으로도 사용 가능
  • 모듈 사용 시장점
- 여러 프로그램에 모듈 재사용 가능
- 파일 하나가 모듈 하나 -> 파일별로 코드를 모듈화 할 수 있어 관리 편리함

출처 : Node.js 교과서 개정 2판(조현영 저) 93페이지

  • 모듈 만들어보기
필요한 파일
1. 모듈이 될 파일
2. 모듈을 불러와서 사용하는 파일

예시 코드

// 모듈이 될 파일(var.js)

// 변수 2개 선언
const odd = "홀수입니다";
const even = "짝수입니다";

// module.exports에 변수들을 담은 객체 대입
module.exports = {
  odd,
  even,
};
// var.js를 참조하는 func.js (모듈을 불러와서 사용하는 파일)

// require 함수로 var.js에 있던 값 불러오기
const { odd, even } = require("./var");

function checkOddOrEven(num) {
  if (num % 2) {
    // 홀수면
    return odd;
  }
  return even;
}

// module.exports에 함수 대입 (모듈로 사용 가능해짐)
module.exports = checkOddOrEven;
// var.js와 func.js를 모두 참조하는 index.js

const { odd, even } = require("./var");
const checkNumber = require("./func");

function checkStringOddOrEven(str) {
  if (str.length % 2) {
    // 홀수면
    return odd;
  }
  return even;
}

console.log(checkNumber(10));
console.log(checkStringOddOrEven("hello"));

결과

 

  • 모듈 사용법
1) module.exports에 다른 파일이 사용할 수 있게 하고 싶은 객체, 함수, 변수 등을 대입
2) require 함수 안에 불러올 모듈의 경로 적기
- 다른 모듈을 사용하는 파일을 다시 모듈로 만들 수 있음
- 모듈 하나가 여러 개의 모듈을 사용할 수 있음
- 모듈 하나가 여러 개의 모듈에 사용될 수 있음
- 모듈로부터 값을 불러올 때 변수 이름을 다르게 지정할 수 있음

출처 : Node.js 교과서 개정 2판(조현영 저) 95페이지

 

  • ES2015 모듈
ES2015가 도입되면서 자바스크립트도 자체 모듈 시스템 문법 생김

예시 코드

import { odd, even } from "./var";

function checkOddOrEven(num) {
  if (num % 2) {
    // 홀수면
    return odd;
  }
  return even;
}

export default checkOddOrEven;
사용법
1) 파일의 확장자를 mjs로 지정
2) module.exports 대신 export default에 다른 파일이 사용할 수 있게 하고 싶은 객체, 함수, 변수 등을 대입
3) require 대신 import로 불러올 모듈의 경로 적기

 


 

4. 노드 내장 객체 알아보기

(1) global

  • global이란?
global : 브라우저의 window와 같은 전역 객체  -> 모든 파일에서 접근 가능, global 생략 가능
  • global 객체 내부 속성 살펴보기

예시 코드

 

  • global 객체 이용하기 - 파일 간에 간단한 데이터 공유할 때

예시 코드

// globalA.js 

// global.message 값을 반환하는 함수
module.exports = () => global.message;
// globalB.js

const A = require("./globalA");

global.message = "안녕하세요"; // global.message에 값을 대입
console.log(A()); // globalA 모듈의 함수 호출

결과

주의할 점
파일 간에 데이터를 공유할 수 있지만 남용하면 x -> 프로그램 규모가 커질수록 유지보수에 어려움을 겪게 됨

 

 

(2) console

  • console이란?
console : global 객체 안에 들어있으며, 보통 디버깅을 위해 사용하는 내장 객체

 

  • console 로깅 함수 종류
1) console.time(레이블) : console.timeEnd(레이블)과 대응되어 같은 레이블을 가진 time과 timeEnd 사이의 시간을 측정
2) console.log(내용) : 평범한 로그를 콘솔에 표시
3) console.error(에러 내용) : 에러를 콘솔에 표시
4) console.table(배열) : 배열의 요소로 객체 리터럴을 넣으면, 객체의 속성들이 테이블 형식으로 표현됨
5) console.dir(객체, 옵션) : 객체를 콘솔에 표시할 때 사용   
   옵션 - colors : true로 하면 콘솔에 이 추가, depth : 객체 안의 객체를 몇 단계까지 보여줄지 결정
6) console.trace(레이블) : 에러가 어디서 발생했는지 추적

예시 코드

// console.js

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("전체 시간");

결과

 

 

(3) 타이머

  • 타이머 기능을 제공하는 함수 종류(모두 아이디를 반환)
1) setTimeout(콜백 함수, 밀리초) : 주어진 밀리초 이후에 콜백 함수 실행
2) setInterval(콜백 함수, 밀리초) : 주어진 밀리 초마다 콜백 함수를 반복 실행 
3) setImmediate(콜백 함수) : 콜백 함수를 즉시 실행
  • 타이머 취소하는 함수 종류(아이디를 사용)
1) clearTimeout(아이디) : setTimeout 취소
2) clearInterval(아이디) : setInterval 취소
3) clearImmediate(아이디) : setImmediate 취소

예시 코드

// timer.js

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);

결과

출처: Node.js 교과서 개정2판(조현영 저) 102페이지

 

 

(4) __filename, __dirname

  • __filename이란?
__filename : 파일 경로에 대한 정보를 제공해주는 키워드

 

  • __dirname이란?
__dirname : 폴더 경로에 대한 정보를 제공해주는 키워드

예시 코드

// filename.js

console.log(__filename);
console.log(__dirname);

결과

 

 

(5) module, exports, require

  • module, exports, require이란?
module, exports : 모듈을 만들 때 이용하는 객체
require : 모듈을 사용할 때 이용하는 함수

 

  • exports 객체 사용
module.exports로 한 번에 대입 x -> exports 객체에 각각의 변수를 하나씩 넣음

예시 코드

// 수정한 var.js

exports.odd = "홀수입니다";
exports.even = "짝수입니다";

결과

동일하게 동작하는 이유
module.exports와 exports가 같은 객체를 참조하기 때문
=> console.log(modules.exports === exports)를 하면 true가 나옴

[예시 코드]
console.log(module.exports === exports);

[결과]

출처: Node.js 교과서 개정2판(조현영 저) 104페이지

 

  • require 객체의 속성 종류
require.cache : 한 번 require 한 파일을 require.cache에 저장하여 재사용 가능하게 함

1) 파일 이름이 속성명으로 들어있음
2) 속성에는 module.exports 했던 부분(exports), 로딩 여부(loaded), 부모 모듈 관계(parent), 자식 모듈 관계(children)
require.main : 노드 실행 시 첫 모듈을 가리킴

1) 현재 파일이 첫 모듈인지 알아보기 : require.main === module
2) 첫 모듈의 이름 알아보기 : require.main.filename

예시 코드

console.log("require가 가장 위에 오지 않아도 됩니다.");

module.exports = "저를 찾아보세요.";

require("./var");

console.log("require.cache입니다.");
console.log(require.cache);
console.log("require.main입니다.");
console.log(require.main === module);
console.log(require.main.filename);

결과

 

  • 모듈 사용 시 주의점 - 두 모듈이 서로 require 할 때 순환 참조
두 모듈이 서로 require 할 때 순환 참조가 발생하여, 순환 참조되는 대상을 빈 객체로 만듦
=> 예기치 못한 동작이 발생할 수 있으므로, 순환 참조가 발생하지 않도록 해야 함

예시 코드

// 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);
};
// 두 모듈을 실행하는 dep-run.js

const dep1 = require("./dep1");
const dep2 = require("./dep2");

dep1();
dep2();

결과

=> dep1의 module.exports가 함수가 아니라 빈 객체로 표시 (순환 참조)

 

 

(6) process

  • process란?
process : 현재 실행되고 있는 노드 프로세스에 대한 정보를 담고 있는 객체
  • process 객체의 속성
1) process.version : 설치된 노드의 버전
2) process.arch : 프로세서 아키텍처 정보 ex) arm, ia32, x64
3) process.platform : 운영체제 플랫폼 정보 ex) win32, linux, darwin, freebsd
4) process.pid : 현재 프로세스의 아이디
5) process.uptime() : 프로세스가 시작된 후 흐른 시간, 단위는 초
6) process.execPath : 노드의 경로
7) process.cwd() : 현재 프로세스가 실행되는 위치
8) process.cpuUsage() : 현재 cpu 사용량

=> 일반적으로 운영체제나 실행 환경별로 다른 동작 하고 싶을 때 사용

예시 코드 및 결과

 

1) process.env

  • process.env이란?
process.env : 시스템 환경 변수 정보 출력하는 속성
  • 시스템 환경 변수 종류
NODE_OPTIONS : 노드를 실행할 때의 옵션들을 입력받는 환경 변수
                --max-old-space-size=8192 : 노드의 메모리를 8GB까지 사용할 수 있게 함
UV_THREADPOOL_SIZE : 노드에서 기본적으로 사용하는 스레드 풀의 스레드 개수를 조절

NODE_OPTIONS=--max-old-space-size=8192
UV_THREADPOOL_SIZE=8

 

  • 환경 변수 임의로 저장 -> process.env는 서비스의 중요한 키를 저장하는 공간으로도 사용
중요한 비밀번호는 process.env의 속성으로 대체

예시 코드

const secretId = process.env.SECRET_ID;
const secretCode = process.env.SECRET_CODE;

 

2) process.nextTick(콜백)

  • process.nexTick(콜백)이란?
process.nextTick(콜백) : 이벤트 루프가 다른 콜백 함수들보다 nextTick의 콜백 함수를 우선으로 처리하도록 만듦
  • 마이크로 태스크(microtask)란?
마이크로 태스크 : 호출 스택에서 백그라운드로 그리고나서 태스크 큐로 보내지는 것이 아닌, 호출스택에서 바로 마이크로태스크 큐에 보내진다면 해당 함수는 호출 스택 다음으로 우선순위가 높아져서 태스크 큐에 있는 함수보다 먼저 처리됨, 그러한 마이크로 태스크 큐에 보내지는 것들을 마이크로태스크라고 함.

ex) 마이크로태스크  - process.nextTick, Promise

주의할 점
마이크로 태스크를 재귀 호출하게 되면 이벤트 루프는 다른 콜백 함수보다 마이크로태스크를 우선하여 처리
-> 다른 콜백 함수들이 실행되지 않을 수도 있음

출처 : Node.js 교과서 개정 2판(조현영 저) 111페이지

예시 코드

// nextTick.js

setImmediate(() => {
  console.log("immediate");
});
process.nextTick(() => {
  console.log("nextTick");
});
setTimeout(() => {
  console.log("timeout");
}, 0);
Promise.resolve().then(() => console.log("promise"));

결과

 

3) process.exit(코드)

process.exit(코드) : 실행 중인 노드 프로세스를 종료
    -> 서버 외의 독립적인 프로그램에서 수동으로 노드를 멈추기 위해 사용

코드 번호(인수)
1) 0 : 정상 종료(디폴트 값)
process.exit(0);

2) 1 : 비정상 종료 -> 에러가 발생해서 종료하는 경우에 사용

process.exit(1);

예시 코드

// exit.js

let i = 1;
setInterval(() => {
  if (i === 5) {
    console.log("종료!");
    process.exit(); // process.exit(0);과 같음
  }
  console.log(i);
  i += 1;
}, 1000);

결과

 


 

문제

1. 컴파일을 하지 않고 즉석에서 자바스크립트 코드를 입력할 수 있는 노드의 콘솔은?

2. 모듈로 만들 때 객체나 변수, 함수 등을 대입할 수 있는 키워드는?

3. 불러올 모듈의 경로를 적으면 모듈로 사용할 수 있게 하는 함수는?

4. 브라우저의 window와 같은 전역 객체는?

5. 객체를 콘솔에 표시할 때 사용하는 로깅 함수는?

6. setInterval을 취소하는 함수는?

7. require.main은 무엇을 뜻하는가?

8. process.nextTick과 Promise는 백그라운드에서 어떤 큐로 보내지는가?

 

9.  i가 5가 되었을 때 프로세스가 종료되도록 하기 위해서 들어가야 할 코드는?

let i = 1;
setInterval(() => {
  if (i === 5) {
    console.log("종료!");
    // 빈칸(답안 들어갈 곳)
  }
  console.log(i);
  i += 1;
}, 1000);

 

10. 다음은 ES2015 모듈을 만들기 위한 코드이다. 정상적으로 모듈로 사용할 수 있게 하기 위해서 빈칸 안에 코드를 작성하시오.

[빈칸] { odd, even } from "./var";

function checkOddOrEven(num) {
  if (num % 2) {
    // 홀수면
    return odd;
  }
  return even;
}

[빈칸] checkOddOrEven;

 

1. REPL

2. module.exports

3. require

4. global

5. console.dir()

6. clearInterval(아이디)

7. 노드 실행 시 첫 모듈을 가리킴

8. 마이크로 태스크 큐

9. process.exit(); 또는 process.exit(0);

10. import, export default

 

Corner Node.js

Editor sua

728x90

관련글 더보기