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(레이블) : 에러가 어디서 발생했는지 추적
동일하게 동작하는 이유 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 할 때 순환 참조가 발생하여, 순환 참조되는 대상을 빈 객체로 만듦 => 예기치 못한 동작이 발생할 수 있으므로, 순환 참조가 발생하지 않도록 해야 함
// 두 모듈을 실행하는 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 : 노드에서 기본적으로 사용하는 스레드 풀의 스레드 개수를 조절
process.nextTick(콜백) : 이벤트 루프가 다른 콜백 함수들보다 nextTick의 콜백 함수를 우선으로 처리하도록 만듦
마이크로 태스크(microtask)란?
마이크로 태스크 : 호출 스택에서 백그라운드로 그리고나서 태스크 큐로 보내지는 것이 아닌, 호출스택에서 바로 마이크로태스크 큐에 보내진다면 해당 함수는 호출 스택 다음으로 우선순위가 높아져서 태스크 큐에 있는 함수보다 먼저 처리됨, 그러한 마이크로 태스크 큐에 보내지는 것들을 마이크로태스크라고 함.
ex) 마이크로태스크 - process.nextTick, Promise
주의할 점 마이크로 태스크를 재귀 호출하게 되면 이벤트 루프는 다른 콜백 함수보다 마이크로태스크를 우선하여 처리 -> 다른 콜백 함수들이 실행되지 않을 수도 있음