RERL(Read Eval Print Loop)
: 입력한 코드를 읽고, 해석하고 결과물을 반환하고 종료할 때까지 반복하는 것.
노드에서 REPL 사용해보기 : 터미널 창 열고 node
입력
(종료하려면 .exit
입력)
자바스크립트 코드를 입력할 수 있다.
원하는 폴더에 js파일을 만들고 터미널에서 node 자바스크립트 파일 경로
를 입력해 노드를 통해 파일을 실행한다.
다음과 같이 코드 실행결과가 출력된다.
노드는 코드를 모듈로 만들 수 있다는 점에서 브라우저의 자바스크립트와는 다르다.
모듈이란 특정한 기능을 하는 함수나 변수들의 집합을 말한다.
모듈로 만들어두면 여러 프로그램에 해당 모듈을 재사용할 수 있다.
보통 파일 하나가 모듈 하나가 되며, 파일별로 코드를 모듈화할 수 있어 관리하기 편하다.
노드에서는 두 가지 형식의 모듈을 사용하는데, CommonJS 모듈
와 ECMAScript 모듈
이다.
표준 자바스크립트 모듈은 아니지만 노드 생태계에서 가장 널리 쓰이는 모듈이다.
모듈을 만들 때는 모듈이 될 파일과 모듈을 불러와서 사용할 파일이 필요하다.
모듈을 불러오는 명령어 : require('경로')
(require.cache
: 한번 require한 파일은 여기에 저장된다., require.main
: 노드 실행시 첫 모듈을 가리킨다.)
모듈을 내보내는 명령어 : module.exports
/ exports
var.js
const odd = "홀수입니다";
const even = "짝수입니다";
module.exports = {
odd,
even,
};
func.js
const { odd, even } = require("./var"); // 구조분해할당
function checkOddOrEven(num) {
if (num % 2) {
return odd;
}
return even;
}
module.exports = checkOddOrEven;
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"));
서로를 require하는 경우에는 순환 참조가 일어나 순환 참조되는 대상을 빈 객체로 만든다. 따라서 순환 참조가 일어나지 않도록 구조를 잘 잡아야 한다.
공시걱인 자바스크립트 모듈 형식이다.
노드에서 아직까지는 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"));
조건부로 모듈을 불러오는 것을 말한다.
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);
}
__filename
, __dirname
노드에서는 파일 사이에 모듈 관계가 있는 경우가 많으므로 현재 파일의 경로나 파일명을 알아야 하는 경우가 있다.
__filename
과 __dirname
이라는 키워드로 경로에 대한 정보를 제공한다.__filename
과 __dirname
을 넣어두면 실행 시 현재 파일명과 현재 파일 경로로 바뀐다.__filename
과 __dirname
을 사용할 수 없다. 대신 import.meta.url
로 경로를 가져올 수 있다.노드에서는 기본적인 내장 객체와 내장 모듈을 제공한다.
global 객체는 브라우저의 window와 같은 전역 객체이며, 모든 파일에서 접근할 수 있다.
console 객체는 global 객체 안에 들어 있으며 보통 디버깅을 위해 사용한다.
대표적으로 console.log 메서드가 있고, 그 외에도 console.time console.error, console.table 등이 있다.
타이머 기능을 제공하는 함수인 setTimeout, setInterval, setImmediate는 global 객체 안에 들어 있다.
이 타이머 함수들은 모두 아이디를 반환한다. 아이디를 사용하면 타이머를 취소할 수 있다.
현재 실행되고 있는 노드 프로세스에 대한 정보를 담고 있다.
웹 브라우저에 사용되는 자바스크립트는 운영체제의 정보를 가져올 수 없지만 노드는 os 모듈에 정보가 담겨 있어 정보를 가져올 수 있다.
내장 모듈인 os를 불러오려면 require('os')
또는 require('node:os')
를 하면 된다.
폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈이다.
path 모듈이 필요한 이유 중 하나는 운영체제별로 경로 구분자가 다르기 때문이다.
크게 윈도 타입과 POSIX 타입(맥,리눅스)으로 구분된다.
내장 모듈인 path를 불러오려면 require('path')
를 하면 된다.
인터넷 주소를 쉽게 조작하도록 도와주는 모듈이다.
url 처리에는 크게 두 가지 방식이 있다.