본문 바로가기

Back-End/NodeJS

3. 노드 기능 알아보기

util 모듈 ( promisify, depricated )

// util 모듈
const util = require('util');
const crypto = require('crypto');

// deprecated method임을 알려 줄 때 사용
const dont_use_me = util.deprecate((x,y)=>{
console.log(x+y);
},'이 함수는 이제 안 쓸거에요~');

dont_use_me(1,2); // DeprecationWarning이 출력됨

// callback -> promise
const randomBytesPromise = util.promisify(crypto.randomBytes);
const pbkdf2Promise = util.promisify(crypto.pbkdf2);

// crypto promise로 바꾼 코드 ( 장점 : 최신 문법 async)
randomBytesPromise(64)
.then((buf)=> {
const salt = buf.toString('base64');
return pbkdf2Promise(('비밀번호 값', salt, 101395, 64, 'sha512'));
})
.then((key) => {
console.log('password : ',key.toString('base64'));
})
.catch(err=>{
console.log(err);
});

// async로 바꿔줌!
async( () => {
const buf = await randomBytesPromise(64);
const salt = buf.toString('base64');
const key = pbkdf2Promise(('비밀번호 값', salt, 101395, 64, 'sha512'));
console.log('password : ',key.toString('base64'));
})


events 모듈

const EventEmitter = require('events');

const myEvent = new EventEmitter();

myEvent.addListener('방문', () => {
console.log('하이하이');
});

const callback = () => {
console.log('hi');
};
myEvent.addListener('방문',callback);

myEvent.on('종료',() => {
console.log('빠이빠이');
});

// 한 번만 실행 됨
myEvent.once('특별이벤트', () => {
console.log('한 번만 실행 됨');
});

myEvent.emit('방문'); // 이벤트 호출하기
myEvent.emit('종료');
myEvent.removeAllListeners('종료'); // 전체 제거
myEvent.removeListener('방문',callback); // 제거
myEvent.listenerCount('방문'); // 개수




fs 모듈 ( 동기와 비동기 )

// 파일 시스템 ( fs모듈 - 동기와 비동기 )
const fs = require('fs');

fs.readFile('./readme.txt', (err,data) => {
console.log(data); // buffer
console.log(data.toString());
});

fs.writeFile('./writeme.txt','글을 써주세요.', (err) => {
fs.readFile('./writeme.txt',(err,data)=>{
console.log(data.toString());
})
});

// readFile 1,2,3 순차 실행 하는 방법 ( 1.콜백헬 / 2. 동기method 사용)

// 코드는 깔끔해 보이지만, blocking
let data = fs.readFileSync('./readme.txt');
let data2 = fs.readFileSync('./readme.txt');


// fs 기타 메소드
fs.access('./folder',fs.constants.F_OK | fs.constants.R_OK, err => {
if(err && err.code === 'ENOENT'){
fs.mkdir('./folder', err => {
fs.open('./folder/file.js', (err,fd) =>{
fs.rename('old','new-name',err=>{
console.log('이름 바꾸기!');
})
})
})
}
});

fs.readdir('./folder', dir =>{
fs.unlink('./folder/newFile.js', err => {
fs.rmdir('./folder', err => {
console.log('폴더지우기 성공');
})
})
});

// fs callback 헬 해결 ( node version 10.0 이상)
const fs = require('fs').promises;

버퍼와 스트림

// Buffer 와 Streaming
const fs = require('fs');
const readStream = fs.createReadStream('./readme.txt',{ highWaterMark: 16}); //16bytes씩 읽기

const data = [];
readStream.on('data', chunk => {
data.push(chunk);
console.log('data',chunk,chunk.length);

});

readStream.on('end', () => {
console.log('end',Buffer.concat(data).toString());
});

readStream.on('error',(err) => {
console.log(err)
});


const writeStream = fs.createWriteStream('./writeme2.txt');

writeStream.write('write sth');
writeStream.write('write more');
writeStream.end();

// 복사 방법 1
readStream.pipe(writeStream);
// 복사 방법 2
fs.copyFile('./readme.txt','./writeme.txt',(err)=>{

});

const zlib = require('./zlib'); // 파일 압축 모듈
const zlibStream = zlib.createGzip();
readStream.pipe(zlibStream).pipe(writeStream); // 압축하여 복사하기

crypto

// crypto
const crypto = require('crypto');

// sha512로 암호화하여 base64로 출력하라 ( 복호화 불가 => 비밀번호를 다시 복호화할 필요없음)
crypto.createHash('sha512').update('비밀번호 값').digest('base64');

// pbk 알고리즘 ( 다른 값인데 같은 hash가 생성될 수 있는 문제를 보완)
crypto.randomBytes(64, (err,buf) => {
const salt = buf.toString('base64'); // buffer -> 문자열
console.time('암호화');
/**
* pbkdf2 방식
* @param salt : 실행할 때마다 salt값이 다름 ( 해킹하기 훨씬 어려워짐 )
* @param 101395 : 1초 정도 될떄 까지 101395값을 바꿈 보통
*/
crypto.pbkdf2('비밀번호 값', salt, 101395, 64, 'sha512', (err,key) => {
console.log('password : ',key.toString('base64'));
console.timeEnd('암호화');
})
});

// 실무에선 이걸 더 많이 씀 : bcrypt

// crypto 양방향 암호화
const crypto = require('crypto');
const cipher = crypto.createCipher('aes-256-cbc','열쇠');
let result = cipher.update('비밀번호','utf8','base64');
result += cipher.final('base64');
console.log('암호',result);

// 복호화 ( 열쇠가 노출되면 안 됨 => 열쇠값이 틀리면 bad decrypt error 발생 )
const decipher = crypto.createDecipher('aes-256-cbc','열쇠');
let result2 = decipher.update(result, 'base64', 'utf8');
result2 += decipher.final('utf8');

console.log('평문',result2);



url 모듈


// url 모듈
const url = require('url');
const URL = url.URL;
const {URL} = require('url');
const myUrl = new URL('https://www.naver.com?category=nodejs&category=javascript&name=test');
console.log(myUrl);
console.log(url.format(myUrl));

// param 조회하기
console.log(myUrl.searchParams.get('name'));
console.log(myUrl.searchParams.has('page'));
console.log(myUrl.searchParams.getAll('category'));

// param 추가하기
myUrl.searchParams.append('filter',value);
myUrl.searchParams.set('filter','newfilter');

// querystring
const querystring = require('querystring');
const url = require('url');

const parsedUrl = url.parse('http://www.naver.com?name=hi');
const query = querystring.parse(parsedUrl.query);

console.log('query string : ',query);
console.log(querystring.stringify());


path 모듈

// path 모듈
const path = require('path');
console.log(path.sep); // window : \\, mac: /
console.log(path.delimiter); // window: ; , mac: : (환경변수 구분자)

path.dirname(__filename); // 전체경로
path.extname(__filename); // .js
path.basename(__filename); // test
path.parse(__filename); // {dir,base,ext,name}
path.format({
root:
dir:
base:
ext:
name
});

path.normalize('C:\\users\\test.js');
path.isAbsolute('C:\\') // true
path.relative('C:\\users','C:\\'); // ..\\

path.join(__dirname,'..','..','/users','.','/test'); // 절대 경로 무시하고 합침
path.resolve(__dirname,'..','..','/users','.','/test'); // 절대 경로 고려하고 합침 (C:/users/test)


os, process, __filename, __dirname

console.log(__dirname);
console.log(__filename);

// 멀티 프로세싱
// process : 현재 실행중인 노드 프로그램 정보
process.arch; // x86,
process.version; // node version
process.platform; // win32
process.pid; // process id
process.uptime(); // 노드 프로그램이 실행된 지 지난 시간
process.cwd(); // 프로세스 실행 위치
process.cpuUsage();
process.exit();

// desktop 프로그램 만들 때 보통 사용



// os 모듈
const os = require('os');
os.arch();
os.platform();
os.type();
os.uptime();
os.hostname();
os.release();
os.homedir();
os.tmpdir();
os.freemem();
os.totalmem();
os.cpus(); // node process를 cpu개수만큼 만듦 ( 멀티 프로세싱 )



노드 모듈 시스템

// 노드 모듈 시스템
const {odd,even} = require('./var');

// var.js
const odd = '홀수';
const even = '짝수';
module.exports = {odd,even};

exports.odd = odd;
exports.even = even;