1. 내장객체 알아보기
1) global
브라우저의 window와 같은 전역 객체이다. 전역 객체이기 때문에 모든 파일에서 접근 가능
window처럼 생략 가능(console, require도 global의 속성), global 속성에 값을 대입하면 다른 파일에서도 사용 가능하다. (하지만, 이렇게 하는건 유지보수에 좋지 않다)
1. globalA.js
module.exports = () => global.message;
2. globalB.js
const A = require('./globalA');
global message = '안녕하세요.';
console.log(A());
2) console
console도 노드에서는 window대신 global 객체 안에 들어 있다.브라우저의 console 객체와 매우 유사하다.
보통 디버깅을 위해 사용한다. 대표적으로 console.log메서드가 있다.
대표 함수
console.time / console.timeEnd : 시간 로깅
console.error : 에러 로깅
console.log : 평범한 로그
console.dir : 객체 로깅
console.trace : 호출스택 로깅 (함수 안에서 사용하면 호출스택 보여줌)
console.table([{ name: '제로', phone: '123-123'}, { name: '케이', phone: '125-125'}]) : 테이블 형식으로 보여줌
3) 타이머
대표 함수
set 메서드에 clear 메서드가 대응됨
setTimeout(콜백 함수, 밀리초) : 주어진 밀리초(1000분의 1초) 이후에 콜백 함수를 실행
setInterval(콜백 함수, 밀리초) : 주어진 밀리초마다 콜백 함수를 반복 실행
setImmediate(콜백 함수) : 콜백 함수를 즉시 실행
clearTimeout(아이디) : setTimeout을 취소
clearInterval(아이디) : setInterval을 취소
clearImmediate(아이디) : setImmediate를 취소
setTimeout / setInterval / setImmediate : 함수를 백그라운드로 보내는 대표적인 비 동기 코드
4) process
process 객체는 현재 실행되고 있는 노드 프로세스에 대한 정보를 담고 있다.
process.version // 설치된 노드의 버전
process.arch // 프로세서 아키텍처 정보 x64, arm, ia32 등의 값일 수 있음.
process.platform // 운영체제 플랫폼 정보. win32, linux나 darwin, freebsd 등의 값일 수 있음.
process.pid // 현재 프로세스의 아이디. 프로세스를 여러 개 가질 때 구분할 수 있음.
process.uptime() // 프로세스가 시작된 후 흐른 시간. 단위는 초
process.execPath // 노드의 경로
process.cwd() // 현재 프로세스가 실행되는 위치. (=노드 명령어를 어디서 실행됐는지. 자주 사용됨)
process.cpuUsage() // 현재 cpu 사용량.
4-1) process.env : 시스템 환경 변수들이 들어있는 객체
비밀키(데이터베이스 비밀번호, 서드파티 앱 키 등)를 보관하는 용도로도 사용.
환경 변수는 process.env로 접근 가능.
const secretId = process.env.SECRET_ID;
const secretCode = process.env.SEVRET_CODE;
일부 환경 변수는 노드 실행 시 영향을 미친다.
예) NODE_OPTIONS(노드 실행 옵션) / UV_THREADPOOL_SIZE(스레드풀 개수)
max-old-space-size는 노드가 사용할 수 있는 메모리를 지정하는 옵션.
4-2) process.nextTick(콜백) : 이벤트 루프가 다른 콜백 함수들보다 nextTick의 콜백 함수를 우선적으로 처리함
너무 남용하면 다른 콜백 함수들 실행이 늦어진다.
비슷한 경우로 promise가 있다. (promise도 nextTick 처럼 우선순위가 높음)
4-3) process.exit(코드) : 현재의 프로세스를 멈춤
코드가 없거나 0이면 정상 종료
이외의 코드는 비 정상 종료를 의미함.
process.exit(1); // 서버에서 에러 났다는걸 알리고, 종료하기 위해 사용.
2. 내장 모듈 사용하기
1) os
웹 브라우저에 사용되는 자바스크립트는 운영체제의 정보를 가져올 수 없지만, 노드는 os 모듈에 정보가 담겨 있어 정보를 가져올 수 있다.
사용법 : require('os') 또는 require('node:os')
내장 모듈이라 경로 대신 이름만 적어줘도 된다.
os 모듈의 대표적인 메서드
os.arch() : process.arch와 동일
os.platform() : process.platform과 동일
os.type() : 운영체제의 종류를 보여줌
os.uptime() : 운영체제 부팅 이후 흐른 시간(초)을 보여줌. (process.uptime()은 노드의 실행 시간)
os.hostname() : 컴퓨터의 이름을 보여줌
os.release() : 운영체제의 버전을 보여줌
os.homedir() : 홈 디렉터리 경로를 보여줌
os.tmpdir() : 임시 파일 저장 경로를 보여줌
os.cpus() : 컴퓨터의 코어 정보를 보여줌
os.freemem() : 사용 가능한 메모리(RAM)을 보여줌
os.totalmem() : 전체 메모리 용량을 보여줌
2) path
폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈이다. path 모듈이 필요한 이유 중 하나는 운영체제별로 경로 구분자가 다르기 때문이다.
윈도우 : C:\Uers\ZeroCho 처럼 \로 구분한다
POSIX : /home/zerocho 처럼 /로 구분한다
path 모듈의 속성과 메서드
path.sep : 경로의 구분자 (Windows : \, POSIX : /)
path.delimiter : 환경 변수의 구분자. process.env.PATH를 입력하면 여러 개의 경로가 이 구분자로 구분되어 있다. (Windows : tpalzhffhs(;), POSIX : 콜론(:))
path.dirname(경로) : 파일이 위치한 폴더 겨올를 보여줌
path.extname(경로) : 파일의 확장자를 보여줌
path.basename(경로, 확장자) : 파일의 이름(확장자 포함)을 보여줌. 파일의 이름만 표시하고 싶다면 basename의 두 번째 인자로 파일의 확장자를 넣어주면 됨
path.parse(경로) : 파일 경로를 roow, dir, base, ext, name으로 분리
path.format(객체) : path.parse()한 객체를 파일 경로로 합친다.
path.normalize(경로) : /나 \를 실수로 여러 번 사용했거나 혼용했을 때 정상적인 경로로 변환해줌.
path.isAbsolute(경로) : 파일의 경로가 절대경로인지, 상대경로인지 true나 false로 알려줌
path.relative(기준경로, 비교경로) : 경로를 두 개 넣으면 첫 번째 경로에서 두 번째 경로로가는 방법을 알려줌
path.join(경로, ...) : 여러 인자를 넣으면 하나의 경로로 합쳐준다. 상대경로인 .. (부모 디렉터리)와 . (현 위치)도 알아서 처리해줌
path.resolve(경로, ...) : path.join()과 비슷하지만 차이가 있다.
3) url
인터넷 주소를 쉽게 조작하도록 도와주는 모듈이다.
url 메서드
getAll(키) : 키에 해당하는 모든 값들을 가져옴. 위에서 category 키에는 두 가지 값, 즉 nodejs와 javascript의 값이 들어있음.
get(키) : 키에 해당하는 첫 번째 값만 가져옴
has(키) : 해당 키가 있는지 없는지를 검사
keys() : searchParams의 모든 키를 반복기(iterator, ES2015 문법) 객체로 가져옴
values() : searchParams의 모든 값을 반복기 객체로 가져옴
append(키, 값) : 해당 키를 추가. 같은 키의 값이 있다면 유지하고 하나 더 추가.
set(키, 값) : append와 비슷하지만, 같은 키의 값들을 모두 지우고 새로 추가.
delete(키) : 해당 키를 제거
toString() : 조작한 searchParams 객체를 다시 문자열로 만든다. 이 문자열을 search에 대입하면 주소 객체에 반영됨.
4) dns
DNS를 다룰 때 사용하는 모듈이다. 주로 도메인을 통해 IP나 기타 DNS 정보를 얻고자 할 때 사용한다.
5) crypto
다양한 방식의 암호화를 도와주는 모듈이다.
5-1) 단방향 암호화(해시함수)
비밀번호는 보통 단방향 암호화 알고리즘을 사용해서 암호화한다.
- createHash(알고리즘) : 사용할 해시 알고리즘을 넣어줍니다. md5, sha1, sha256, sha512 등이 가능하지만, md5와 sha1은 이미 취약점이 발견됨. 현재는 sha512 정도로 충분하지만 나중에 sha512마저도 취약해지면 더 강화된 알고리즘으로 바꿔야 함.
- update(문자열) : 변환할 문자열을 넣어줍니다.
- digest(인코딩) : 인코딩할 알고리즘을 넣어줍니다. base64, hax, latin1이 주로 사용되는데, 그중 base64가 결과 문자열이 가장 짧아 애용된다. 결과물로 변환된 문자열을 반환한다.
현재는 주로 pbkdf2나 bcrypt, scrypt라는 알고리즘으로 비밀번호를 암호화하고 있다.
pbkdf2는 기존 문자열에 salt라고 불리는 문자열을 붙인 후 해시 알고리즘을 반복해서 적용하는 것이다
pbkdf2.js
const crypto = require('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'));
});
});
먼저 randomBytes() 메서드로 64바이트 길이의 문자열을 만든다. 이것이 salt가 된다. pbkdf2()메서드에는 순서대로 비밀번호, salt, 반복 횟수, 출력 바이트, 해시 알고리즘을 인수로 넣는다
5-2) 양방향 암호화
암호화된 문자열을 복호화 할 수 있으며, 키라는 것이 사용된다.
cipher.js
const crypto = require('crypto');
const algorithm = 'aes-256-cbc';
const key = 'abcdefghijklmnopqrstuvwxyz123456';
const iv = '1234567890123456';
const cipher = crypto.createCipheriv(algorithm, key, iv);
let result = cipher.update('암호화할 문장', 'utf8', 'base64');
result += cipher.final('base64');
console.log('암호화 : ', result);
const decipher = crypto.createDecipheriv(algorithm, key, iv);
let result2 = decipher.update(result, 'base64', 'utf8');
result2 += decipher.final('utf8');
console.log('복호화 : ', result2);
- crypto.createCipheriv(알고리즘, 키, iv) : 암호화 알고리즘과 키, 초기화백터를 넣어줍니다.
암호화 알고리즘은 aes-256-cbc를 사용. 다른 알고리즘을 사용해도 됨.
사용 가능한 알고리즘 목록은 crypto.getCiphers()를 하면 볼 수 있다.
키는 32바이트, 초기화백터(iv)는 16바이트로 고정. - cipher.update(문자열, 인코딩, 출력 인코딩) : 암호화할 대상과 대상의 인코딩, 출력 결과물의 인코딩을 넣어줍니다.
보통 문자열은 utf8 인코딩을 / 암호는 base64를 많이 사용함. - cipher.final(출력 인코딩) : 출력 결과물의 인코딩을 넣어주면 암호화가 안료된다.
crypto.createDecipheriv(알고리즘, 키, iv) : 복호화할 때 사용. 암호화할 때 사용했던 알고리즘과 키, iv를 그대로 넣어줘야 한다. - decipher.update(문자열, 인코딩, 출력 인코딩) : 암호화된 문장, 그 문장의 인코딩, 복호화할 인코딩을 넣어줍니다.
createCipher의 update()에서 utf8, base64 순으로 넣었다면 createDecipher의 update()에서 base64, utf8 순으로 넣으면 된다. - decipher.final(출력 인코딩) : 복호화 결과물의 인코딩을 넣어줍니다.
6) util
각종 편의 기능을 모아둔 모듈
util 메서드
util.deprecate : 함수가 deprecated 처리되었음을 알려줍니다. 첫 번째 인자로 넣은 함수를 사용했을 때 경고 메시지가 출력됩니다. 두 번째 인자로 경고 메시지 내용을 넣으면 됨. 함수가 조만간 사라지거나 변경될 때 알려줄 수 있어 유용함.
util.promisify : 콜백 패턴을 프로미스 패턴으로 바꿔줍니다. 바꿀 함수를 인자로 제공하면 된다. 이렇게 바꾸어두면 async/await 패턴까지 사용할 수 있어 좋다.
7) worker_threads, child_process
스레드와 프로세스는 내용이 많으니 아래 글에 따로 정리해두었다.
8) 기타 모듈들
assert : 값을 비교하여 프로그램이 제대로 동작하는지 테스트하는 데 사용.
dns : 도메인 이름에 대한 IP 주소를 얻어내는데 사용.
net : HTTP 보다 로우 레벨인 TCP 나 IPC 통신을 할 때 사용.
string_decoder : 버퍼 데이터를 문자열로 바꾸는 데 사용.
tls : TLS와 SSL에 관련된 작업을 할 때 사용.
tty : 터미널과 관련된 작업을 할 때 사용.
dgram : UDP와 관련된 작업을 할 때 사용.
v8 : V8 엔진에 직접 접근할 때 사용.
vm : 가상 머신에 직접 접근할 때 사용.
참고 : ⌜node.js 교과서⌟ 책을 공부하며 요약・정리한 내용입니다.
'💻 Web_Back end > node.js' 카테고리의 다른 글
[node.js] npm (0) | 2023.05.11 |
---|---|
[node.js] 쿠키와 세션 (0) | 2023.05.10 |
[node.js] http 모듈로 서버 만들기 (0) | 2023.05.10 |
노드 파일 시스템 접근하기 (0) | 2023.05.09 |
노드 기능1 (모듈로 만들기) (0) | 2023.05.08 |