Nodejs Chap3.1~3.9 노드 기본기능

jade·2025년 2월 15일

Node.js

목록 보기
3/11
post-thumbnail

1. CommonJs 모듈 시스템

1) 모듈화

var.js를 다른 파일에서 받아 쓸 수 있다.
모듈화의 2가지 방법

  • 둘 중 한가지 방법만 사용해서 쭉 써야함
  • 방법1을 썼다가 다음 줄에 방법2로 쓰는 식으로 코딩작성하면 안됨
  • module.exports에 아무것도 안넣으면 기본값으로 빈객체가 생성됨
//var.js
const odd = "홀수입니다.";
const even = "짝수입니다";

//모듈화 방법1
//두가지 이상을 exports하고 싶을 때 사용 가능
exports.odd = odd;
exports.even = even;

//모듈화 방법2
module.exports = {
    odd: odd, even: even
};

2) require

기본 개념:
require가 제일 위에 올 필요는 없음
require을 console.log(require)해보면 require 속성들이 나옴

  • require.cache에 한번 require한 모듈에 대한 캐슁 정보가 들어있음
  • require.main은 노드 실행 시 첫 모듈을 가리킴
require('./var'); //var 파일 실행만 됨.

const {odd,even} = require('./var.js'); //구조분해할당
console.log(odd);
console.log(even);

순환 참조

  • 서로가 서로를 require해서 무한cycle이 도는 경우
  • 순환참조가 발견되면 빈객체로 만들어 무한cycle, 순환참조를 막아버림
//require1.js
require('./require2');
//require2.js
require('./require1'); //빈객체

dynamic import

const a = true;
if(a) require('./var');
else require('./index');

2. ES 모듈시스템

기본 개념:
확장자를 mjs로 쓰거나, package.json에 type:"module" 로 바꿔줘야한다.
CommonJs -> ES 모듈이 되면서 바뀐 것

  • require -> import
  • exports -> export
  • module.exports -> export default
  • require, exports는 함수,객체였으나 import export default는 문법 그 자체(예약어)이다.
  • async+await이 항상 함께 -> async 없이 await을 쓸 수 있음
  • dynamic import 방식이 바뀜
  • __dirname, __filename 사용 가능 -> 사용 불가
//var.mjs
export const odd = "홀수입니다.";
export const even = "짝수입니다";

//func.mjs
import { odd, even } from './var.mjs' //확장자까지 꼭 써줘야함
function checkOddorEven(num) {
    if (num % 2) {
        return odd;
    }
    return even;
};
export default checkOddorEven;

dynamic import in ES 모듈

const a = true;
if(a) a1 = await import('./var.mjs');
else a2 = await import('./index.mjs');

3. process

1)기본 개념: 현재 실행중인 노드 프로세스에 대한 정보에 접근할 수 있음

process.upTime(); //프로세스가 시작된 후 지난 시간
process.cwd(); //현재 프로세스가 실행되는 위치
process.pid //프로세스 아이디

process.env : 환경변수

  • 시스템 환경변수 정보가 들어있음
  • 비밀키를 보관하는 용도로 쓰임
  • process.env 로 접근
  • 일부 환경변수는 노드 실행시 영향을 줄 수 있음
const passwd=process.env.SECRET_ID;

process.nextTick

  • 이벤트 루프가 다른 콜백함수보다 process.nextTick 의 콜백함수를 우선적으로 처리
setImmediate(() => {
    console.log('immediate');
});

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

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

Promise.resolve().then(() => console.log('promise'));
//nextTick->promise->timeout->immediate

process.exit

  • 노드 process 종료시킴
  • process.exit(0) : 정상적으로 종료된 것
  • 0 이외의 숫자: 비정상적으로 종료

4. 내장모듈- os path

1) os

운영체제의 정보
process와 겹치는 부분이 있음

//os.js
const os = require('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 가 처리해줌

const path = require('path');
path.join(__dirname, '..', 'var.js'); 
//-> 주어진 경로들을 단순히 이어 붙여 새로운 경로를 만듦
//___dirname에서 한 단계 위(..)로 이동한 후 var.js를 붙인 경로를 반환
///Users/user/project/src/index.js =>/Users/user/project/index.js
path.resolve(__dirname, '..', '/var.js');
//-> 절대 경로를 반환
//__dirname에서 한 단계 위(project)로 이동한 후 var.js를 추가
///Users/user/project/src/index.js =>/Users/user/project/index.js

이 예제들 이외에도 굉장히 많음..

5. url dns searchParams

0) http 해석

1) url(URL) searchParams

URL, searchParams : 내장 모듈이 아니라 객체, require('url') 없어도 됨

const url = require('url');
const myURL = new URL('https://www.naver.com/');
console.log(myURL);
console.log(url.format(myURL)); //문자열로 바꿔줌
/* 출력1
URL {
  href: 'https://www.naver.com/',
  origin: 'https://www.naver.com',
  protocol: 'https:',
  username: '',
  password: '',
  host: 'www.naver.com',
  hostname: 'www.naver.com',
  port: '',
  pathname: '/',
  search: '',
  searchParams: URLSearchParams {},        
  hash: ''
}
출력2: https://www.naver.com/ 
*/
const myURL = new URL('http://www.gilbut.co.kr/?page=3&limit=10&category=nodejs&category=javascript');

console.log('searchParams:', myURL.searchParams);
console.log('searchParams.getAll():', myURL.searchParams.getAll('category'));
console.log('searchParams.get():', myURL.searchParams.get('limit'));
console.log('searchParams.has():', myURL.searchParams.has('page'));

console.log('searchParams.keys():', myURL.searchParams.keys());
console.log('searchParams.values():', myURL.searchParams.values());

myURL.searchParams.append('filter', 'es3');
myURL.searchParams.append('filter', 'es5');
console.log(myURL.searchParams.getAll('filter'));

myURL.searchParams.set('filter', 'es6');
console.log(myURL.searchParams.getAll('filter'));

myURL.searchParams.delete('filter');
console.log(myURL.searchParams.getAll('filter'));

console.log('searchParams.toString():', myURL.searchParams.toString());
myURL.search = myURL.searchParams.toString();

2) 내장모듈- dns

내장 모듈
주로 도메인을 통해 IP나 기타 dns를 찾는데 쓰임

import dns from 'dns/promises';
const ip = await dns.lookup('gilbut.co.kr');
console.log(ip); //ip 주소 가져옴
const a = await dns.resolve('gilbut.co.kr', 'A');
console.log(a);  //ipv4 주소
const mx = await dns.resolve('gilbut.co.kr', 'MX');
console.log(mx); //메일서버 관련 정보들(=레코드 라고 부름)
const cname = await dns.resolve('www.gilbut.co.kr', 'CNAME');
console.log(cname); //별칭(www가 붙은 주소는 별칭인 경우가 많다) 
const any = await dns.resolve('gilbut.co.kr', 'ANY');
console.log(any); 

6. 내장모듈- crypto, util

1) crypto

암호화: 평문 -> 암호, 복호화: 암호 -> 평문
해시: 단방향 암호화의 대표주자: 암호화만 되고 복호화가 안됨

const crypto = require('crypto');
console.log(crypto.createHash('sha512').update('비밀번호').digest('base64'))
//비밀번호 라는 문자열을 해시로 바꿈

cipher, decipher : 양방향 암호화

const cipher = crypto.createCipheriv(algorithm, key, iv);
const decipher = crypto.createDecipheriv(algorithm, key, iv);

2) util

각종 편의 기능을 모아둠

deprecate
그 함수가 사용되었을 때 경고창을 띄움

const util = require('util');

const dontuse = util.deprecate((x, y) => {
    console.log(x + y);
}, 'dontuse 함수는 더이상 사용하지 마세요');
  • console.log(x + y) 를 실행하여 8을 출력.
  • 동시에 DeprecationWarning(사용 중단 경고) 이 발생하며, dontuse 함수는 더이상 사용하지 마세요 라는 메시지가 표시됨

promisify
콜백 기반 함수를 Promise 기반 함수로 변환

// crypto.randomBytes를 Promise 기반 함수로 변환
const promiseme = util.promisify(crypto.randombytes);
promiseme(64)
    .then((buf) => {
        console.log(buf.toString('base64'));
    })
    .catch((error) => {
        console.log(error);
    });

0개의 댓글