REPL
REPL은 (Read Eval Print Loop)의 약자이며
입력한 코드를 읽고 해석하고 결과물을 반환하고 종료할 때까지 반복한다 라는 뜻입니다.
노드의 REPL을 직접사용해보기 위해서는 cmd 혹은 터미널에서 node를 입력하여 사용할 수 있습니다.
아래와 같이 프롬프트에 > 모양이 나오면 자바스크립트 코드를 입력할 수 있습니다.
js 파일 실행하기
위와 같이 REPL에 직접 코드를 입력하는 대신 자바스크립트 파일을 실행할 수도 있습니다.
아래와 같이 js 파일을(helloWorld.js) 하나 만들어 주고
function helloWorld() {
console.log("Hello I'm loui3");
helloNode();
}
function helloNode() {
console.log('Hello Node');
}
helloWorld();
터미널에서 해당 파일이 있는 디렉토리로 이동해 줍니다.
그리고 node helloWorld를 입력해 주시면 아래와 같이 실행되는 것을 확인하실 수 있습니다.
노드의 모듈
노드는 코드를 모듈로 만들 수 있다는 점에서 브라우저의 자바스크립트와는 다릅니다.
여기서 모듈은 특정한 기능을 하는 함수나 변수들의 집합을 말합니다.
노드에서는 두 가지 형식의 모듈을 사용하는데 CommonJS와 ECMAScript 모듈 입니다.
먼저 CommonJS에 대해 알아보도록 하겠습니다.
CommonJS 모듈
CommonJS 모듈은 requre와 module.exports 또는 exports 키워드를 사용하여 모듈을 가져오고 내보냅니다.
실습을 해보기 위해 var.js, func.js, index.js를 만들어줍니다.(같은 폴더 내에)
var.js
var.js에 변수 두 개를 선언한 후 module.exports에 변수들을 담은 객체를 대입한 것입니다.
module.exports는 모듈을 내보내기 위해 사용하는 것입니다.
이렇게 해주시면 이 파일은 모듈로서 기능을 하게 됩니다.
const odd = 'CJS 홀수입니다';
const even = 'CJS 짝수입니다';
module.exports = {
odd,
even,
};
func.js
reqire 함수가 있는데 이는 안에 불러올 모듈의 경로를 적어 모듈을 가져오는 것입니다.
여기서 const { odd, even }은 구조분해 할당 문법입니다.
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)); // 10이므로 짝수
console.log(checkStringOddOrEven('hello')); //문자열길이가 5글자이므로 홀수
console.log(checkNumber(3)); // 3이므로 홀수
실행결과는 아래와 같습니다.
ECMAScript 모듈
ECMAScript 모듈은 공식적인 자바스크립트 모듈 형식입니다.
ES6 이후에서 모듈을 정의하고 가져오는 방법을 제공하고 있습니다.
require와 exports, module.exports가 각각 import, export, export default로 바뀌었다고 생각하시면 됩니다.
여기서 import와 export default는 require나 module처럼 함수나 객체가 아니라 문법 그 자체 이므로
단순히 글자만 바꿔서는 제대로 동작하지 않을 수도 있습니다.
CommonJS와 같은 결과가 나오게 만들어보도록 하겠습니다.
var.mjs
export const odd = 'MJS 홀수입니다';
export const even = 'MJS 짝수입니다';
func.mjs
import { odd, even } from './var.mjs';
function checkOddOrEven(num) {
if (num % 2) {
return odd;
}
return even;
}
export default checkOddOrEven;
index.mjs
import { odd, even } from './var.mjs';
import checkNumber from './func.mjs';
function checkStringOddOrEven(str) {
if (str.length % 2) {
return odd;
}
return even;
}
console.log(checkNumber(10));
console.log(checkStringOddOrEven('hello'));
console.log(checkNumber(3));
주의할 점
ES 모듈은 if문 안에서 import 하는 것이 불가능합니다.
따라서 아래와 같이 작성 시 에러가 발생하게 됩니다.
//에러 발생
const a = false;
if (a) {
iomport './func.mjs';
}
console.log('성공');
위와 같은 문제를 해결하기 위해서는 await이나 then을 붙여야 합니다.
ES 모듈의 최상위 스코프에서는 async 함수 없이도 await 할 수 있다고 하는데
아래의 예시처럼 바꿔주어야 정상 작동을 한다고 합니다.
//정상 작동
const a = true;
if (a) {
const m1 = await import('./func.mjs');
console.log(m1);
}
노드 내장 객체 process.exit
실행 중인 노드 프로세스를 종료하는 코드입니다.
서버환경에서 이 함수를 사용하면 서버가 멈춰 특수한 경우를 제외하고는 서버에서 잘 사용하지 않는다고 합니다.
(백엔드에 관심이 많아 이 부분은 기록해두었습니다^^)
아래 코드는 10초 후에 종료되는 코드입니다.
let i = 1;
setInterval(() => {
if (i === 10) {
console.log('종료!');
process.exit();
}
console.log(i);
i += 1;
}, 1000);
추가 모듈 내용은 아래 사이트에서 보시는 것을 추천드립니다.
https://nodejs.org/api/modules.html
'Back-End > Node.js' 카테고리의 다른 글
Node 모듈 (0) | 2024.05.19 |
---|---|
노드와 자바스크립트 2 (0) | 2024.05.16 |
노드와 자바스크립트 (0) | 2024.05.14 |
노드를 시작해보자 (0) | 2024.05.13 |
Node.js에서 모듈과 npm 사용해보기 (0) | 2023.09.13 |