본문 바로가기

프로그래밍/Node.js

[Node.js 요약 정리] 3. Node 내장 객체와 내장 모듈

3. Node 내장 객체와 내장 모듈

1) REPL

-  REPL(Read Eval Print Loop): 입력한 코드를 읽기(Read)와 해석(Eval), 반환(Print)을 종료할 때 까지 반복(Loop)한다고 해서 REPL이라고 함

- 자바스크립트는 스크립트 언어이므로 컴파일하지 않아도 즉석에서 코드 실행 가능

- 사용 방법: node를 실행해서 프롬프트가 > 모양으로 변했을 때 스크립트 코드를 입력함으로써 사용

- 종료 명령어: .exit

 

2) JS 파일 실행

- .js 파일을 생성 후 node 명령어를 사용해서 실행 가능

- 예시

*helloWorld.js // 아래 코드를 가진 파일 생성

console.log('Hello World');

 

> node helloWorld

// 출력 결과: Hello World

 

3) 모듈 생성

- 모듈: 특정한 기능을 하는 함수나 변수들의 집합

- 보통 파일 하나가 하나의 모듈이 되며 여러 프로그램에 모듈 재사용 가능

 

- module 객체 사용 예시

*menu.js

const americano = 4000;

const cappuccino= 4500;

 

module.exports = { americano , cappuccino }

 

*main.js

const { americano, cappuccino } = require('./menu'); // js혹은 json과 같은 확장자 생략 가능

console.log(`아메리카노: ${americano}원, 카푸치노: ${cappuccino}원`)

// 실행 결과: 아메리카노: 4000원, 카푸치노: 4500원

- exports 객체 사용 예시

*menu.js

exports.americano = 4000;

exports.cappuccino = 4500;

 

*main.js // 위와 동일

const { americano, cappuccino } = require('./menu');

console.log(`아메리카노: ${americano}원, 카푸치노: ${cappuccino}원`)

// 실행 결과: 아메리카노: 4000원, 카푸치노: 4500원

 

- 자바스크립트 모듈 예시

*sum.mjs

function sum(num1, num2) {

return num1+num2;

}

 

export default sum;

 

*main.mjs

import sum from './sum.mjs'

console.log(sum(1,2))

 

> node --experimental-modules main.mjs // 실행 결과 3

 

4) 노드 내장 객체

- 노드 자체에 내장되어 있어서 따로 설치하지 않고 바로 사용 가능한 객체

- 내장 객체: global, console, 타이머(setTimeout, setInterval, setImmediate 및 clear함수), __filename, __dirname, module, exports, process,

 

4-1) global

- 브라우저의 window와 같은 전역 객체

- node에는 DOM과 BOM이 없어서 window와 document 객체를 사용할 수 없음

- 편리하게 파일 간 데이터 공유가 가능하지만 유지보수에 어려움을 겪을 수 있으므로 모듈 형태로 사용하는 것을 권장

- 사용 방법: global.객체명 = 객체

- 예시

*menu.js

global.americano = 4000;

global.cappuccino = 4500;

 

*main.js

require('./menu');

console.log(`아메리카노: ${global.americano}원, 카푸치노: ${global.cappuccino}원`);

 

global.americano = 1000;

global.cappuccino = 500;

console.log(`아메리카노: ${global.americano}원, 카푸치노: ${global.cappuccino}원`);

// 출력 결과

// 아메리카노: 4000원, 카푸치노: 4500원

// 아메리카노: 1000원, 카푸치노: 500원

 

4-2) console

- global 객체에 포함되어 있으며 보통 디버깅을 위해 사용

- 내장 함수

log(내용...): 로그를 콘솔창에 출력

time(레이블): timeEnd(레이블)과 대응되어 time과 timeEnd 사이의 시간 측정

error(에러 내용): 에러를 콘솔창에 출력

dir(객체, 옵션): 객체를 콘솔에 출력할 때 사용하며 옵션을 통해 커스터마이징 가능

trace(레이블): 에러 발생을 추적하기 위해 사용

 

4-3) 타이머

- global 객체에 포함되어 있으며 타이머 기능을 제공

- setTimeout(콜백 함수, 밀리초): 주어진 밀리초 이후에 콜백 함수를 실행

- setInterval(콜백 함수, 밀리초): 주어진 밀리초마다 콜백 함수를 반복 실행

- setImmediate(콜백 함수): 콜백 함수를 즉시 실행

- clear/Timeout, Interval, Immediate/(아이디): 위 타이머 함수가 반환한 아이디를 통해 타이머 취소 가능

 

4-4) __filename, __dirname

- 파일과 경로에 대한 정보 제공

- 객체 타입과 구분자 문제로 인해 path 모듈과 함께 사용

 

4-5) process

- 현재 실행되고 있는 노드 프로세스에 대한 정보를 담고있는 객체

- 일반적으로 운영체제나 실행 환경별로 다른 동작을 하고 싶을 때 사용

- process.env: 시스템 환경 변수가 저장되는 공간으로서 서비스의 중요한 키를 저장하는 공간으로도 사용

- process.exit: 실행 중인 노드 프로세스를 종료

- process.nextTick(콜백 함수): 이벤트 루프가 nextTick의 콜백 함수를 우선으로 처리하도록 함(Promise와 함께 마이크로태스크로 구분)

 

- 예시

setImmediate(() => { console.log('setImmediate')})

setTimeout(()=>{console.log('setTimeout')}, 0)

Promise.resolve().then(()=>console.log('Promise'))

process.nextTick(()=>{console.log('process.nextTick')})

// 실행 순서

// 1.process.nextTick

// 2. Promise

// 3. setTimeout

// 4. setImmediate

 

5) 노드 내장 모듈

- 노드 자체에 내장되어 있어서 따로 설치하지 않고 바로 사용 가능한 모듈

- 내장 모듈: os, path, url, querystring, crypto, util, fs

 

5-1) os

- 운영체제의 정보를 다루기 위한 객체

- process 객체와 겹치는 정보가 존재함

- 내장 객체 및 함수: arch, platform, type, uptime, hostname, release, homedir, cpus, freemem, totalmem

- os.cpus(): cpu 코어 정보를 담고 있으며 cluster 모듈을 사용하는 경우에 코어 개수에 맞춰 프로세스 확장 가능

 

5-2) path

- 폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈

- 운영체제별로 경로 구분자가 다르기 때문에 path 모듈이 필수

- 내장 객체 및 함수: sep, delimiter, dirname, extname, basename, parse, format, normalize, isAbsolute, relative, join, resolve

 

5-3) url

- 인터넷 주소를 쉽게 조작하도록 도와주는 모듈

- 기존 노드 방식과 WHATWG 방식으로 구분

- 기존 노드 방식 함수: parse(URL -> 객체), format(객체 -> URL)

- WHATWG 방식 함수: getAll, get, has, keys, values, append, set, delete, toString

 

5-4) querystring

- 기존 노드의 url을 사용할 때 search 부분을 사용하기 쉽게 객체로 만드는 모듈

- 내장 함수

parse(쿼리): url의 query 부분을 자바스크립트 객체로 분해

stringify(객체): 분해된 query 객체를 문자열로 조립

 

5-5) crypto

- 다양한 방식의 암호화를 도와주는 모듈

- 단방향 암호화: 복호화할 수 없는 암호화 방식으로 주로 해시 알고리즘을 사용함, 비밀번호 암호화에 사용

- 단방향 암호화 함수

createHash(알고리즘): 사용할 알고리즘을 선택(ex. sha512)

update(문자열): 변환할 문자열 입력

digest(인코딩): 인코딩할 알고리즘 사용(ex. base64)

 

- 양방향 암호화: 키를 지정해서 복호화 할 수 있는 암호화 방식

- 양방향 암호화 함수

crypto.createCipher(알고리즘, 키): 암호화 알고리즘 지정(crypto.getCiphers()를 통해 사용 가능한 알고리즘 확인 가능)

cipher.update(문자열, 인코딩, 출력 인코딩): 출력 결과물의 인코딩 지정(보통 문자열은 utf-8, 암호는 base64를 사용)

cipher.final(출력 인코딩): 출력 결과물의 인코딩 지정

crypto.createDecipher(알고리즘, 키): 복호화 함수, 암호화시 사용한 알고리즘과 키를 입력

decipher.update(문자열, 인코딩, 출력 인코딩): 암호화된 문장과 인코딩을 입력(cipher.update의 반대 순서)

decipher.final(출력 인코딩): 복호화 결과물의 인코딩 지정

 

5-7) util

- 각종 편의 기능을 모아둔 모듈

- deprecate: 함수가 deprecated 처리되었음을 알림

- promistify: 콜백 패턴을 프로미스 패턴으로 변경

 

5-8) fs

- 파일 시스템에 접근하는 모듈

- 브라우저 기반으로 작동하는 자바스크립트와 달리 파일 시스템에 접근 가능

- 프로미스 형식으로 사용 가능 (ex. const fsPromises = require('fs').promises;)

 

- 파일 입출력 방식에는 버퍼를 이용하는 방식과 스트림을 이용하는 방식으로 구분

- 버퍼: 메모리에 저장된 파일 데이터 공간

- Buffer 객체의 함수: from(문자열), toString(버퍼), concat(배열), alloc(바이트)

 

- 스트림: 버퍼를 chunk 단위로 나눠서 전송하는 방식

- fs모듈의 createReadStream, createWriteStream 함수 사용

 

- fs 모듈의 다른 함수들: access(경로, 옵션, 콜백), mkdir(경로, 콜백), open(경로, 옵션, 콜백), write(), rename(기존 경로, 새 경로, 콜백), readdir(경로, 콜백), unlink(경로, 콜백), rmdir(경로, 콜백)

 

5-9) events

- 이벤트 관리를 위한 모듈

- new 키워드를 사용해서 객체 생성 후 이벤트 관리용 함수 사용 가능

- on(이벤트명, 콜백), addListener(이벤트명, 콜백), emit(이벤트명), once(이벤트명, 콜백), once(이벤트명, 콜백), removeAllListeners(이벤트명), removeListener(이벤트명, 리스너), off(이벤트명, 콜백), listenerCount(이벤트명)