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(이벤트명)
'프로그래밍 > Node.js' 카테고리의 다른 글
[Node.js] 테스트 프레임워크 및 부가 라이브러리 알아보기 (0) | 2019.07.06 |
---|---|
[Node.js] Nodemon이란? (0) | 2019.07.06 |
[Node.js] Forever 란? (0) | 2019.07.06 |
[Node.js 요약 정리] 2. Node.js를 위한 기본 자바 스크립트 (0) | 2019.02.10 |
[Node.js 요약 정리] 1. Node.js 개요 (0) | 2019.02.10 |