์๋ฐ์คํฌ๋ฆฝํธ๋ ์คํฌ๋ฆฝํธ ์ธ์ด๋ผ์ ์ฆ์์์ ์ฝ๋๋ฅผ ์คํํ ์ ์์
ํ๋กฌํํธ๊ฐ > ๋ชจ์์ผ๋ก ๋ฐ๋๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์
๋ ฅ
์
๋ ฅํ ๊ฐ์ ๊ฒฐ๊ด๊ฐ์ด ๋ฐ๋ก ์ถ๋ ฅ๋จ.
์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ง๋ค์ด ํต์งธ๋ก ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ
๐ปhelloworld.js
function helloWorld() {
console.log('Hello World');
helloNode();
}
function helloNode() {
console.log('Hello Node');
}
helloWorld();
๋ ธ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ชจ๋๋ก ๋ง๋ค ์ ์์
- ๋ชจ๋: ํน์ ํ ๊ธฐ๋ฅ์ ํ๋ ํจ์๋ ๋ณ์๋ค์ ์งํฉ
- ๋ชจ๋๋ก ๋ง๋ค๋ฉด ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
๊ฐ์ ํด๋ ๋ด์ var.js, func.js, index.js ๋ง๋ค๊ธฐ
๐ปvar.js
const odd = 'ํ์์
๋๋ค';
const even = '์ง์์
๋๋ค';
module.exports = {
odd,
even,
};
๐ปfunc.js
const { odd, even } = require('./var');
function checkOddOrEven(num) {
if (num % 2) { // ํ์๋ฉด
return odd;
}
return even;
}
module.exports = checkOddOrEven;
๐ปindex.js
const { odd, even } = require('./var');
const checkNumber = require('./func');
function checkStringOddOrEven(str) {
if (str.length % 2) { // ํ์๋ฉด
return odd;
}
return even;
}
console.log(checkNumber(10));
console.log(checkStringOddOrEven('hello'));
node index๋ก ์คํ
์๋ฐ์คํฌ๋ฆฝํธ ์์ฒด ๋ชจ๋ ์์คํ ๋ฌธ๋ฒ์ด ์๊น
๐ปfunc.mjs
import { odd, even } from './var';
function checkOddOrEven(num) {
if (num % 2) { // ํ์๋ฉด
return odd;
}
return even;
}
export default checkOddOrEven;
๋ ธ๋์ ์ ์ญ ๊ฐ์ฒด
global ์์ฑ์ ๊ฐ์ ๋์ ํ๋ฉด ๋ค๋ฅธ ํ์ผ์์๋ ์ฌ์ฉ ๊ฐ๋ฅ
๐ปglobalA.js
module.exports = () => global.message;
๐ปglobalB.js
const A = require('./globalA');
global.message = '์๋
ํ์ธ์';
console.log(A());
๋ธ๋ผ์ฐ์ ์ console ๊ฐ์ฒด์ ๋งค์ฐ ์ ์ฌ
- console.time, console.timeEnd: ์๊ฐ ๋ก๊น
- console.error: ์๋ฌ ๋ก๊น
- console.log: ํ๋ฒํ ๋ก๊ทธ
- console.dir: ๊ฐ์ฒด ๋ก๊น
- console.trace: ํธ์ถ์คํ ๋ก๊น
๐ปconsole.js
const string = 'abc';
const number = 1;
const boolean = true;
const obj = {
outside: {
inside: {
key: 'value',
},
},
};
console.time('์ ์ฒด์๊ฐ');
console.log('ํ๋ฒํ ๋ก๊ทธ์
๋๋ค ์ผํ๋ก ๊ตฌ๋ถํด ์ฌ๋ฌ ๊ฐ์ ์ฐ์ ์ ์์ต๋๋ค');
console.log(string, number, boolean);
console.error('์๋ฌ ๋ฉ์์ง๋ console.error์ ๋ด์์ฃผ์ธ์');
console.table([{ name: '์ ๋ก', birth: 1994 }, { name: 'hero', birth: 1988}]);
console.dir(obj, { colors: false, depth: 2 });
console.dir(obj, { colors: true, depth: 1 });
console.time('์๊ฐ์ธก์ ');
for (let i = 0; i < 100000; i++) {}
console.timeEnd('์๊ฐ์ธก์ ');
function b() {
console.trace('์๋ฌ ์์น ์ถ์ ');
}
function a() {
b();
}
a();
console.timeEnd('์ ์ฒด์๊ฐ');
node console๋ก ์คํ
set ๋ฉ์๋์ clear ๋ฉ์๋๊ฐ ๋์๋จ
set ๋ฉ์๋์ ๋ฆฌํด ๊ฐ(์์ด๋)์ clear ๋ฉ์๋์ ๋ฃ์ด ์ทจ์
setTimeout(์ฝ๋ฐฑ ํจ์, ๋ฐ๋ฆฌ์ด): ์ฃผ์ด์ง ๋ฐ๋ฆฌ์ด(1000๋ถ์ 1์ด) ์ดํ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํฉ๋๋ค.
setInterval(์ฝ๋ฐฑ ํจ์, ๋ฐ๋ฆฌ์ด): ์ฃผ์ด์ง ๋ฐ๋ฆฌ์ด๋ง๋ค ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ๋ณต ์คํํฉ๋๋ค.
setImmediate(์ฝ๋ฐฑ ํจ์): ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฆ์ ์คํํฉ๋๋ค.
clearTimeout(์์ด๋): setTimeout์ ์ทจ์ํฉ๋๋ค.
clearInterval(์์ด๋): setInterval์ ์ทจ์ํฉ๋๋ค.
clearImmediate(์์ด๋): setImmediate๋ฅผ ์ทจ์ํฉ๋๋ค.
setTimeout(์ฝ๋ฐฑ, 0)๋ณด๋ค setImmediate ๊ถ์ฅ
๐ปtimer.js
const timeout = setTimeout(() => {
console.log('1.5์ด ํ ์คํ');
}, 1500);
const interval = setInterval(() => {
console.log('1์ด๋ง๋ค ์คํ');
}, 1000);
const timeout2 = setTimeout(() => {
console.log('์คํ๋์ง ์์ต๋๋ค');
}, 3000);
setTimeout(() => {
clearTimeout(timeout2);
clearInterval(interval);
}, 2500);
const immediate = setImmediate(() => {
console.log('์ฆ์ ์คํ');
});
const immediate2 = setImmediate(() => {
console.log('์คํ๋์ง ์์ต๋๋ค');
});
clearImmediate(immediate2);
filename: ํ์ฌ ํ์ผ ๊ฒฝ๋ก
dirname: ํ์ฌ ํด๋(๋๋ ํฐ๋ฆฌ) ๊ฒฝ๋ก
๐ปfilename.js
console.log(__filename);
console.log(__dirname);
module.exports ์ธ์๋ exports๋ก ๋ชจ๋์ ๋ง๋ค ์ ์์
๐ปvar.js
exports.odd = 'ํ์์
๋๋ค';
exports.even = '์ง์์
๋๋ค';
๋ ธ๋์์ this๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์์ ์ด ์์
๐ปthis.js
console.log(this);
console.log(this === module.exports);
console.log(this === exports);
function whatIsThis() {
console.log('function', this === exports, this === global);
}
whatIsThis();
๋ช ๊ฐ์ง ์์๋ ๋งํ ์์ฑ์ด ์์
๐ปrequire.js
console.log('require๊ฐ ๊ฐ์ฅ ์์ ์ค์ง ์์๋ ๋ฉ๋๋ค.');
module.exports = '์ ๋ฅผ ์ฐพ์๋ณด์ธ์.';
require('./var');
console.log('require.cache์
๋๋ค.');
console.log(require.cache);
console.log('require.main์
๋๋ค.');
console.log(require.main === module);
console.log(require.main.filename);
๋ ๊ฐ์ ๋ชจ๋์ด ์๋ก๋ฅผ requireํ๋ ์ํฉ์ ์กฐ์ฌํด์ผ ํจ
๐ปdep1.js
const dep2 = require('./dep2');
console.log('require dep2', dep2);
module.exports = () => {
console.log('dep2', dep2);
};
๐ปdep2.js
const dep1 = require('./dep1');
console.log('require dep1', dep1);
module.exports = () => {
console.log('dep1', dep1);
};
๐ปdep-run.js
const dep1 = require('./dep1');
const dep2 = require('./dep2');
dep1();
dep2();
ํ์ฌ ์คํ์ค์ธ ๋ ธ๋ ํ๋ก์ธ์ค์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์
์์คํ ํ๊ฒฝ ๋ณ์๋ค์ด ๋ค์ด์๋ ๊ฐ์ฒด
const secretId= process.env.SECRET_ID;
const secretCode= process.env.SECRET_CODE;
NODE_OPTIONS=--max-lod-space-size=8192
UV_THREADPOOL_SIZE=8
์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋ค๋ฅธ ์ฝ๋ฐฑ ํจ์๋ค๋ณด๋ค nextTick์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌํจ
๐ปnextTick.js
setImmediate(() => {
console.log('immediate');
});
process.nextTick(() => {
console.log('nextTick');
});
setTimeout(() => {
console.log('timeout');
}, 0);
Promise.resolve().then(() => console.log('promise'));
ํ์ฌ์ ํ๋ก์ธ์ค๋ฅผ ๋ฉ์ถค
๐ปexit.js
let i = 1;
setInterval(() => {
if (i === 5) {
console.log('์ข
๋ฃ!');
process.exit();
}
console.log(i);
i += 1;
}, 1000);
์ด์์ฒด์ ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์
๐ปos.js
const os = require('os');
console.log('์ด์์ฒด์ ์ ๋ณด---------------------------------');
console.log('os.arch():', os.arch());
console.log('os.platform():', os.platform());
console.log('os.type():', os.type());
console.log('os.uptime():', os.uptime());
console.log('os.hostname():', os.hostname());
console.log('os.release():', os.release());
console.log('๊ฒฝ๋ก------------------------------------------');
console.log('os.homedir():', os.homedir());
console.log('os.tmpdir():', os.tmpdir());
console.log('cpu ์ ๋ณด--------------------------------------');
console.log('os.cpus():', os.cpus());
console.log('os.cpus().length:', os.cpus().length);
console.log('๋ฉ๋ชจ๋ฆฌ ์ ๋ณด-----------------------------------');
console.log('os.freemem():', os.freemem());
console.log('os.totalmem():', os.totalmem());
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(): ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ๋ณด์ฌ์ค๋๋ค.
ํด๋์ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ฝ๊ฒ ์กฐ์ํ๋๋ก ๋์์ฃผ๋ ๋ชจ๋
๐ปpath.js
const path = require('path');
const string = __filename;
console.log('path.sep:', path.sep);
console.log('path.delimiter:', path.delimiter);
console.log('------------------------------');
console.log('path.dirname():', path.dirname(string));
console.log('path.extname():', path.extname(string));
console.log('path.basename():', path.basename(string));
console.log('path.basename - extname:', path.basename(string, path.extname(string)));
console.log('------------------------------');
console.log('path.parse()', path.parse(string));
console.log('path.format():', path.format({
dir: 'C:\Users\Seokahi\Desktop\๋
ธ๋',
name: 'path',
ext: '.js',
}));
console.log('path.normalize():', path.normalize('C:\Users\Seokahi\Desktop\๋
ธ๋\path.js'));
console.log('------------------------------');
console.log('path.isAbsolute(C:\\):', path.isAbsolute('C:\\'));
console.log('path.isAbsolute(./home):', path.isAbsolute('./home'));
console.log('------------------------------');
console.log('path.relative():', path.relative('C:\Users\Seokahi\Desktop\๋
ธ๋\path.js', 'C:\\'));
console.log('path.join():', path.join(__dirname, '..', '..', '/users', '.', '/๋
ธ๋'));
console.log('path.resolve():', path.resolve(__dirname, '..', 'users', '.', '/๋
ธ๋'));
path.sep: ๊ฒฝ๋ก์ ๊ตฌ๋ถ์์ ๋๋ค. Windows๋ \, POSIX๋ /์ ๋๋ค.
path.delimiter: ํ๊ฒฝ ๋ณ์์ ๊ตฌ๋ถ์์ ๋๋ค. process.env.PATH๋ฅผ ์ ๋ ฅํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ๊ฒฝ๋ก๊ฐ ์ด ๊ตฌ๋ถ์๋ก ๊ตฌ๋ถ๋์ด ์์ต๋๋ค. Windows๋ ์ธ๋ฏธ์ฝ๋ก (;)์ด๊ณ POSIX๋ ์ฝ๋ก (:)์ ๋๋ค.
path.dirname(๊ฒฝ๋ก): ํ์ผ์ด ์์นํ ํด๋ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฌ์ค๋๋ค.
path.extname(๊ฒฝ๋ก): ํ์ผ์ ํ์ฅ์๋ฅผ ๋ณด์ฌ์ค๋๋ค.
path.basename(๊ฒฝ๋ก, ํ์ฅ์): ํ์ผ์ ์ด๋ฆ(ํ์ฅ์ ํฌํจ)์ ๋ณด์ฌ์ค๋๋ค. ํ์ผ์ ์ด๋ฆ๋ง ํ์ํ๊ณ ์ถ๋ค๋ฉด basename์ ๋ ๋ฒ์งธ ์ธ์๋ก ํ์ผ์ ํ์ฅ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
path.parse(๊ฒฝ๋ก): ํ์ผ ๊ฒฝ๋ก๋ฅผ root, dir, base, ext, name์ผ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
path.format(๊ฐ์ฒด): path.parse()ํ ๊ฐ์ฒด๋ฅผ ํ์ผ ๊ฒฝ๋ก๋ก ํฉ์นฉ๋๋ค.
path.normalize(๊ฒฝ๋ก): /๋ \๋ฅผ ์ค์๋ก ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ๊ฑฐ๋ ํผ์ฉํ์ ๋ ์ ์์ ์ธ ๊ฒฝ๋ก๋ก ๋ณํํด์ค๋๋ค.
path.isAbsolute(๊ฒฝ๋ก): ํ์ผ์ ๊ฒฝ๋ก๊ฐ ์ ๋๊ฒฝ๋ก์ธ์ง ์๋๊ฒฝ๋ก์ธ์ง true๋ false๋ก ์๋ ค์ค๋๋ค.
path.relative(๊ธฐ์ค๊ฒฝ๋ก, ๋น๊ต๊ฒฝ๋ก): ๊ฒฝ๋ก๋ฅผ ๋ ๊ฐ ๋ฃ์ผ๋ฉด ์ฒซ ๋ฒ์งธ ๊ฒฝ๋ก์์ ๋ ๋ฒ์งธ ๊ฒฝ๋ก๋ก ๊ฐ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค๋๋ค.
path.join(๊ฒฝ๋ก, .. .): ์ฌ๋ฌ ์ธ์๋ฅผ ๋ฃ์ผ๋ฉด ํ๋์ ๊ฒฝ๋ก๋ก ํฉ์ณ์ค๋๋ค. ์๋๊ฒฝ๋ก์ธ ..(๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ)๊ณผ .(ํ ์์น)๋ ์์์ ์ฒ๋ฆฌํด์ค๋๋ค.
path.resolve(๊ฒฝ๋ก, .. .): path.join()๊ณผ ๋น์ทํ์ง๋ง ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด์ ์ ๋ค์์ ๋์ค๋ Note์์ ์ค๋ช ํฉ๋๋ค.
join๊ณผ resolve์ ์ฐจ์ด: resolve๋ /๋ฅผ ์ ๋๊ฒฝ๋ก๋ก ์ฒ๋ฆฌ, join์ ์๋๊ฒฝ๋ก๋ก ์ฒ๋ฆฌ
\์ \ ์ฐจ์ด: \๋ ์๋ ๊ฒฝ๋ก ๊ตฌ๋ถ์, \๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ์์ด ์์์ ์ฌ์ฉ(\๊ฐ ํน์๋ฌธ์๋ผ \๋ก ์ด์ค์ผ์ดํ ํด์ค ๊ฒ)
์๋์์ POSIX path๋ฅผ ์ฐ๊ณ ์ถ๋ค๋ฉด: path.posix ๊ฐ์ฒด ์ฌ์ฉ
์ธํฐ๋ท ์ฃผ์๋ฅผ ์ฝ๊ฒ ์กฐ์ํ๋๋ก ๋์์ฃผ๋ ๋ชจ๋
๐ปurl.js
const url = require('url');
const { URL } = url;
const myURL = new URL('http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor');
console.log('new URL():', myURL);
console.log('url.format():', url.format(myURL));
console.log('------------------------------');
const parsedUrl = url.parse('http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor');
console.log('url.parse():', parsedUrl);
console.log('url.format():', url.format(parsedUrl));
๊ธฐ์กด ๋ ธ๋ ๋ฐฉ์ ๋ฉ์๋
WHATWG ๋ฐฉ์์์ ์ฟผ๋ฆฌ์คํธ๋ง(search) ๋ถ๋ถ ์ฒ๋ฆฌ๋ฅผ ๋์์ฃผ๋ ๊ฐ์ฒด
?page=3&limit=10&category=nodejs&category=javascript ๋ถ๋ถ
๐ปsearchParams.js
const { URL } = require('url');
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();
getAll(ํค): ํค์ ํด๋นํ๋ ๋ชจ๋ ๊ฐ๋ค์ ๊ฐ์ ธ์ต๋๋ค. category ํค์๋ ๋ ๊ฐ์ง ๊ฐ, ์ฆ nodejs์ javascript์ ๊ฐ์ด ๋ค์ด ์์ต๋๋ค.
get(ํค): ํค์ ํด๋นํ๋ ์ฒซ ๋ฒ์งธ ๊ฐ๋ง ๊ฐ์ ธ์ต๋๋ค.
has(ํค): ํด๋น ํค๊ฐ ์๋์ง ์๋์ง๋ฅผ ๊ฒ์ฌํฉ๋๋ค.
keys(): searchParams์ ๋ชจ๋ ํค๋ฅผ ๋ฐ๋ณต๊ธฐ(iterator, ES2015 ๋ฌธ๋ฒ) ๊ฐ์ฒด๋ก ๊ฐ์ ธ์ต๋๋ค.
values(): searchParams์ ๋ชจ๋ ๊ฐ์ ๋ฐ๋ณต๊ธฐ ๊ฐ์ฒด๋ก ๊ฐ์ ธ์ต๋๋ค.
append(ํค, ๊ฐ): ํด๋น ํค๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ฐ์ ํค์ ๊ฐ์ด ์๋ค๋ฉด ์ ์งํ๊ณ ํ๋ ๋ ์ถ๊ฐํฉ๋๋ค.
set(ํค, ๊ฐ): append์ ๋น์ทํ์ง๋ง ๊ฐ์ ํค์ ๊ฐ๋ค์ ๋ชจ๋ ์ง์ฐ๊ณ ์๋ก ์ถ๊ฐํฉ๋๋ค.
delete(ํค): ํด๋น ํค๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
toString(): ์กฐ์ํ searchParams ๊ฐ์ฒด๋ฅผ ๋ค์ ๋ฌธ์์ด๋ก ๋ง๋ญ๋๋ค. ์ด ๋ฌธ์์ด์ search์ ๋์ ํ๋ฉด ์ฃผ์ ๊ฐ์ฒด์ ๋ฐ์๋ฉ๋๋ค.
๊ธฐ์กด ๋ ธ๋ ๋ฐฉ์์์๋ url querystring์ querystring ๋ชจ๋๋ก ์ฒ๋ฆฌ
- querystring.parse(์ฟผ๋ฆฌ): url์ query ๋ถ๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ๋ถํดํด์ค๋๋ค.
- querystring.stringify(๊ฐ์ฒด): ๋ถํด๋ query ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ๋ค์ ์กฐ๋ฆฝํด์ค๋๋ค.
querystring.js
const url = require('url');
const querystring = require('querystring');
const parsedUrl = url.parse('http://www.gilbut.co.kr/?page=3&limit=10&category=nodejs&category=javascript');
const query = querystring.parse(parsedUrl.query);
console.log('querystring.parse():', query);
console.log('querystring.stringify():', querystring.stringify(query));
์ํธํ๋ ๊ฐ๋ฅํ์ง๋ง ๋ณตํธํ๋ ๋ถ๊ฐ๋ฅ
๋จ๋ฐฉํฅ ์ํธํ์ ๋ํ ์ฃผ์๋ ํด์ ๊ธฐ๋ฒ
createHash(์๊ณ ๋ฆฌ์ฆ): ์ฌ์ฉํ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฃ์ด์ค๋๋ค.
์ปดํจํฐ์ ๋ฐ๋ฌ๋ก ๊ธฐ์กด ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ด ์ํ๋ฐ๊ณ ์์
์ปดํจํฐ์ ๋ฐ๋ฌ๋ก ๊ธฐ์กด ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ด ์ํ๋ฐ๊ณ ์์
๐ป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'));
});
});
๋์นญํ ์ํธํ(์ํธ๋ฌธ ๋ณตํธํ ๊ฐ๋ฅ)
๐ป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(์ถ๋ ฅ ์ธ์ฝ๋ฉ): ๋ณตํธํ ๊ฒฐ๊ณผ๋ฌผ์ ์ธ์ฝ๋ฉ์ ๋ฃ์ด์ค๋๋ค.
๊ฐ์ข ํธ์ ๊ธฐ๋ฅ์ ๋ชจ์๋ ๋ชจ๋
๐ปutil.js
const util = require('util');
const crypto = require('crypto');
const dontUseMe = util.deprecate((x, y) => {
console.log(x + y);
}, 'dontUseMe ํจ์๋ deprecated๋์์ผ๋ ๋ ์ด์ ์ฌ์ฉํ์ง ๋ง์ธ์!');
dontUseMe(1, 2);
const randomBytesPromise = util.promisify(crypto.randomBytes);
randomBytesPromise(64)
.then((buf) => {
console.log(buf.toString('base64'));
})
.catch((error) => {
console.error(error);
});
util.deprecate: ํจ์๊ฐ deprecated ์ฒ๋ฆฌ๋์์์ ์๋ ค์ค๋๋ค.
๋ ธ๋์์ ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์์ผ๋ก ์์ ํ ์ ์์.
๐ปworker_threads.js
const {
Worker, isMainThread, parentPort,
} = require('worker_threads');
if (isMainThread) { // ๋ถ๋ชจ์ผ ๋
const worker = new Worker(__filename);
worker.on('message', message => console.log('from worker', message));
worker.on('exit', () => console.log('worker exit'));
worker.postMessage('ping');
} else { // ์์ปค์ผ ๋
parentPort.on('message', (value) => {
console.log('from parent', value);
parentPort.postMessage('pong');
parentPort.close();
});
}
new Worker ํธ์ถํ๋ ์๋งํผ ์์ปค ์ค๋ ๋๊ฐ ์์ฑ๋จ
๐ปworker_data.js
const {
Worker, isMainThread, parentPort, workerData,
} = require('worker_threads');
if (isMainThread) { // ๋ถ๋ชจ์ผ ๋
const threads = new Set();
threads.add(new Worker(__filename, {
workerData: { start: 1 },
}));
threads.add(new Worker(__filename, {
workerData: { start: 2 },
}));
for (let worker of threads) {
worker.on('message', message => console.log('from worker', message));
worker.on('exit', () => {
threads.delete(worker);
if (threads.size === 0) {
console.log('job done');
}
});
}
} else { // ์์ปค์ผ ๋
const data = workerData;
parentPort.postMessage(data.start + 100);
}
์์ปค ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ง ์์ ๋(์ฑ๊ธ ์ค๋ ๋์ผ ๋)
๐ปprime-worker.js
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
const min = 2;
let primes = [];
function findPrimes(start, range) {
let isPrime = true;
const end = start + range;
for (let i = start; i < end; i++) {
for (let j = min; j < Math.sqrt(end); j++) {
if (i !== j && i % j === 0) {
isPrime = false;
break;
}
}
if (isPrime) {
primes.push(i);
}
isPrime = true;
}
}
if (isMainThread) {
const max = 10000000;
const threadCount = 8;
const threads = new Set();
const range = Math.ceil((max - min) / threadCount);
let start = min;
console.time('prime');
for (let i = 0; i < threadCount - 1; i++) {
const wStart = start;
threads.add(new Worker(__filename, { workerData: { start: wStart, range } }));
start += range;
}
threads.add(new Worker(__filename, { workerData: { start, range: range + ((max - min + 1) % threadCount) } }));
for (let worker of threads) {
worker.on('error', (err) => {
throw err;
});
worker.on('exit', () => {
threads.delete(worker);
if (threads.size === 0) {
console.timeEnd('prime');
console.log(primes.length);
}
});
worker.on('message', (msg) => {
primes = primes.concat(msg);
});
}
} else {
findPrimes(workerData.start, workerData.range);
parentPort.postMessage(primes);
}
๋ ธ๋์์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์คํํ๊ณ ์ถ๊ฑฐ๋ ๋ช ๋ น์ด๋ฅผ ์ํํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
๐ปexec.js
const exec = require('child_process').exec;
var process = exec('dir');
process.stdout.on('data', function(data) {
console.log(data.toString());
}); // ์คํ ๊ฒฐ๊ณผ
process.stderr.on('data', function(data) {
console.error(data.toString());
}); // ์คํ ์๋ฌ
ํ์ด์ฌ ํ๋ก๊ทธ๋จ ์คํํ๊ธฐ
ํ์ด์ฌ3์ด ์ค์น๋์ด ์์ด์ผ ํจ.
๐ปtest.py
print('hello python')
๐ปspqwn.js
const spawn = require('child_process').spawn;
var process = spawn('python', ['test.py']);
process.stdout.on('data', function(data) {
console.log(data.toString());
}); // ์คํ ๊ฒฐ๊ณผ
process.stderr.on('data', function(data) {
console.error(data.toString());
}); // ์คํ ์๋ฌ
assert: ๊ฐ์ ๋น๊ตํ์ฌ ํ๋ก๊ทธ๋จ์ด ์ ๋๋ก ๋์ํ๋์ง ํ ์คํธํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
dns: ๋๋ฉ์ธ ์ด๋ฆ์ ๋ํ IP ์ฃผ์๋ฅผ ์ป์ด๋ด๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
net: HTTP๋ณด๋ค ๋ก์ฐ ๋ ๋ฒจ์ธ TCP๋ IPC ํต์ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
string_decoder: ๋ฒํผ ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์์ด๋ก ๋ฐ๊พธ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
tls: TLS์ SSL์ ๊ด๋ จ๋ ์์ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
tty: ํฐ๋ฏธ๋๊ณผ ๊ด๋ จ๋ ์์ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
dgram: UDP์ ๊ด๋ จ๋ ์์ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
v8: V8 ์์ง์ ์ง์ ์ ๊ทผํ ๋ ์ฌ์ฉํฉ๋๋ค.
vm: ๊ฐ์ ๋จธ์ ์ ์ง์ ์ ๊ทผํ ๋ ์ฌ์ฉํฉ๋๋ค.
ํ์ผ ์์คํ ์ ์ ๊ทผํ๋ ๋ชจ๋
๐ปreadme.txt
์ ๋ฅผ ์ฝ์ด์ฃผ์ธ์.
๐ปreadFile.js
const fs = require('fs');
fs.readFile('./readme.txt', (err, data) => {
if (err) {
throw err;
}
console.log(data);
console.log(data.toString());
});
์ฝ๋ฐฑ ๋ฐฉ์ ๋์ ํ๋ก๋ฏธ์ค ๋ฐฉ์์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
๐ปreadfilepromise.js
const fs = require('fs').promises;
fs.readFile('./readme.txt')
.then((data) => {
console.log(data);
console.log(data.toString());
})
.catch((err) => {
console.error(err);
});
ํ์ผ์ ๋ง๋๋ ์์
๐ปwriteFile.js
const fs = require('fs');
fs.writeFile('./writeme.txt', '๊ธ์ด ์
๋ ฅ๋ฉ๋๋ค', (err) => {
if (err) {
throw err;
}
fs.readFile('./writeme.txt', (err, data) => {
if (err) {
throw err;
}
console.log(data.toString());
});
});
๋ ธ๋๋ ๋๋ถ๋ถ์ ๋ด์ฅ ๋ชจ๋ ๋ฉ์๋๋ฅผ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ
๐ปreadme2.txt
์ ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฝ์ด๋ณด์ธ์.
๐ปasync.js
const fs = require('fs');
console.log('์์');
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('1๋ฒ', data.toString());
});
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('2๋ฒ', data.toString());
});
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('3๋ฒ', data.toString());
});
console.log('๋');
์ด์ ์์ ๋ฅผ ์ฌ๋ฌ ๋ฒ ์คํํด๋ณด๊ธฐ
๋๊ธฐ์ ๋น๋๊ธฐ: ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์๋ฃ ํ์ธ ์ฌ๋ถ
๋ธ๋กํน๊ณผ ๋ ผ ๋ธ๋กํน: ํจ์๊ฐ ๋ฐ๋ก return ๋๋์ง ์ฌ๋ถ
๋ ธ๋์์๋ ๋๋ถ๋ถ ๋๊ธฐ-๋ธ๋กํน ๋ฐฉ์๊ณผ ๋น๋๊ธฐ-๋ ผ ๋ธ๋กํน ๋ฐฉ์์.
๐ปsync.js
const fs = require('fs');
console.log('์์');
let data = fs.readFileSync('./readme2.txt');
console.log('1๋ฒ', data.toString());
data = fs.readFileSync('./readme2.txt');
console.log('2๋ฒ', data.toString());
data = fs.readFileSync('./readme2.txt');
console.log('3๋ฒ', data.toString());
console.log('๋');
์ฝ๋ฐฑ ํ์ ์ ์ง
๐ปasyncOrder.js
const fs = require('fs');
console.log('์์');
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('1๋ฒ', data.toString());
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('2๋ฒ', data.toString());
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('3๋ฒ', data.toString());
console.log('๋');
});
});
});
ํ๋ก๋ฏธ์ค๋ก ๊ทน๋ณต
๐ปasyncorderpromise.js
const fs = require('fs').promises;
console.log('์์');
fs.readFile('./readme2.txt')
.then((data) => {
console.log('1๋ฒ', data.toString());
return fs.readFile('./readme2.txt');
})
.then((data) => {
console.log('2๋ฒ', data.toString());
return fs.readFile('./readme2.txt');
})
.then((data) => {
console.log('3๋ฒ', data.toString());
console.log('๋');
})
.catch((err) => {
console.error(err);
});
๋ฒํผ: ์ผ์ ํ ํฌ๊ธฐ๋ก ๋ชจ์๋๋ ๋ฐ์ดํฐ
- ์ผ์ ํ ํฌ๊ธฐ๊ฐ ๋๋ฉด ํ ๋ฒ์ ์ฒ๋ฆฌ
- ๋ฒํผ๋ง: ๋ฒํผ์ ๋ฐ์ดํฐ๊ฐ ์ฐฐ ๋๊น์ง ๋ชจ์ผ๋ ์์
์คํธ๋ฆผ: ๋ฐ์ดํฐ์ ํ๋ฆ- ์ผ์ ํ ํฌ๊ธฐ๋ก ๋๋ ์ ์ฌ๋ฌ ๋ฒ์ ๊ฑธ์ณ์ ์ฒ๋ฆฌ
- ๋ฒํผ(๋๋ ์ฒญํฌ)์ ํฌ๊ธฐ๋ฅผ ์๊ฒ ๋ง๋ค์ด์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ
- ์คํธ๋ฆฌ๋ฐ: ์ผ์ ํ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ์ ๋ฌํ๋ ์์
๋
ธ๋์์๋ Buffer ๊ฐ์ฒด ์ฌ์ฉ
๐ปbuffer.js
const buffer = Buffer.from('์ ๋ฅผ ๋ฒํผ๋ก ๋ฐ๊ฟ๋ณด์ธ์');
console.log('from():', buffer);
console.log('length:', buffer.length);
console.log('toString():', buffer.toString());
const array = [Buffer.from('๋์ '), Buffer.from('๋์ '), Buffer.from('๋์ด์ฐ๊ธฐ')];
const buffer2 = Buffer.concat(array);
console.log('concat():', buffer2.toString());
const buffer3 = Buffer.alloc(5);
console.log('alloc():', buffer3);
๋ ธ๋์์๋ Buffer ๊ฐ์ฒด ์ฌ์ฉ
- from(๋ฌธ์์ด): ๋ฌธ์์ด์ ๋ฒํผ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค. length ์์ฑ์ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ์๋ ค์ค๋๋ค. ๋ฐ์ดํธ ๋จ์์ ๋๋ค.
- toString(๋ฒํผ): ๋ฒํผ๋ฅผ ๋ค์ ๋ฌธ์์ด๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค. ์ด๋ base64๋ hex๋ฅผ ์ธ์๋ก ๋ฃ์ผ๋ฉด ํด๋น ์ธ์ฝ๋ฉ์ผ๋ก๋ ๋ณํํ ์ ์์ต๋๋ค.
- concat(๋ฐฐ์ด): ๋ฐฐ์ด ์์ ๋ ๋ฒํผ๋ค์ ํ๋๋ก ํฉ์นฉ๋๋ค.
- alloc(๋ฐ์ดํธ): ๋น ๋ฒํผ๋ฅผ ์์ฑํฉ๋๋ค. ๋ฐ์ดํธ๋ฅผ ์ธ์๋ก ์ง์ ํด์ฃผ๋ฉด ํด๋น ํฌ๊ธฐ์ ๋ฒํผ๊ฐ ์์ฑ๋ฉ๋๋ค.
fs.createReadStream
- createReadStream์ ์ธ์๋ก ํ์ผ ๊ฒฝ๋ก์ ์ต์ ๊ฐ์ฒด ์ ๋ฌ
- highWaterMark ์ต์ ์ ๋ฒํผ์ ํฌ๊ธฐ(๋ฐ์ดํธ ๋จ์, ๊ธฐ๋ณธ๊ฐ 64KB)
- data(chunk ์ ๋ฌ), end(์ ๋ฌ ์๋ฃ), error(์๋ฌ ๋ฐ์) ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ๊ฐ์ด ์ฌ์ฉ
๐ปreadmetext3.txt
์ ๋ ์กฐ๊ธ์ฉ ์กฐ๊ธ์ฉ ๋๋ ์ ์ ๋ฌ๋ฉ๋๋ค. ๋๋ ์ง ์กฐ๊ฐ์ chunk๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
๐ปcreatereadStream.js
const fs = require('fs');
const readStream = fs.createReadStream('./readme3.txt', { highWaterMark: 16 });
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('error :', err);
});
๐ปfs.createWriteStream
createwritestream.js
const fs = require('fs');
const writeStream = fs.createWriteStream('./writeme2.txt');
writeStream.on('finish', () => {
console.log('ํ์ผ ์ฐ๊ธฐ ์๋ฃ');
});
writeStream.write('์ด ๊ธ์ ์๋๋ค.\n');
writeStream.write('ํ ๋ฒ ๋ ์๋๋ค.');
writeStream.end();
pipe๋ก ์ฌ๋ฌ ๊ฐ์ ์คํธ๋ฆผ์ ์ด์ ์ ์์
๐ปreadme4.txt
์ ๋ฅผ writeme3.txt๋ก ๋ณด๋ด์ฃผ์ธ์.
๐ปpipe.js
const fs = require('fs');
const readStream = fs.createReadStream('readme4.txt');
const writeStream = fs.createWriteStream('writeme3.txt');
readStream.pipe(writeStream);
pipe๋ก ์ฌ๋ฌ ๊ฐ์ ์คํธ๋ฆผ์ ์ด์ ์ ์์
๐ปgzip.js
const zlib = require('zlib');
const fs = require('fs');
const readStream = fs.createReadStream('./readme4.txt');
const zlibStream = zlib.createGzip();
const writeStream = fs.createWriteStream('./readme4.txt.gz');
readStream.pipe(zlibStream).pipe(writeStream);
1GB ์ ๋์ ํ์ผ์ ๋ง๋ค์ด ๋ด.
createWriteStream์ผ๋ก ๋ง๋ค์ด์ผ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์์.
๐ปcreatebigfile.js
const fs = require('fs');
const file = fs.createWriteStream('./big.txt');
for (let i = 0; i <= 10000000; i++) {
file.write('์๋
ํ์ธ์. ์์ฒญ๋๊ฒ ํฐ ํ์ผ์ ๋ง๋ค์ด ๋ณผ ๊ฒ์
๋๋ค. ๊ฐ์ค ๋จ๋จํ ํ์ธ์!\n');
}
file.end();
๋ฒํผ ๋ฐฉ์๊ณผ ์คํธ๋ฆผ ๋ฐฉ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋น๊ตํด๋ณด๊ธฐ
๐ปbuffer-memory.js
const fs = require('fs');
console.log('before: ', process.memoryUsage().rss);
const data1 = fs.readFileSync('./big.txt');
fs.writeFileSync('./big2.txt', data1);
console.log('buffer: ', process.memoryUsage().rss);
๐ปstream-memory.js
const fs = require('fs');
console.log('before: ', process.memoryUsage().rss);
const readStream = fs.createReadStream('./big.txt');
const writeStream = fs.createWriteStream('./big3.txt');
readStream.pipe(writeStream);
readStream.on('end', () => {
console.log('stream: ', process.memoryUsage().rss);
});
ํ์ผ ๋ฐ ํด๋ ์์ฑ
๐ปfscreate.js
const fs = require('fs');
fs.access('./folder', fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK, (err) => {
if (err) {
if (err.code === 'ENOENT') {
console.log('ํด๋ ์์');
fs.mkdir('./folder', (err) => {
if (err) {
throw err;
}
console.log('ํด๋ ๋ง๋ค๊ธฐ ์ฑ๊ณต');
fs.open('./folder/file.js', 'w', (err, fd) => {
if (err) {
throw err;
}
console.log('๋น ํ์ผ ๋ง๋ค๊ธฐ ์ฑ๊ณต', fd);
fs.rename('./folder/file.js', './folder/newfile.js', (err) => {
if (err) {
throw err;
}
console.log('์ด๋ฆ ๋ฐ๊พธ๊ธฐ ์ฑ๊ณต');
});
});
});
} else {
throw err;
}
} else {
console.log('์ด๋ฏธ ํด๋ ์์');
}
});
ํ์ผ ๋ฐ ํด๋ ์์ฑ, ์ญ์
- fs.access(๊ฒฝ๋ก, ์ต์ , ์ฝ๋ฐฑ): ํด๋๋ ํ์ผ์ ์ ๊ทผํ ์ ์๋์ง๋ฅผ ์ฒดํฌํฉ๋๋ค. ๋ ๋ฒ์งธ ์ธ์๋ก ์์๋ค์ ๋ฃ์์ต๋๋ค. F_OK๋ ํ์ผ ์กด์ฌ ์ฌ๋ถ, R_OK๋ ์ฝ๊ธฐ ๊ถํ ์ฌ๋ถ, W_OK๋ ์ฐ๊ธฐ ๊ถํ ์ฌ๋ถ๋ฅผ ์ฒดํฌํฉ๋๋ค. ํ์ผ/ํด๋๋ ๊ถํ์ด ์๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ฐ, ํ์ผ/ํด๋๊ฐ ์์ ๋์ ์๋ฌ ์ฝ๋๋ ENOENT์ ๋๋ค.
- fs.mkdir(๊ฒฝ๋ก, ์ฝ๋ฐฑ): ํด๋๋ฅผ ๋ง๋๋ ๋ฉ์๋์ ๋๋ค. ์ด๋ฏธ ํด๋๊ฐ ์๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๋จผ์ access() ๋ฉ์๋๋ฅผ ํธ์ถํด์ ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- fs.open(๊ฒฝ๋ก, ์ต์ , ์ฝ๋ฐฑ): ํ์ผ์ ์์ด๋(fd ๋ณ์)๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฉ์๋์ ๋๋ค. ํ์ผ์ด ์๋ค๋ฉด ํ์ผ์ ์์ฑํ ๋ค ๊ทธ ์์ด๋๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ๊ฐ์ ธ์จ ์์ด๋๋ฅผ ์ฌ์ฉํด fs.read()๋ fs.write()๋ก ์ฝ๊ฑฐ๋ ์ธ ์ ์์ต๋๋ค. ๋ ๋ฒ์งธ ์ธ์๋ก ์ด๋ค ๋์์ ํ ๊ฒ์ธ์ง ์ค์ ํ ์ ์์ต๋๋ค. ์ฐ๋ ค๋ฉด w, ์ฝ์ผ๋ ค๋ฉด r, ๊ธฐ์กด ํ์ผ์ ์ถ๊ฐํ๋ ค๋ฉด a์ ๋๋ค. ์์ ์์๋ w๋ก ์ค์ ํ์ผ๋ฏ๋ก ํ์ผ์ด ์์ ๋ ์๋ก ๋ง๋ค ์ ์์์ต๋๋ค. r์ด์๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ์์ ๊ฒ์ ๋๋ค.
- fs.rename(๊ธฐ์กด ๊ฒฝ๋ก, ์ ๊ฒฝ๋ก, ์ฝ๋ฐฑ): ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊พธ๋ ๋ฉ์๋์ ๋๋ค. ๊ธฐ์กด ํ์ผ ์์น์ ์๋ก์ด ํ์ผ ์์น๋ฅผ ์ ์ด์ฃผ๋ฉด ๋ฉ๋๋ค. ๋ฐ๋์ ๊ฐ์ ํด๋๋ฅผ ์ง์ ํ ํ์๋ ์์ผ๋ฏ๋ก ์๋ผ๋ด๊ธฐ ๊ฐ์ ๊ธฐ๋ฅ์ ํ ์๋ ์์ต๋๋ค.
- fs.readdir(๊ฒฝ๋ก, ์ฝ๋ฐฑ): ํด๋ ์์ ๋ด์ฉ๋ฌผ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ฐฐ์ด ์์ ๋ด๋ถ ํ์ผ๊ณผ ํด๋๋ช ์ด ๋์ต๋๋ค.
- fs.unlink(๊ฒฝ๋ก, ์ฝ๋ฐฑ): ํ์ผ์ ์ง์ธ ์ ์์ต๋๋ค. ํ์ผ์ด ์๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๋จผ์ ํ์ผ์ด ์๋์ง๋ฅผ ๊ผญ ํ์ธํด์ผ ํฉ๋๋ค.
- fs.rmdir(๊ฒฝ๋ก, ์ฝ๋ฐฑ): ํด๋๋ฅผ ์ง์ธ ์ ์์ต๋๋ค. ํด๋ ์์ ํ์ผ์ด ์๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๋จผ์ ๋ด๋ถ ํ์ผ์ ๋ชจ๋ ์ง์ฐ๊ณ ํธ์ถํด์ผ ํฉ๋๋ค.
๐ปfsdelete.js
const fs = require('fs');
fs.readdir('./folder', (err, dir) => {
if (err) {
throw err;
}
console.log('ํด๋ ๋ด์ฉ ํ์ธ', dir);
fs.unlink('./folder/newfile.js', (err) => {
if (err) {
throw err;
}
console.log('ํ์ผ ์ญ์ ์ฑ๊ณต');
fs.rmdir('./folder', (err) => {
if (err) {
throw err;
}
console.log('ํด๋ ์ญ์ ์ฑ๊ณต');
});
});
});
ํ์ผ์ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ
๐ปcopyfile.js
const fs = require('fs');
fs.copyFile('readme4.txt', 'writeme4.txt', (error) => {
if (error) {
return console.error(error);
}
console.log('๋ณต์ฌ ์๋ฃ');
});
ํ์ผ์ ๊ฐ์ํ๋ ๋ฐฉ๋ฒ(๋ณ๊ฒฝ ์ฌํญ ๋ฐ์ ์ ์ด๋ฒคํธ ํธ์ถ)
๐ปwatch.js
const fs = require('fs');
fs.watch('./target.txt', (eventType, filename) => {
console.log(eventType, filename);
});
๐ปfs, crypto, zlib ๋ชจ๋์ ๋ฉ์๋๋ฅผ ์คํํ ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋์์ ์คํ๋จ
threadpool.js
const crypto = require('crypto');
const pass = 'pass';
const salt = 'salt';
const start = Date.now();
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('1:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('2:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('3:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('4:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('5:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('6:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('7:', Date.now() - start);
});
crypto.pbkdf2(pass, salt, 1000000, 128, 'sha512', () => {
console.log('8:', Date.now() - start);
});
์ค๋ ๋ํ์ ์ง์ ์ปจํธ๋กคํ ์๋ ์์ง๋ง ๊ฐ์ ์กฐ์ ์ ๊ฐ๋ฅ
events ๋ชจ๋๋ก ์ปค์คํ ์ด๋ฒคํธ๋ฅผ ๋ง๋ค ์ ์์
- ์คํธ๋ฆผ์ ์ฐ์๋ on(โdataโ), on(โendโ) ๋ฑ๊ณผ ๋น๊ต
- on(์ด๋ฒคํธ๋ช , ์ฝ๋ฐฑ): ์ด๋ฒคํธ ์ด๋ฆ๊ณผ ์ด๋ฒคํธ ๋ฐ์ ์์ ์ฝ๋ฐฑ์ ์ฐ๊ฒฐํด์ค๋๋ค. ์ด๋ ๊ฒ ์ฐ๊ฒฐํ๋ ๋์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. event2์ฒ๋ผ ์ด๋ฒคํธ ํ๋์ ์ด๋ฒคํธ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ฌ์์ค ์๋ ์์ต๋๋ค.
- addListener(์ด๋ฒคํธ๋ช , ์ฝ๋ฐฑ): on๊ณผ ๊ธฐ๋ฅ์ด ๊ฐ์ต๋๋ค.
- emit(์ด๋ฒคํธ๋ช ): ์ด๋ฒคํธ๋ฅผ ํธ์ถํ๋ ๋ฉ์๋์ ๋๋ค. ์ด๋ฒคํธ ์ด๋ฆ์ ์ธ์๋ก ๋ฃ์ด์ฃผ๋ฉด ๋ฏธ๋ฆฌ ๋ฑ๋กํด๋๋ ์ด๋ฒคํธ ์ฝ๋ฐฑ์ด ์คํ๋ฉ๋๋ค.
- once(์ด๋ฒคํธ๋ช , ์ฝ๋ฐฑ): ํ ๋ฒ๋ง ์คํ๋๋ ์ด๋ฒคํธ์ ๋๋ค. myEvent.emit('event3')์ ๋ ๋ฒ ์ฐ์ ํธ์ถํ์ง๋ง ์ฝ๋ฐฑ์ด ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
- removeAllListeners(์ด๋ฒคํธ๋ช ): ์ด๋ฒคํธ์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.event4๊ฐ ํธ์ถ๋๊ธฐ ์ ์ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํ์ผ๋ฏ๋ก event4์ ์ฝ๋ฐฑ์ ํธ์ถ๋์ง ์์ต๋๋ค.
- removeListener(์ด๋ฒคํธ๋ช , ๋ฆฌ์ค๋): ์ด๋ฒคํธ์ ์ฐ๊ฒฐ๋ ๋ฆฌ์ค๋๋ฅผ ํ๋์ฉ ์ ๊ฑฐํฉ๋๋ค. ์ญ์* event5์ ์ฝ๋ฐฑ๋ ํธ์ถ๋์ง ์์ต๋๋ค.
- off(์ด๋ฒคํธ๋ช , ์ฝ๋ฐฑ): ๋ ธ๋ 10 ๋ฒ์ ์์ ์ถ๊ฐ๋ ๋ฉ์๋๋ก, removeListener์ ๊ธฐ๋ฅ์ด ๊ฐ์ต๋๋ค.
- listenerCount(์ด๋ฒคํธ๋ช ): ํ์ฌ ๋ฆฌ์ค๋๊ฐ ๋ช ๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
๐ปevent.js
const EventEmitter = require('events');
const myEvent = new EventEmitter();
myEvent.addListener('event1', () => {
console.log('์ด๋ฒคํธ 1');
});
myEvent.on('event2', () => {
console.log('์ด๋ฒคํธ 2');
});
myEvent.on('event2', () => {
console.log('์ด๋ฒคํธ 2 ์ถ๊ฐ');
});
myEvent.once('event3', () => {
console.log('์ด๋ฒคํธ 3');
}); // ํ ๋ฒ๋ง ์คํ๋จ
myEvent.emit('event1'); // ์ด๋ฒคํธ ํธ์ถ
myEvent.emit('event2'); // ์ด๋ฒคํธ ํธ์ถ
myEvent.emit('event3');
myEvent.emit('event3'); // ์คํ ์ ๋จ
myEvent.on('event4', () => {
console.log('์ด๋ฒคํธ 4');
});
myEvent.removeAllListeners('event4');
myEvent.emit('event4'); // ์คํ ์ ๋จ
const listener = () => {
console.log('์ด๋ฒคํธ 5');
};
myEvent.on('event5', listener);
myEvent.removeListener('event5', listener);
myEvent.emit('event5'); // ์คํ ์ ๋จ
console.log(myEvent.listenerCount('event2'));
์์ธ(Exception): ์ฒ๋ฆฌํ์ง ๋ชปํ ์๋ฌ
๊ธฐ๋ณธ์ ์ผ๋ก try catch๋ฌธ์ผ๋ก ์์ธ๋ฅผ ์ฒ๋ฆฌ
๐ปerror1.js
setInterval(() => {
console.log('์์');
try {
throw new Error('์๋ฒ๋ฅผ ๊ณ ์ฅ๋ด์ฃผ๋ง!');
} catch (err) {
console.error(err);
}
}, 1000);
๋ ธ๋ ๋น๋๊ธฐ ๋ฉ์๋์ ์๋ฌ๋ ๋ฐ๋ก ์ฒ๋ฆฌํ์ง ์์๋ ๋จ
๐ปerror2.js
const fs = require('fs');
setInterval(() => {
fs.unlink('./abcdefg.js', (err) => {
if (err) {
console.error(err);
}
});
}, 1000);
ํ๋ก๋ฏธ์ค์ ์๋ฌ๋ ๋ฐ๋ก ์ฒ๋ฆฌํ์ง ์์๋ ๋จ
๐ปerror3.js
const fs = require('fs').promises;
setInterval(() => {
fs.unlink('./abcdefg.js')
}, 1000);
์ตํ์ ์๋จ์ผ๋ก ์ฌ์ฉ
๐ปerror4.js
process.on('uncaughtException', (err) => {
console.error('์๊ธฐ์น ๋ชปํ ์๋ฌ', err);
});
setInterval(() => {
throw new Error('์๋ฒ๋ฅผ ๊ณ ์ฅ๋ด์ฃผ๋ง!');
}, 1000);
setTimeout(() => {
console.log('์คํ๋ฉ๋๋ค');
}, 2000);
์๋
๋งฅ/๋ฆฌ๋
์ค
๐์ถ์ฒ๐
Node.js ๊ต๊ณผ์ - ๊ธฐ๋ณธ๋ถํฐ ํ๋ก์ ํธ ์ค์ต๊น์ง
https://www.inflearn.com/course/%EB%85%B8%EB%93%9C-%EA%B5%90%EA%B3%BC%EC%84%9C/dashboard