3-1. 노드 내장 객체 및 모듈
--- 노드 내장 객체 ---
global
노드에 내장된 전역객체로, 브라우저의 window 객체를 대체한다.
window 객체처럼 사용 시에 생략이 가능하다.
아래에서 설명할 속성들은 모두 global이 생략되어 있다.
ex) global.console.log() => console.log()
console
주로 디버깅에 사용된다. 많이 사용하는 console.log() 메서드도 여기에 있다.
console로 출력되는 모든 내용은 콘솔창에 출력된다.
메서드명 | 설명 |
---|---|
console.time(텍스트) | console.timeEnd()와 대응되어 시간을 측정함 |
console.log(내용) | 작성한 내용을 출력해줌 |
console.error(에러) | 에러를 출력해줌 |
console.table(배열) | 배열의 요소로 객체 리터럴을 넣으면, 테이블 형식으로 표현되어 출력됨 |
타이머
- 타이머 실행 메서드
setImmediate() 또한 이벤트 루프를 거친다.메서드명 설명 setTimeout(콜백 함수, 밀리초)
주어진 밀리초 이후에 콜백함수를 실행 setInterval(콜백 함수, 밀리초)
주어진 밀리초마다 콜백함수를 반복 실행 setImmediate(콜백 함수)
콜백 함수를 즉시 실행 - 타이머 취소 메서드
아이디는 해당 메서드에 대응되는 메서드의 변수명을 가리킨다.// example const timer = setTimeout(() => {console.log('1초')}, 1000); clearTimeout(timer);
메서드명 설명 clearTimeout(아이디)
setTimeout을 취소해줌 clearInterval(아이디)
setInterval을 취소해줌 clearInterval(아이디)
setImmediate를 취소해줌
__dirname, __filename
메서드명 | 설명 |
---|---|
__dirname | 현재 경로를 리턴함 |
__filename | 파일명을 포함한 현재 경로를 리턴함 |
module, exports, require
모듈을 만들 때 module.exports 말고 exports 객체로도 만들 수 있다.
차이점이 있다면 exports는 속성명과 속성값이 꼭 있어야 한다.
exports.odd = '홀수';
exports.even = '짝수';
노드는 CommonJS를 기반으로 동작한다.
바벨같은 트랜스파일러를 이용하면 ES6 방식으로도 개발이 가능하다.
CommonJS | ES6 | |
---|---|---|
Import | require() | import 변수명 from 경로 |
Export | module.exports exports | exports (default) {코드} |
export에 default가 붙으면 이름 없이 내보낼 수 있다.
(그 파일 내에서 내보내는것들 중에서 메인으로 export 한다는 뜻)
process
process는 현재 실행되고 있는 노드 프로세스에 대한 정보를 담고 있다.
rocess.env
p시스템의 환경 변수를 출력해준다.
또한 서버나 데이터베이스의 비밀번호나 각종 API키를 넣어 사용하기도 한다.
p
(p
const secretId = process.env.SECRET_ID;
const secretCode = process.env.SECRET_CODE;
process.nextTick(콜백)
콜백함수를 Micro Task Queue
에 넣어준다.
그래서 nextTick
은 Promise
처럼 setImmediate
나 setTimeout
보다 먼저 실행된다.
process.exit(코드)
실행 중인 노드 프로세스를 수동으로 종료할 때 사용한다.
인수는 생략 가능하며 0을 입력하여 정상 종료, 1을 입력하여 비정상 종료를 명시하기도 한다.
--- 노드 내장 모듈 ---
노드에 내장되어 있어서 바로 import하여 사용 가능한 모듈을 뜻한다.
os
웹 브라우저에 사용되는 자바스크립트는 운영체제의 정보를 가져올 수 없지만,
노드는 os 모듈을 통해 가져올 수 있다.
메서드명 | 설명 |
---|---|
os.arch() | 운영체제 아키텍처 |
os.platform() | 운영체제 플랫폼 |
os.type() | 운영체제 종류 |
os.uptime() | 부팅되고 흐른 시간(초) |
os.hostname() | 호스트(컴퓨터)의 이름 |
os.release() | 운영체제 버전 |
os.homedir() | 홈 디렉토리 경로 |
os.tmpdir() | 임시 파일 저장 경로 |
os.cpus() | 컴퓨터의 코어 정보 |
os.freemem() | 사용 가능한 메모리 |
os.totalmem() | 전체 메모리 용량 |
path
- 윈도 : 경로를
\
로 구분함 - POSIX(유닉스 기반) :
\
로 구분함
메서드명 | 설명 |
---|---|
path.sep | 경로의 구분자 윈도: \ , POSIX: / |
path.delimiter | 환경변수의 구분자p 를 입력해보면 이 구분자로 구분되어 있음윈도: ; , POSIX: : |
path.dirname(경로) | 파일이 위치한 경로 |
path.extname(경로) | 파일의 확장자를 보여줌 |
path.basename(경로, 확장자) | 파일의 이름(확장자 포함)을 표시해줌 파일의 이름만 표시하고 싶다면 두번째 인수로 확장자를 작성해줘야함 |
path.parse(경로) | 파일 경로를 root, dir, base, ext, name으로 분리함 |
path.format(객체) | path.parse() 한 객체를 파일 경로로 합칩니다. |
path.normalize(경로) | 경로 구분자를 오타냈을 때 정상적인 경로로 변환해줌 |
path.isAbsolute(경로) | 경로가 절대경로면 true |
path.relative(첫번째경로, 두번째경로) | 첫번째경로에서 두번째경로로 가는 방법을 알려줌 |
path.join(경로, ...) | 여러 인수를 넣으면 하나의 경로로 합쳐짐 |
path.resolve(경로, ...) | / 를 절대경로로 인식해 이전의 경로를 지워줌 |
- path.join()과 path.resolve()의 차이
path.join('/a', '/b', 'c'); // /a/b/c/
path.resolve('/a', '/b', 'c'); // /b/c
url
인터넷 주소를 쉽게 조작하도록 도와주는 모듈 host 부분 없이 pathname 부분만 오는 주소의 경우 WHATWG 방식을 사용할 수 없기에 url 모듈을 사용해야함
메서드명 | 설명 | WHATWG 방식과의 차이점 |
---|---|---|
url.parse(주소) | 주소를 분해한다. | username, password 대신 auth 속성을 사용함 searchParams 대신 query가 있음 |
url.format(객체) | 분해되었던 url 객체를 다시 조립함 |
- searchParams WHATWG 방식은 search 부분을 searchParams라는 특수한 객체로 반환한다.
사용법은 아래와 같다.
const { URL } = ruquire('url');
const myURL = new URL('주소값');
myURL.searchParams.getAll('키');
메서드명 | 설명 |
---|---|
.getAll(키) | 키에 해당하는 모든 값을 가져옴 |
.get(키) | 키에 해당하는 첫 번째 값만 가져옴 |
.has(키) | 해당 키가 있는지 검사함 |
.keys() | searchParams의 모든 키를 iterator 객체로 가져옴 |
.values() | searchParams의 iterater 객체로 가져옴 |
.append(키, 값) | 해당 키를 추가함 |
.set(키, 값) | 같은 키의 값들을 지우고 새로 추가함 |
.delete(키) | 해당 키를 제거함 |
.toString() | 해당 searchParams 객체를 다시 문자열로 만들어줌 이 문자열을 search에 대입하면 주소 객체에 반영됨 |
query 같은 문자열보다 searchParams가 유용한 이유는 query 경우 querystring 모듈을 한번 더 사용해야 한다.
querystirng
노드의 url 모듈을 사용할 때, search 부분을 사용하기 쉽게 객체로 만드는 모듈
메서드명 | 설명 |
---|---|
querystirng.parse(쿼리) | url의 query 부분을 자바스크리브 객체로 분해함 |
querystirng.stringify(객체) | 분해된 query 객체를 문자열로 다시 조립함 |
crypto
단방향 암호화
단방향 암호화란 복호화할 수 없는 암호화 방식을 뜻한다. 주로 비밀번호를 저장할 때 원본은 저장할 필요가 없기에 이런 경우에 쓰인다.
메서드명 | 설명 |
---|---|
.createHash(알고리즘) | 사용할 해시 알고리즘을 넣음 md5, sha1, sha256, sha5, sha512 등이 있음 |
.update(문자열) | 변환할 문자열을 넣어줌 |
.digest(인코딩) | 인코딩하 알고리즘을 넣어줌 base64, hex, latin1 등이 있음 |
- 예제
const crypto = require('crypto');
const str = '비밀번호';
const encryptedStr = crypto.createHash('sha512').update(str).digest('base64');
console.log(encryptedStr);
양방향 (대칭형) 암호화
키를 이용하여 암호화 된 문자열을 복호화할 수 있음
좀 더 간단하게 암호화를 하고 싶다면 crypto-js 패키지를 추천한다고 함
util
메서드명 | 설명 |
---|---|
util.deprecate(콜백, 출력할 warning) | 첫번째에 넣은 함수를 사용했을 때 경고 메시지를 출력해줌 |
util.promisify(콜백) | 콜백 패턴을 프로미스 패턴으로 바꿔줌 바꿔두면 async/await 패턴을 사용할 수 있어 좋음 |
worker_threads
노드에서 멀티 스레드 방식으로 작업할 수 있게 해줌
child_process
노드에서 다른 프로그램을 실행하고 싶거나 명령어를 수행하고 싶을 때 사용하는 모듈
둘 다 첫번째 인자에 사용할 shell 명령어를 작성해준다.
메서드명 | 리턴 타입 |
---|---|
exec() | buffer |
spawn() | stream |
사용법은 아래와 같다.
const exec = require('child_process').exec;
// exec('dir') : 현재 폴더의 파일 목록 표시
// 리눅스나 맥은 'dir' 대신 'ls'
const process = exec('dir');
// 첫번째 인자에 'data'라고 명시해줘야 제대로 된 경로를 가져옴
process.stdout.on('data', (data) => {
console.log(data.toString());
}); // 실행 결과
process.stderr.on('data', (data) => {
console.error(data.toString());
}); // 실행 에러