REPL
- 자바스크립트는 스크립트 언어이므로 즉석에서 코드 실행 가능
- R(Read), E(Evaluate), P(Print), L(Loop)
- 터미널에 node 입력
- 한 줄 짜리 코드 테스트 할 때 적합
JS 파일 만들어 실행
CommonJS 모듈
모듈 내보내기
const odd = '홀수입니다';
const even = '짝수입니다';
module.exports = {
odd,
even
}
exports.odd = odd;
exports.even = even;
- module.exports = { 변수1, 변수2 };
- exports.변수1 = 변수1;
- module.exports === exports === {}
모듈 내용 가져오기
다른 파일에서 require('파일 경로');
this
전역스코프의 this
- this === module.exports === {}
- function 안에서 this === global
- 화살표 함수의 this는 부모의 this를 물려받는다.
require
- node [파일명]
- 파일명이 main
- require.main: 노드 실행 시 첫 모듈을 가리킴
- require.cache: 한 번 require한 모듈에 대한 캐쉬 정보가 들어있음
- require가 한 번 실행되면 cache에 저장되고, 다음 실행에는 cache에서 불러온다.
순환 참조
- 노드가 순환참조가 일어나면 빈 객체({})로 바꿔줌
ECMAScript 모듈
export const odd = '홀수입니다';
export const odd = '짝수입니다';
import { odd, even } from './var.mjs';
...
export default checkOddOrEven;
import checkNumber from './func.mjs';

const a = true;
if (a) {
const m1 = await import('./func.mjs');
console.log(m1);
const m2 = await import('./var.mjs');
console.log(m2);
[Module: null prototype] { default: [Function: checkOddOrEven }
[Module: null prototype] { even: 'MJS 짝수입니다', odd: 'MJS 홀수입니다' }
- 알 수 있는 내용: 다이내믹 임포트, top level await, export dafault !== module.exports
노드 내장 객체
global
- 브라우저에서의 window 객체와 같은 역할
- 노드 전역 객체
- 생략 가능
- global 속성에 값을 대입하면 다른 파일에서도 사용 가능(자제)
console
- console.time, console.timeEnd: 시간 로깅
- console.error: 에러 로깅
- console.log: 평범한 로그
- console.dir: 객체 로깅
- console.trace: 호출스택 로깅(함수 안에서)
타이머 메서드
- setTimeout(콜백 함수, 밀리초): 밀리초 이후에 콜백 함수 실행
- setInterval(콜백 함수, 밀리초): 밀리초마다 콜백 함수를 반복 실행
- setImmediate(콜백 함수): 콜백 함수 즉시 실행
- clearTimeout(아이디): setTimeout 취소
- clearInterval(아이디): setInterval 취소
- 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);
즉시 실행 -> 1초마다 실행 -> 1.5초 후 실행 -> 1초마다 실행
process
- process.cwd(): 노드 명령어의 실행 위치
- process.env: 시스템 환경 변수들이 들어있는 객체
- process.nextTick(콜백): 이벤트 루프가 다른 콜백 함수들보다 nextTick의 콜백 함수를 우선적으로 처리
- process.exit(): 현재의 프로세스를 멈춤
노드 내장 모듈
os(operating system)
- 운영체제의 정보를 담고 있음
- os.arch(): process.arch과 동일
- os.platform(): process.platform과 동일
- os.type(): 운영체제의 종류
- os.uptime(): 운영체제 부팅 이후 흐른 시간을 보여줌(process.uptime() -> 노드의 실행 시간)
- os.hostname(): 컴퓨터의 이름
- os.release(): 운영체제의 버전
- os.homedir(): 홈 디렉터리 경로
- os.tmpdir(): 임시 파일 저장 경로
- os.cpus(): cpu 정보(컴퓨터의 코어 정보)
- os.freemem(): 사용 가능한 메모리(RAM)
- os.totalmem(): 전체 메모리 용량
path
-
폴더와 파일 경로를 쉽게 조작하도록 도와주는 모듈
-
path.sep: /, 경로의 구분자
-
path.delimiter: ,(window-> ; ,posix-> , ), 환경 변수의 구분자
-
path.dirname(경로): 파일이 위치한 폴더 경로
-
path.extname(경로): 파일의 확장자
-
path.basename(경로, 확장자): 파일의 이름
-
path.parse(경로): 파일 경로 분해
-
path.format(객체): 파일 경로 합치기
-
path.normalize(경로): \,/ 수정
-
path.isAbsolute(경로): 경로가 절대 경로인지, 상대 경로인지
-
path.relative(기준경로, 비교경로): 어떻게 특정한 디렉토리로 이동하는지 알려줌
-
path.join(경로1, 경로2)
-
path.resolve(경로1, 경로2)
join과 resolve의 차이: resolve는 /를 절대경로로 처리, join은 상대경로로 처리
URL
- WHATWG(웹 표준을 정하는 단체의 이름) 방식
- 노드 내장 객체

- new URL(주소) -> 주소가 부분별로 정리됨
- URL.format(URL이름) -> 객체로 바뀜
searchParams
- searchParams.getAll(키): 키에 해당하는 모든 값을 가져옴
- searchParams.get(키): 키에 해당하는 첫 번째 값만 가져옴
- searchParams.has(키): 해당 키가 있는지 없는지 검사
- searchParams.keys(키): searchParams의 모든 키를 반복기 객체로 가져옴
- searchParams.values(키): searchParams의 모든 값을 반복기 객체로 가져옴
- searchParams.append(키, 값): 해당 키 추가, 같은 값 유지하고 추가
- searchParams.set(키, 값): 같은 키의 값들을 모두 지우고 새로 추가
- searchParams.delete(키): 해당 키 제거
- searchParams.toString(): 조작한 searchParams 객체를 다시 문자열로 만듬
DNS
- dns.lookup(도메인): ip주소
- dns.resolve(도메인, 레코드 이름): record를 가져옴
- A: ipv4 주소
- AAAA:ipv6주소
- MX: 메일 서버 세팅
- CNAME: 별칭
- NS: 네임서버
- SOA: 도메인 정보
단방향 암호화(crypto)
- 멀티 쓰레드
- 암호화: 평문을 암호로 만듦
- 복호화: 암호를 평문으로 해독
해시 기법(단방향 암호화)
- 문자열을 고정된 길이의 다른 문자열로 바꾸는 방식
- crypto.createHash(알고리즘): 사용할 해시 알고리즘을 넣어줌(sha512)
- crypto.update(문자열): 변환할 문자열
- crypto.digest(인코딩): 인코딩할 알고리즘(base64, hex, latin1)
- Node는 pbkdf2, scrypt 알고리즘 지원
pbkdf2
- crypto.pbkdf2(비밀번호, salt, 반복 횟수, 출력 바이트, 알고리즘)
양방향 암호화
- crypto.createCipheriv(알고리즘, 키, iv): 암호화 알고리즘과 키, 초기화벡터
- cipher.update(문자열, 인코딩, 출력 인코딩): 암호화할 대상과 대상의 인코딩, 출력 결과물의 인코딩
- cipher.final(출력 인코딩): 출력 결과물의 인코딩
- crypto.createDacipheriv(알고리즘, 키, iv): 복호화할 때 사용, 암호화할 때 사용했던 알고리즘과 키, iv를 그대로 넣어주어야 함
- decipher.update(문자열, 인코딩, 출력 인코딩): 암호화된 문장, 그 문장의 인코딩, 복호화할 인코딩
- decipher.final(출력 인코딩): 복호화 결과물의 인코딩
대칭형 암호화(암호문 복호화 가능)
- key 사용
- 암호화 할 때와 복호화 할 때 같은 Key를 사용해야 함
util
- util.deprecated(함수, 경고 메시지 내용): 함수가 조만간 사라지거나 변경될 때
- util.promisify(함수): async, await 패턴 사용 가능, 콜백이 (error, data) => {} 형식이어야 함
worker_threads
- 노드에서 멀티 스레드 방식(암호화, 압축)으로 작업할 수 있게 해주는 모듈
- 예제1
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename);
worker.on('message', (value) => console.log('워커로부터', value));
worker.on('exit', () => console.log('워커 끝~'));
worker.postMessage('ping');
} else {
parentPort.on('message', (value) => {
console.log('부모로부터', value);
parentPort.postMessage('pong');
parentPort.close();
})
}
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
if (isMainThread) {
const threads = new Set();
threads.add(new Worker(__filename, {
workerData: { start: 1 },
}));
threads.add(new Worker(__filename, {
workerData: { start: 2 },
}));
for (let worker of threads) {
worker.on('message', (value) => console.log('워커로부터', value));
worker.on('exit', () => {
threads.delete(worker);
if (threads.size === 0) {
console.log('워커 끝~'));
}
} else {
const data = workerData;
parentPort.postMessage(data.start + 100);
}
child process
const spawn = require('child_process').spawn;
var process = spawn('python', ['test.py']);
process.stdout.on('data', function (data) {
console.log(data.toString());
});
process.stderr.on('data', function (data) {
console.error(data.toString('utf8'));
});
파일 시스템 사용하기
fs
- 파일 시스템에 접근하는 모듈
- 예제1(파일 읽어오기)
const fs = require('fs');
fs.readFile('./readme.txt', (err, data) => {
if (err) {
throw err;
}
console.log(data);
console.log(data.toString());
});
const fs = require('fs').promises;
fs.readFile('./readme.txt')
.then((data) => {
console.log(data);
console.log(data.toString());
})
.catch((err) => {
throw err;
});
const fs = require('fs').promises;
fs.writeFile('./writeme.txt', '글이 입력됩니다.')
.then(() => {
return fs.readFile('./writeme.txt');
})
.then((data) => {
console.log(data.toString());
})
.catch((err) => {
throw err;
});
버퍼와 스트림
- 버퍼: 일정한 크기로 모아두는 데이터
- 일정한 크기가 되면 한 번에 처리
- 버퍼링: 버퍼에 데이터가 찰 때까지 모으는 작업
- 스트림: 데이터의 흐름
- 일정한 크기로 나눠서 여러 번에 걸쳐서 처리
- 버퍼(또는 청크)의 크기를 작게 만들어서 주기적으로 데이터를 전달
- 스트리밍: 일정한 크기의 데이터를 지속적으로 전달하는 작업
const buffer = Buffer.from('저를 버퍼로 바꿔보세요.');
console.log(buffer);
console.log(buffer.length);
console.log(buffer.toString());
const array = [Buffer.from('띄엄 '), Buffer.from('띄엄 '),Buffer.from('띄어쓰기')];
console.log(Buffer.concat(array).toString());
console.log(Buffer.alloc(5));
파이프와 스트림 메모리 효율 확인
- fs.access(경로, 옵션, 콜백): 폴더나 파일에 접근할 수 있는지를 체크
- fs.mkdir(경로, 콜백): 폴더를 만드는 메서드
- fs.open(경로, 옵션, 콜백): 파일의 아이디를 가져오는 메서드
- fs.rename(기존 경로, 새 경로, 콜백): 파일의 이름을 바꾸는 메서드
- fs.readdir(경로, 콜백): 폴더 안의 내용물을 확인할 수 있음
- fs.unlink(경로, 콜백): 파일을 지울 수 있음
- fs.rmdir(경로, 콜백): 폴더를 지울 수 있음
- fs.copyFile(경로1, 경로2): 파일을 복사하는 방법
- fs.watch(경로, 콜백): 파일을 감시하는 방법
- fs.existsSync: 파일이나 폴더가 존재하는지 확인
- fs.stat: 파일이 폴더인지 파일인지 알아내는 방법
스레드풀과 커스텀 이벤트
- UV_THREADOOL_SIZE = 원하는 사이즈 크기
에러 처리하기
- 에러가 발생할 만한 곳을 try catch로 감싼다.
- 노드 비동기 메서드의 에러는 따로 처리하지 않아도 됨
- 프로미스의 에러는 따로 처리하지 않아도 됨 -> 노드 버전이 올라가면 catch 붙이기
프로세스 종료하기
- lsof -i tcp:포트
- kill -9 프로세스아이디