본문으로 바로가기
cf) node.js에는 window 전역 객체가 없다. global이 있다.

 

__filename, __dirname

console.log(__filename); // 실행 중인 파일의 경로
console.log(__dirname); // 실행 중인 경로

 

process 객체

console.log(process.arch); // x64, x32
console.log(process.version); // node.js의 버전
console.log(process.platform); // window, linux, mac...
console.log(process.pid); // 프로세서 id
console.log(process.uptime()); // node.js를 실행한 뒤 얼마나 시간이 지났나
console.log(process.cwd()); // node.js를 어디에서 실행하고 있나
console.log(process.execPath); // node.exe의 위치
console.log(process.cpuUsage()); // CPU 사용량
process.exit();

 

os 모듈

대개 데스크탑에서 돌릴 프로그램을 만들 때 사용하나 cpus()는 종종 웹 개발에도 종종 사용함.

import os from "os";

console.log(os.arch());
console.log(os.platform());
console.log(os.uptime()); //운영체제(os)가 실행된 시간
console.log(os.hostname());
console.log(os.homedir());
console.log(os.tmpdir());
console.log(os.totalmem()); // 전체 메모리 크기
console.log(os.freemem()); //  사용 가능한 메모리 크기
console.log(os.cpus()); // cpu 정보. 모델, 스피드 등

 

path 모듈

경로에 관한 모듈. 어디에서나 자주 쓰인다.

import path from "path";

console.log(path.sep); // 경로를 구분자. win: \\ POSIX: /
console.log(path.delimiter); // 환경 변수의 구분자. win: ; POSIX: :

console.log(path.parse(__filename)); // 아래 세 명령어는 parse의 결과를 각각 잘라서 보여줌
console.log(path.dirname(__filename)); // 경로
console.log(path.extname(__filename)); // 확장자 이름
console.log(path.basename(__filename)); // 파일 이름

console.log(__dirname);
//C:\Users\BOSSMONSTER\Documents\nodebird
console.log(path.join(__dirname, "..", "/node_modules")); //상대 경로로 인식
//C:\Users\BOSSMONSTER\Documents\node_modules
console.log(path.resolve(__dirname, "..", "/node_modules")); // 절대 경로로 인식
// C:\node_modules

 

url 모듈

url 조작 가능. 쿼리문 이하를 수정(set), 추가(append), 가져오기(getAll, get, keys, values) 등 가능함

import url from "url";

const URL = url.URL;
const myURL = new URL("http://www.google.com");

console.log(myURL); //WHATWG 방식으로 url 구성 요소 객체를 반환
console.log(myURL.searchParams); //searchParams 내부의 메소드 사용 빈도 매우 높음
console.log(myURL.searchParams.keys()); // ? 이하 쿼리의 key
console.log(myURL.searchParams.values()); // ? 이하 쿼리의 value
console.log(myURL.searchParams.append("food", "potato")); //http://www.google.com/?food=potato
console.log(myURL.searchParams.set("food", "cake")); // 기존 ?food=를 ?food=cake로 수정
console.log(myURL.searchParams.toString()); //작업 후 사용하기 위해 string으로 type 변환
console.log(url.format(myURL)); //url 주소 반환

const parsedURL = url.parse("http://www.google.com");
console.log(parsedURL); //예전 방식

 

qureystring 모듈

현재는 serachParams에서 쿼리 스트링을 제어할 수 있지만 예전에는 qureystring을 사용함. 따라서 qureystring 모듈을 외울 필요는 없음. 무엇인지만 알아두고 URL 모듈의 searchParams을 이용하자 (위 참고)

import url from "url";
import qureystring from "querystring";

const parsedURL = url.parse("https://www.youtube.com/watch?v=ferZnZ0_rSM");
const qurey = qureystring.parse(parsedURL.query);

console.log(qurey);

 

crypto 모듈

- 단방향 암호화

일반적으로 비밀번호는 hash 방식(복호화 되지 않음)으로 암호화함. 비밀번호는 복호화가 필요한 경우가 없기 때문. 암호화된 값이 일치하는지 확인하기 때문에 본래의 비밀번호는 필요가 없다. 이를 '단방향 암호화'라고 한다. 암호화만 가능하고 복호화가 불가능하기 때문이다.

import crypto from "crypto";

// sha512 암호화 알고리즘 방식 + 보여주는 방식은 base64
crypto.createHash('sha512').update('암호화할 pw').digest('base64')

그러나 본 비밀번호가 달라고 암호화된 값이 같으면 통과처리하는 성질을 이용해 해시 충돌  공격을 어렵게 하기 위해 단방향 암호화 hash에 salt를 가미하기도 한다. 아래 코드에서는 iteration을 100000 줬는데 실제 사용할 때는 복잡하고 큰 수를 줘야 한다. 보통 암호화에 걸리는 시간을 1초 정도가 되게 iteration을 올린다.

import crypto from "crypto";

console.time("암호화에 걸리는 시간");

crypto.randomBytes(64, (err, buf) => {
  const salt = buf.toString("base64");
  console.log("salt : ", salt);
  crypto.pbkdf2("원하는 비밀번호", salt, 100000, 64, "sha512", (err, key) => {
    console.log("password : ", key.toString("base64"));
  });
});

console.timeEnd("암호화에 걸리는 시간");

출력결과는 다음과 같다. 

 

암호화에 걸리는 시간: 0.572ms 
salt :  msSwehdb0YqXhVYlvuOeufb1Th3Js09tKiq0IPpfFSAnDQo9mzeYvK9fCl7kVfJyYXPIb87tikMzlxdu3eqNVQ== 
password :  yFH4a84yEo1X0CrMK44lhiKfZdteTILAycq0sMrJdr+3MtJKbyGytu9AE0Aeao7Jjy3ANwH/QTbdE8pRL8r2tQ==

 

- 양방향 암호화

단방향 암호화와 다르게 복호화가 가능한 암호화이다.

import crypto from "crypto";

const cipher = crypto.createCipher("aes-256-cbc", "열쇠");
let result = cipher.update("암호화 할 문장", "utf8", "base64");
result += cipher.final("base64");
console.log("암호화:", result);

const decipher = crypto.createDecipher("aes-256-cbc", "열쇠");
let result2 = decipher.update(result, "base64", "utf8");
result2 += decipher.final("utf8");
console.log("복호화:", result2);

 

util 모듈

말그대로 각종 편의 기능을 모아 놓은 모듈이다. 굉장히 양이 많기 때문에 자주 쓰이는 deprecate, promisify만 살펴보자.

https://nodejs.org/api/util.html

 

Util | Node.js v13.10.1 Documentation

Util# The util module supports the needs of Node.js internal APIs. Many of the utilities are useful for application and module developers as well. To access it: const util = require('util'); util.callbackify(original)# Added in: v8.2.0 Takes an async funct

nodejs.org

- deprecated

곧 지원을 중단할 것이기 때문에 사용을 자제하고, 이미 사용했다면 다른 것으로 대체하라는 의미이다. API를 만든다면 사용자의 편의를 위해 종종 사용해야 한다.

import util from "util";

const dontUse = util.deprecate((a, b) => console.log(a + b), "곧 deprecated될 함수입니다.");

dontUse(3, 4);

7
(node:1088) DeprecationWarning: 곧 deprecated될 함수입니다.

 

- deprecated

콜백 함수들을 프로미스로 바꿔줌. 프로미스를 지원하지 않는 함수의 경우 이 기능을 사용함. promisify로 감싸주면 그 함수는 프로미스를 지원한다. 위 함수를 아래 함수로 바꿔보았다.

import util from "util";
import crypto from "crypto";

// 이 함수는 프로미스를 지원하지 않음
crypto.randomBytes(64, (err, buf) => {
  const salt = buf.toString("base64");
  console.log("salt:", salt);
  crypto.pbkdf2("비밀번호", salt, 100000, 64, "sha512", (err, key) => {
    console.log("password:", key.toString("base64"));
  });
});

// 아래와 같이
const randomBytesPromise = util.promisify(crypto.randomBytes);

randomBytesPromise(64)
  .then(buf => {
    const salt = buf.toString("base64");
    console.log(salt);
  })
  .catch(error => {
    console.error(error);
  });

 

fs 모듈

fs는 file system의 약자이다. AWS에서 EBS 마운트할 때 fs 설치한 경험이 있을 것이다. 여튼 아래 코드 외에도 fs.open, fs.access 등 다양한 메소드가 존재한다. 명령어를 통해 파일과 폴더를 제어할 수 있다는 점을 알아두자.

import fs from "fs";

// 파일 읽기
fs.readFile("./memo.txt", (err, data) => {
  if (err) {
    console.warn(err);
  }
  console.log(data.toString());
});

// 파일 쓰기
fs.writeFile("./writeme.txt", "원하는 내용을 여기에 적습니다.", (err, data) => {
  if (err) {
    console.warn(err);
  }
});

// 폴더 생성
fs.mkdir("./what", err => {
  if (err) {
    console.warn(err);
  }
  console.log("폴더 생성 성공");
});

// 폴더 삭제
fs.rmdir("./what", err => {
  if (err) {
    console.warn(err);
  }
  console.log("폴더 삭제 성공");
});

https://darrengwon.tistory.com/126

 

[Buffer] 청크, 버퍼, 스트림

node.js에서 fs 모듈을 이용하면 종종 buffer를 마주칠 때가 있다. https://darrengwon.tistory.com/125 Node.js가 제공하는 내장 객체, 변수, 모듈 cf) node.js에는 window 전역 객체가 없다. global이 있다. __f..

darrengwon.tistory.com

* Buffer 버퍼와 Stream 스트림

fs.readFile에서 data.toString()을 거치지 않고 data만 출력하면 <Buffer 72 65 61 64 20 6d 65 20 62 72 6f 21>와 같이 Buffer가 출력된다.
  데이터를 조각(청크, chunk)내어 buffer에 채운 후 다 차면 buffer를 통째로 옮기고 새 buffer에 아직 옮기지 못한 데이터 조각을 다시 채운다. 데이터 조각을 buffer에 채우는 일을 버퍼링(buffering)이라고 부른다. 영상이 버퍼링 중이라며 재생되지 않는 경우를 종종 경험했을텐데 buffer에 데이터를 채울 때까지 기다리는 버퍼링 작업을 말하는 것이다.
  한편 buffer가 다 차면 이를 전송하고 다시 buffer를 채우는 버퍼링 작업을 연속하는 것이 스트림(stream)이다. 버퍼를 이용해 데이터를 전송하는 흐름이 스트림이라고 이해하자.

 

events 모듈

node는 event driven이기 때문에 event를 기반으로 움직인다.

import eventEmitter from "events";

const myEvent = new eventEmitter();

myEvent.addListener("방문", () => {
  console.log("방문해주셔서 감사합니다.");
});

// 같은 이름의 event 생성 가능하며 호출시 순차적 실행
myEvent.addListener("방문", () => {
  console.log("인사 두 번 받으세요");
});

// on은 addEventListener과 동일한 메소드임
myEvent.on("종료", () => {
  console.log("종료되었습니다.");
});

// once는 한 번만 실행됨
myEvent.once("특별 이벤트", () => {
  console.log("한 번만 실행됩니다.");
});

//emit은 이벤트 발생
myEvent.emit("방문");
myEvent.emit("종료");
myEvent.emit("특별 이벤트");
myEvent.emit("특별 이벤트"); // once 메소드기 때문에 실행 안됨

myEvent.removeAllListeners("방문"); // 방문이란 이름을 가진 event를 모두 지움
myEvent.emit("방문"); // 지웠기 때문에 실행 안됨

 

이 외에도 다양한 내장 모듈, 변수, 객체가 존재함


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체