3장. 노드 기능 알아보기

Doozuu·2023년 4월 23일
0

Node.js

목록 보기
3/6

3.1 RERL 사용하기

RERL(Read Eval Print Loop)
: 입력한 코드를 읽고, 해석하고 결과물을 반환하고 종료할 때까지 반복하는 것.

노드에서 REPL 사용해보기 : 터미널 창 열고 node 입력
(종료하려면 .exit 입력)

자바스크립트 코드를 입력할 수 있다.

  • 한두 줄짜리 코드를 테스트해보는 용도로는 좋지만 여러 줄의 코드를 실행하기에는 불편하다.
  • 긴 코드는 코드를 자바스크립트 파일로 만든 후 파일을 통째로 실행하는 것이 좋다.

3.2 JS 파일 실행하기

원하는 폴더에 js파일을 만들고 터미널에서 node 자바스크립트 파일 경로 를 입력해 노드를 통해 파일을 실행한다.

  • 확장자(.js)는 생략해도 된다.
  • REPL에서 입력하는 것이 아닌 터미널에서 입력해야 하는 것에 유의한다.

다음과 같이 코드 실행결과가 출력된다.

3.3 모듈로 만들기

노드는 코드를 모듈로 만들 수 있다는 점에서 브라우저의 자바스크립트와는 다르다.
모듈이란 특정한 기능을 하는 함수나 변수들의 집합을 말한다.
모듈로 만들어두면 여러 프로그램에 해당 모듈을 재사용할 수 있다.
보통 파일 하나가 모듈 하나가 되며, 파일별로 코드를 모듈화할 수 있어 관리하기 편하다.

노드에서는 두 가지 형식의 모듈을 사용하는데, CommonJS 모듈ECMAScript 모듈이다.

3.3.1 CommonJS 모듈

표준 자바스크립트 모듈은 아니지만 노드 생태계에서 가장 널리 쓰이는 모듈이다.
모듈을 만들 때는 모듈이 될 파일과 모듈을 불러와서 사용할 파일이 필요하다.

모듈을 불러오는 명령어 : require('경로')
(require.cache : 한번 require한 파일은 여기에 저장된다., require.main : 노드 실행시 첫 모듈을 가리킨다.)
모듈을 내보내는 명령어 : module.exports / exports

1. 변수 2개를 모아둔 모듈 생성

var.js

const odd = "홀수입니다";
const even = "짝수입니다";

module.exports = {
  odd,
  even,
};

2. var.js 모듈을 참조하여 함수 모듈 생성

func.js

const { odd, even } = require("./var"); // 구조분해할당

function checkOddOrEven(num) {
  if (num % 2) {
    return odd;
  }
  return even;
}

module.exports = checkOddOrEven;

3. 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"));

4. vscode 터미널에서 index 파일 실행

서로를 require하는 경우에는 순환 참조가 일어나 순환 참조되는 대상을 빈 객체로 만든다. 따라서 순환 참조가 일어나지 않도록 구조를 잘 잡아야 한다.

3.3.2 ECMAScript 모듈(ES 모듈)

공시걱인 자바스크립트 모듈 형식이다.
노드에서 아직까지는 CommonJS 모듈을 많이 쓰지만, ES 모듈이 표준으로 정해지면서 점점 ES 모듈을 사용하는 비율이 늘어나고 있다.
브라우저에서도 ES 모듈을 사용하고 있어 브라우저와 노드 모두에 같은 모듈 형식을 사용할 수 있다는 것이 장점이다.

모듈을 불러오는 명령어 : import
모듈을 내보내는 명령어 : export default / export

파일도 js 대신 mjs 확장자로 변경된다.
(js 확장자에서 import를 사용하면 SyntaxError가 발생한다. js 확장자를 사용하면서 ES모듈을 사용하려면 package.json에 type:"module" 속성을 넣으면 된다.)
CommonJS 모듈과는 다르게 import 시 파일 경로에서 js, mjs 같은 확장자를 생략할 수 없다.

위의 코드를 ES 모듈 스타일로 바꾸면 다음과 같다.

var.mjs

export const odd = "홀수입니다";
export const even = "짝수입니다";

func.js

import {odd, even} from './var.mjs';

function checkOddOrEven(num) {
  if (num % 2) {
    return odd;
  }
  return even;
}

export default checkOddOrEven;

index.js

import {odd, even} from './var.mjs';
import checkNumber from './func';

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

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

3.3.3 다이내믹 임포트

Dynamic Import란?

조건부로 모듈을 불러오는 것을 말한다.

예시

CommonJS 모듈

const a = false;
if(a){
	return('./func');
}
console.log('성공');

ES 모듈
ES 모듈은 if문 안에서 import하는 것이 불가능하다.
import는 Promise를 반환하기에 await나 then을 붙여야 한다.

const a = true;
if(a){
  	const m1 = await import('./func.mjs');
	console.log(m1);
}

3.3.4 __filename, __dirname

노드에서는 파일 사이에 모듈 관계가 있는 경우가 많으므로 현재 파일의 경로나 파일명을 알아야 하는 경우가 있다.

  • 노드는 __filename__dirname이라는 키워드로 경로에 대한 정보를 제공한다.
  • 파일에 __filename__dirname을 넣어두면 실행 시 현재 파일명과 현재 파일 경로로 바뀐다.
  • ES 모듈에서는 __filename__dirname을 사용할 수 없다. 대신 import.meta.url로 경로를 가져올 수 있다.

3.4 노드 내장 객체 알아보기

노드에서는 기본적인 내장 객체와 내장 모듈을 제공한다.

3.4.1 global

global 객체는 브라우저의 window와 같은 전역 객체이며, 모든 파일에서 접근할 수 있다.

3.4.2 console

console 객체는 global 객체 안에 들어 있으며 보통 디버깅을 위해 사용한다.
대표적으로 console.log 메서드가 있고, 그 외에도 console.time console.error, console.table 등이 있다.

3.4.3 타이머

타이머 기능을 제공하는 함수인 setTimeout, setInterval, setImmediate는 global 객체 안에 들어 있다.

  • setTimeout(콜백함수, 밀리초) : 주어진 시간 이후에 콜백 함수를 실행
  • setInterval(콜백함수, 밀리초) : 주어진 밀리초마다 콜백 함수를 반복 실행
  • setImmediate(콜백함수) : 주어진 콜백함수를 즉시 실행

이 타이머 함수들은 모두 아이디를 반환한다. 아이디를 사용하면 타이머를 취소할 수 있다.

  • clearTimeout(아이디) : setTimeout을 취소
  • clearInterval(아이디) : setInterval을 취소
  • clearImmediate(아이디) : setImmediate을 취소

3.4.4 process

현재 실행되고 있는 노드 프로세스에 대한 정보를 담고 있다.

  • process.env : 시스템 환경 변수 저장
  • process.nextTick(콜백) : 이벤트 루프가 다른 콜백 함수들보다 nextTick의 콜백 함수를 우선으로 처리하도록 만든다.
  • process.exit(코드) : 실행 중인 프로세스를 종료한다.

3.5 노드 내장 모듈 사용하기

3.5.1 os

웹 브라우저에 사용되는 자바스크립트는 운영체제의 정보를 가져올 수 없지만 노드는 os 모듈에 정보가 담겨 있어 정보를 가져올 수 있다.
내장 모듈인 os를 불러오려면 require('os') 또는 require('node:os')를 하면 된다.

3.5.2 path

폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈이다.
path 모듈이 필요한 이유 중 하나는 운영체제별로 경로 구분자가 다르기 때문이다.
크게 윈도 타입과 POSIX 타입(맥,리눅스)으로 구분된다.

  • 윈도 : \ 로 구분한다.
  • POSIX : / 로 구분한다.

내장 모듈인 path를 불러오려면 require('path') 를 하면 된다.

3.5.3 url

인터넷 주소를 쉽게 조작하도록 도와주는 모듈이다.
url 처리에는 크게 두 가지 방식이 있다.

profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글