๐ํค์๋: REPL, CommonJS ๋ชจ๋, ECMAScript ๋ชจ๋, ๋ด์ฅ ๊ฐ์ฒด, ๋ด์ฅ ๋ชจ๋
๋ ธ๋์์ ์ ๊ณตํ๋ ์ฝ์๋ก, ์ ๋ ฅํ ์ฝ๋๋ฅผ ์ฝ๊ณ (Read), ํด์ํ๊ณ (Eval), ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐํํ๊ณ (Print), ์ข ๋ฃํ ๋๊น์ง ๋ฐ๋ณต(Loop)ํ๋ค๋ ์๋ฏธ์ด๋ค.
-REPL ์ฌ์ฉ๋ฐฉ๋ฒ
→ ํฐ๋ฏธ๋์ node๋ฅผ ์ ๋ ฅํ๋ค, ํ๋กฌํํธ๊ฐ >๋ก ๋ฐ๋์๋ค๋ฉด ์ ๋ ฅ ๊ฐ๋ฅํ ์ํ์ด๋ค.
-REPL ์ข ๋ฃ๋ฐฉ๋ฒ
→ Ctrl+C๋ฅผ ๋ ๋ฒ ๋๋ฅด๊ฑฐ๋, ์ฐฝ์ .exit๋ฅผ ์ ๋ ฅํ๋ค.
์ฝ์์ node [์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ๊ฒฝ๋ก]
→ ํ์ผ์ ์ ์ฅํ ๋๋ .js๋ก ์ ์ฅํ๊ณ , ์คํ์ ํ์ฅ์(.js)๋ ์๋ต ๊ฐ๋ฅํ๋ค.
โป REPL์ด ์๋๋ผ ์ฝ์์์ ์ ๋ ฅํด์ผ ํ๋ค.
โป ํ์ผ์ด๋ ํด๋์ ์ด๋ฆ์ /, \, |, <, >, :, ", ?, * ๋ฑ์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ๋ค.
๋ชจ๋์ด๋ ํน์ ํ ๊ธฐ๋ฅ์ ํ๋ ํจ์๋ ๋ณ์๋ค์ ์งํฉ์ด๋ค.
๋ ธ๋๋ ํ์ผ๋ณ๋ก ์ฝ๋๋ฅผ ๋ชจ๋๋ก ๋ง๋ค์ด ํด๋น ๋ชจ๋์ ์ฌ์ฌ์ฉํ๊ณ , ๊ด๋ฆฌ๋ ์ฉ์ดํ๊ฒ ํด์ค๋ค.
3-1. CommonJS ๋ชจ๋
ํ์ค ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ์๋์ง๋ง ๋ ธ๋์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๋ ๋ชจ๋์ด๋ค.
→ require()๋ฅผ ์ฌ์ฉํด ๋ชจ๋์ ๋ถ๋ฌ์จ๋ค.
+require()
-require()๋ ๋ชจ๋์ ๋ถ๋ฌ์ค๋ ํจ์์ด๋ค.
-๋ฐ๋์ ํ์ผ์ ์ต์๋จ์ ์์นํ ํ์์๋ค.
-require.cache ๊ฐ์ฒด์ ํ์ผ ์ด๋ฆ์ด ์์ฑ๋ช ์ผ๋ก ๋ค์ด ์๋ค. ์์ฑ๊ฐ์ผ๋ก๋ ๊ฐ ํ์ผ์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ์๋ค.
-require.main์ ๋ ธ๋ ์คํ ์ ์ฒซ ๋ชจ๋์ ๊ฐ๋ฆฌํจ๋ค.
//var.js
const odd = 'CJS ํ์์
๋๋ค';
const even = 'CJS ์ง์์
๋๋ค';
module.exports = {
odd,
even,
};
→ module.exports๋ก ํ ๋ฒ์ ๋์ ํ๋ ๋์ , ๊ฐ๊ฐ์ ๋ณ์๋ฅผ exports ๊ฐ์ฒด์ ํ๋์ฉ ๋ฃ์ ์ ์๋ค(module.exports==exports).
//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'));
-๋ชจ๋ ํ๋๊ฐ ์ฌ๋ฌ ๊ฐ์ ๋ชจ๋์ ์ฌ์ฉํ ์ ์๊ณ , ์ฌ์ฉ๋ ์ ์๋ค. (var.js๊ฐ func.js์ index.js์ ๋ ๋ฒ ์ฐ์ธ๋ค)
-์ฌ๋ฌ ํ์ผ์ ์ฌ์ฌ์ฉ๋๋ ํจ์๋ ๋ณ์๋ฅผ ๋ชจ๋๋ก ๋ง๋ค์ด๋๋ฉด ํธ๋ฆฌํ๋ค.
+๋ ธ๋์์ this
-์ต์์ ์ค์ฝํ(์๋ณ์๊ฐ ์ ํจํ ๋ฒ์)์์ this๋ module.exports๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
-ํจ์ ์ ์ธ๋ฌธ ๋ด๋ถ์ this๋ global ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
3-2. ECMAScript ๋ชจ๋
๊ณต์์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํ์์ด๋ค.
//var.mjs
export const odd = 'MJS ํ์์
๋๋ค';
export const even = 'MJS ์ง์์
๋๋ค';
//func.mjs
import { odd, even } from './var.mjs';
function checkOddOrEven(num) {
if (num % 2) { // ํ์๋ฉด
return odd;
}
return even;
}
export default checkOddOrEven;
//index.mjs
import { odd, even } from './var.mjs';
import checkNumber from './func.mjs';
function checkStringOddOrEven(str) {
if (str.length % 2) { // ํ์๋ฉด
return odd;
}
return even;
}
console.log(checkNumber(10));
console.log(checkStringOddOrEven('hello'));
-CommonJS ๋ชจ๋์ ES ๋ชจ๋ ์คํ์ผ๋ก ๋ฐ๊พธ๋ฉด require, exports, module.exports๋ฅผ ๊ฐ๊ฐ import, export, export default(ํจ์๋ ๊ฐ์ฒด๊ฐ ์๋ ๋ฌธ๋ฒ)๋ก ์จ์ค๋ค.
-ํ์ผ์ ํ์ฅ์๋ .js๊ฐ ์๋ .mjs๋ก ๋ฐ๊ฟ์ค๋ค.
-ํ์ผ์ ์คํํ ๋ CommonJS ๋ชจ๋๊ณผ ๋ฌ๋ฆฌ ํ์ฅ์๋ฅผ ์๋ตํ๋ฉด ์ ๋๋ค.
โป ํ ๊ฐ์ง์ ํ์๋ง ๊ณจ๋ผ์ ์ฌ์ฉํ์!
3-3. ๋ค์ด๋ด๋ฏน ์ํฌํธ
-๋ค์ด๋ด๋ฏน ์ํฌํธ๋ ์ฝ๋๋ฅผ ์คํ ์ค ๋ชจ๋์ ๋์ ์ผ๋ก ๋ถ๋ฌ์ค๋ ๊ฒ์ด๋ค. ์ฆ, ์ฝ๋ ๋ด ์ด๋์๋ ํธ์ถ ๊ฐ๋ฅํ๋ค.
-ES ๋ชจ๋์ if๋ฌธ ์์์ importํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅ ํ๊ธฐ ๋๋ฌธ์ ๋ค์ด๋ด๋ฏน ์ํฌํธ๋ฅผ ์ฌ์ฉํ๋ค.
//dynamic.mjs
const a = true;
if (a) {
const m1 = await import('./func.mjs');
console.log(m1);
const m2 = await import('./var.mjs');
console.log(m2);
}
→ ES๋ชจ๋์ ์ต์์ ์ค์ฝํ์์๋ async ํจ์ ์์ด await๊ฐ ๊ฐ๋ฅํ๋ค(CommonJS ๋ชจ๋์์๋ ๋ถ๊ฐ๋ฅ).
3-4. __filename, __dirname
ํ์ผ ๊ฒฝ๋ก์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
-__filename: ํ์ฌ ํ์ผ๋ช
-__dirname: ํ์ฌ ํ์ผ ๊ฒฝ๋ก
โป ES ๋ชจ๋์์๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ๋ค.
โป ์ธ๋๋ฐ(_) ๋ ๊ฐ๋ฅผ ๋ถ์ฌ์ผ ํ๋ค.
๋ฐ๋ก ์ค์นํ์ง ์์๋ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
4-1. global
๋ธ๋ผ์ฐ์ ์ window์ ๊ฐ์ ์ ์ญ ๊ฐ์ฒด
-์๋ต์ด ๊ฐ๋ฅํ๋ค(globla.require->require).
-global ๊ฐ์ฒด์ ์์ฑ์ ๊ฐ์ ๋์ ํด ํ์ผ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์๋ค. ํ์ง๋ง, ์ ์ง ๋ณด์์ ์ด๋ ค์์ด ์์ด ๋จ์ฉํ์ง ์๋ ๊ฒ ์ข๋ค.
4-2. console
๋ณดํต ๋๋ฒ๊น ์ ์ํด ์ฌ์ฉํ๋ค.
-๋ํ์ ์ธ console.log ๋ฉ์๋ ์ด์ธ์ ๋ก๊น ํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
-console.time(๋ ์ด๋ธ)-console.timeEnd, console.log(๋ด์ฉ), console.error(์๋ฌ ๋ด์ฉ), console.table(๋ฐฐ์ด), console.dir(๊ฐ์ฒด, ์ต์ ), console.trace(๋ ์ด๋ธ) ๋ฑ์ด ์๋ค.
4-3. ํ์ด๋จธ
๋ณดํต ๋๋ฒ๊น ์ ์ํด ์ฌ์ฉํ๋ค.
-setTimeout(์ฝ๋ฐฑ ํจ์, ๋ฐ๋ฆฌ์ด) - clearTimeout(์์ด๋): ์ฃผ์ด์ง ๋ฐ๋ฆฌ์ด ์ดํ
-setInterval(์ฝ๋ฐฑ ํจ์, ๋ฐ๋ฆฌ์ด) - clearInterval(์์ด๋): ์ฃผ์ด์ง ๋ฐ๋ฆฌ์ด ๋ง๋ค
-setImmediate(์ฝ๋ฐฑ ํจ์) - clearImmediate(์์ด๋): ์ฝ๋ฐฑ ํจ์ ์ฆ์
→ ๋ฐํ๋ ์์ด๋๋ก ํ์ด๋จธ๋ฅผ ์ทจ์ํ ์ ์๋ค.
//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);
4-4. process
ํ์ฌ ์คํ๋๊ณ ์๋ ๋ ธ๋ ํ๋ก์ธ์ค์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.
โ process.env: ์์คํ ์ ํ๊ฒฝ๋ณ์
-์์๋ก ํ๊ฒฝ ๋ณ์ ์ ์ฅ ๊ฐ๋ฅ
-์๋ฒ์ ์ค์ํ ํค๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ
-์ค์ํ ๋น๋ฐ๋ฒํธ๋ process.env์ ์์ฑ์ผ๋ก ๋์ฒด
โก process.nextTick(์ฝ๋ฐฑ)
//nextTick.js
setImmediate(()=> {
console.log('immediate');
});
process.nextTick(()=> {
console.log('nextTick'); //๋ค๋ฅธ ์ฝ๋ฐฑ๋ค๋ณด๋ค ์ฐ์ ์
});
setTimeout(()=> {
console.log('timeout');
},0);
Promise.resolve().then(()=> console.log('promise')); //resolve๋ Promise๋ ๋ค๋ฅธ ์ฝ๋ฐฑ ๋ณด๋ค ์ฐ์ ์
→ process.nextTick์ Promise๋ฅผ ๋ง์ดํฌ๋กํ์คํฌ๋ผ๊ณ ๊ตฌ๋ถํด์ ๋ถ๋ฅธ๋ค.
โข process.exit(์ฝ๋)
์๋ฒ ์ธ์ ๋ ๋ฆฝ์ ์ธ ํ๋ก๊ทธ๋จ์์ ์๋์ผ๋ก ์คํ์ค์ธ ๋ ธ๋๋ฅผ ์ข ๋ฃํ๋ค.
โป ์๋ฒ ํ๊ฒฝ์์๋ ์ ์ฌ์ฉํ์ง ์๋๋ค.
4-5. ๊ธฐํ ๋ด์ฅ ๊ฐ์ฒด
-URL, URLSearchParams
-AbortController, FormData, fetch, Headers, Request, Response, Event, EventTarget
-TextDecoder,TextEncoder, WebAssembly
โป ๋ ธ๋ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ ํ์ฉํ์.
5-1. os ๋ชจ๋
os ๋ชจ๋์ ํ์ฉํด ์ด์์ฒด์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
+os ๋ชจ๋์ ๋ํ์ ์ธ ๋ฉ์๋
-์ด์์ฒด์ ์ ๋ณด : .arch() .platform() .type() .uptime() .hostname() .release()
-๊ฒฝ๋ก: .homedir() .tmpdir()
-๋ฉ๋ชจ๋ฆฌ ์ ๋ณด: .cups() .freemem() .totalmem()
-์๋ฌ ์ ๋ณด: .constants
→ ์ปดํจํฐ ๋ด๋ถ ์์์ ๋น๋ฒํ๊ฒ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ ๋น๋๊ฐ ๋์ง ์๋ค. ํ์ง๋ง ์ด์์ฒด์ ๋ณ๋ก ๋ค๋ฅธ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ ์ถ์ ๋ os ๋ชจ๋์ด ์ ์ฉํ๋ค.
5-2. path
ํด๋์ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ฝ๊ฒ ์กฐ์ํ๋๋ก ๋์์ฃผ๋ ๋ชจ๋์ด๋ค.
-์ด์์ฒด์ ๋ณ๋ก ๊ฒฝ๋ก ๊ตฌ๋ถ์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ ์ฉํ๊ฒ ์ฐ์ธ๋ค.
//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\\zerocho',
name: 'path',
ext: '.js',
})); //path.parse()ํ ๊ฐ์ฒด์ ํ์ผ ๊ฒฝ๋ก ํฉ์น๋ค.
console.log('path.normalize():', path.normalize('C://users\\\\zerocho\\\path.js')); //์ ์์ ์ธ ๊ฒฝ๋ก๋ก ๋ณํ
console.log('------------------------------');
console.log('path.isAbsolute(C:\\):', path.isAbsolute('C:\\')); //์ ๋๊ฒฝ๋ก or ์๋๊ฒฝ๋ก
console.log('path.isAbsolute(./home):', path.isAbsolute('./home'));
console.log('------------------------------');
console.log('path.relative():', path.relative('C:\\users\\zerocho\\path.js', 'C:\\')); //์ฒซ๋ฒ์งธ ๊ฒฝ๋ก์์ ๋๋ฒ์งธ ๊ฒฝ๋ก๋ก ๊ฐ๋ ๋ฒ
console.log('path.join():', path.join(__dirname, '..', '..', '/users', '.', '/zerocho')); //ํ๋์ ๊ฒฝ๋ก๋ก ํฉ์นจ
console.log('path.resolve():', path.resolve(__dirname, '..', 'users', '.', '/zerocho')); //join๊ณผ ๋ฌ๋ฆฌ ์ ๋ ๊ฒฝ๋ก๋ก ์ธ์ํด ์์ ๊ฒฝ๋ก๋ฅผ ๋ฌด์
→ ๋ ธ๋๋ require.main ํ์ผ์ ๊ธฐ์ค์ผ๋ก ์๋๊ฒฝ๋ก๋ฅผ ์ธ์ํ๋ค.
โป path ๋ชจ๋์ ๋ ธ๋ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉฐ ์ ์ฉํ๊ฒ ์ฐ์ธ๋ค.
5-3. url
์ธํฐ๋ท ์ฃผ์๋ฅผ ์ฝ๊ฒ ์กฐ์ํ๋๋ก ๋์์ฃผ๋ ๋ชจ๋์ด๋ค.
โ url
-WHATWG์ url์ url ๋ชจ๋ ์์ URL ์์ฑ์๊ฐ ์์ด ์ฌ๊ธฐ์ ์ฃผ์๋ฅผ ๋ฃ์ด ๊ฐ์ฒด๋ก ๋ง๋ค๋ฉด ์ฃผ์๊ฐ ๋ถ๋ถ๋ณ๋ก ์ ๋ฆฌ๋๋ค. username, password, origin, searchParams ์์ฑ์ด ์กด์ฌํ๋ค.
-url.format(๊ฐ์ฒด): ๋ถํด๋์๋ ๊ฐ์ฒด๋ฅผ ๋ค์ ์๋ ์ํ๋ก ์กฐ๋ฆฝํ๋ค.
โก searchParams ๊ฐ์ฒด
-search ๋ถ๋ถ์ ์ฃผ์๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉ๋๋ค.
-์ฌ๋ฌ ํค๊ฐ์์ ๋๋ &๋ก ๊ตฌ๋ถํ๋ค.
-ํค=๊ฐ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค.
//searchParams.js
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(); //์กฐ์ํ searchParams ๊ฐ์ฒด๋ฅผ ๋ค์ ๋ฌธ์์ด๋ก ๋ง๋ ๋ค
5-4. dns
๋๋ฉ์ธ์ ํตํด IP๋ ๊ธฐํ DNS ์ ๋ณด๋ฅผ ์ป๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
-ip์ฃผ์ ์ป๊ธฐ - dns.lookup dns.resolve
-A(ipv4์ฃผ์), AAAA(ipv6์ฃผ์), NS(๋ค์์๋ฒ), SOA(๋๋ฉ์ธ ์ ๋ณด), CNAME(๋ณ์นญ), MX(๋ฉ์ผ ์๋ฒ)
5-5. crypto
๋ค์ํ ๋ฐฉ์์ ์ํธํ๋ฅผ ๋์์ฃผ๋ ๋ชจ๋์ด๋ค.
โ ๋จ๋ฐฉํฅ ์ํธํ
-๋ณดํต ๋จ๋ฐฉํฅ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ ์ํธํํ๋ค.
-๋ณตํธํํ ์ ์๋ ์ํธํ ๋ฐฉ์์ด๋ค(ํ ๋ฒ ์ํธํ ํ๋ฉด ์๋ ๋ฌธ์์ด์ ์ฐพ์ ์ ์๋ค.)
-์ฃผ๋ก ํด์ ๊ธฐ๋ฒ(์ด๋ ํ ๋ฌธ์์ด์ ๊ณ ์ ๋ ๊ธธ์ด์ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ)์ ์ฌ์ฉํ๋ค.
//hash.js
const crypto = require('crypto');
console.log('base64:', crypto.createHash('sha512').update('๋น๋ฐ๋ฒํธ').digest('base64'));
console.log('hex:', crypto.createHash('sha512').update('๋น๋ฐ๋ฒํธ').digest('hex'));
console.log('base64:', crypto.createHash('sha512').update('๋ค๋ฅธ ๋น๋ฐ๋ฒํธ').digest('base64'));
-createHash(์๊ณ ๋ฆฌ์ฆ): ์ฌ์ฉํ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฃ๋๋ค.
-update(๋ฌธ์์ด): ๋ณํํ ๋ฌธ์์ด์ ๋ฃ๋๋ค.
-digest(์ธ์ฝ๋ฉ): ์ธ์ฝ๋ฉํ ์๊ณ ๋ฆฌ์ฆ์ ๋ฃ๋๋ค. base64, hex, latin1์ด ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
→ ์ปดํจํฐ์ ์ฑ๋ฅ์ด ๋ฐ๋ฌํจ์ ๋ฐ๋ผ ๊ธฐ์กด ํด์ ์๊ณ ๋ฆฌ์ฆ๋ค์ด ์ํ๋ฐ๊ณ ์๋ค. ๋ฐ๋ผ์ ์๊ณ ๋ฆฌ์ฆ๋ ๋ ๊ฐ๋ ฅํ๊ฒ ์งํํ๊ณ ์๋ค. ํ์ฌ๋ ์ฃผ๋ก pbkdf2๋ bcrypt, scrypt ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
โก ์๋ฐฉํฅ ์ํธํ
-์ํธํ๋ ๋ฌธ์์ด์ ํค๋ฅผ ์ฌ์ฉํด ๋ณตํธํ ๊ฐ๋ฅํ๋ค.
-์ํธ๋ฅผ ๋ณตํธํ ํ๋ ค๋ฉด ์ํธํ ํ ๋ ์ฌ์ฉํ ํค๋ฅผ ์ฌ์ฉํ๋ค.
//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)
-cipher.update(๋ฌธ์์ด, ์ธ์ฝ๋ฉ, ์ถ๋ ฅ ์ธ์ฝ๋ฉ)
-cipher.final(์ถ๋ ฅ ์ธ์ฝ๋ฉ)
-crypto.createDecipheriv(์๊ณ ๋ฆฌ์ฆ, ํค, iv)
-decipher.update(๋ฌธ์์ด, ์ธ์ฝ๋ฉ, ์ถ๋ ฅ ์ธ์ฝ๋ฉ)
-decipher.final(์ถ๋ ฅ ์ธ์ฝ๋ฉ)
โป ์ถ๊ฐ๋ก ๋ ธ๋ ๊ณต์ ๋ฌธ์, npmํจํค์ง ํ์ธํด ์์๋ณธ๋ค.
5-6. util
๊ฐ์ข ํธ์ ๊ธฐ๋ฅ์ ๋ชจ์๋ ๋ชจ๋์ด๋ค.
-util.deprecate: ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฃ์ ํจ์๋ฅผ ์ฌ์ฉํ์ ๋ ๋ ๋ฒ์งธ ์ธ์์ธ ๊ฒฝ๊ณ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.
-util.promisify: ์ฝ๋ฐฑ ํจํด์ ํ๋ก๋ฏธ์ค ํจํด์ผ๋ก ๋ฐ๊พผ๋ค. ๋ฐ๊ฟ ํจ์๋ฅผ ์ธ์๋ก ์ ๊ณตํ๋ค.
5-7. worker_threads
-๋ ธ๋์์ ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์ ์์ ์ด๋?
→์์ปค ์ค๋ ๋(์ฝ๋๋ฅผ ์คํํ ์ ์๋ ๊ฐ ๋จ์)๋ฅผ ๋์ ํด ๋ฉํฐ ์ค๋ ๋ฉ์ด ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ฐฉ์์ด๋ค. ์ฆ, ๋ฉํฐ ์ค๋ ๋์ ๋ณ๋๋ก ์๋ํ๋ ์์ปค ์ค๋ ๋๋ฅผ ์์ฑํ์ฌ ๋ณต์กํ ์์ ์ด๋ ๊ณ์ฐ์ ๋ฉ์ธ ์ค๋ ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ์คํํ๋ ๊ฒ์ด๋ค.
//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);
}
→ ํ์ฌ ๋ ๊ฐ์ ์์ปค๊ฐ ๋์๊ฐ๊ณ ์์ผ๋ฉฐ, ๊ฐ๊ฐ์ ๋ถ๋ชจ๋ก๋ถํฐ ์ซ์๋ฅผ ๋ฐ์์ 100์ ๋ํด ๋๋ ค์ค๋ค. (์ฌ๋ฌ ๊ฐ์ ์์ปค ์ค๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐ๋ ์์ )
//prime-worker.js
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
const min = 2;
let primes = [];
function findPrimes(start, end) {
let isPrime = true;
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.floor((max - min) / threadCount);
let start = min;
console.time('prime');
for (let i = 0; i < threadCount - 1; i++) {
const end = start + range - 1;
threads.add(new Worker(__filename, { workerData: { start, range: end } }));
start += range;
}
threads.add(new Worker(__filename, { workerData: { start, range: max } }));
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);
}
→ ์์๊ฐ ๋ช ๊ฐ ์๋์ง ์์๋ด๋ ์ฝ๋์ด๋ค. ์์ปค ์ค๋ ๋๋ฅผ ์ฌ์ฉํด ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๊ฐ ๋๋ ์ ๋ฌธ์ ๋ฅผ ํ๋ฉด ์ฌ์ฉํ์ง ์๋ ๊ฒ๋ณด๋ค ์๋๊ฐ ๋นจ๋ผ์ง๋ค.
5-8. child_process
๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์คํํ๊ณ ์ถ๊ฑฐ๋ ๋ช ๋ น์ด๋ฅผ ์ํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๋ชจ๋์ด๋ค.
-๋ค๋ฅธ ์ธ์ด์ ์ฝ๋(ํ์ด์ฌ ๋ฑ)๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ด๊ฐ์ ๋ฐ์ ์ ์๋ค.
//exec.js
const exec = require('child_process').exec;
const process = exec('dir');
process.stdout.on('data', function(data) {
console.log(data.toString());
}); // ์คํ ๊ฒฐ๊ณผ
process.stderr.on('data', function(data) {
console.error(data.toString());
}); // ์คํ ์๋ฌ
→ ๋ช ๋ น ํ๋กฌํํธ์ ๋ช ๋ น์ด์ธ dir์ ํตํด ๋ ธ๋๋ฅผ ์คํํ๋ค.
//spawn.js
const spawn = require('child_process').spawn;
const 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());
}); // ์คํ ์๋ฌ
→ ํ์ด์ฌ ์ฝ๋๋ฅผ ๋ ธ๋์ spawn์ ํตํด ์คํํ๋ค.
-exec์ spawn์ ์ฐจ์ด๋?
→ exec๋ ์ ธ์์ ์คํํด์ ๋ช ๋ น์ด ์ํ, spawn์ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ๋์ฐ๋ฉด์ ๋ช ๋ น์ด ์คํํ๋ค(์ ธ์์ ์คํํ๋ ค๋ฉด ์ธ ๋ฒ์งธ ์ธ์๋ก {shell:true}๋ฅผ ๋ฃ์ด์ค๋ค.
5-9. ๊ธฐํ ๋ชจ๋๋ค
โป ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํด ํ์ฉํ๊ธฐ!
Quiz
1. ๋ ธ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ฆ์์์ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋๋ก ์ง์ํ๋ ํ๊ฒฝ์ ( )์ด๋ค.
2. ๋ ธ๋๋ฅผ ํตํด ํ์ผ์ ์คํํ๋ ๋ช ๋ น์ด๋ ( )์ด๋ค.
3. ํ์ค ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ์๋์ง๋ง ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๋ ๋ชจ๋์ ( ) ๋ชจ๋์ด๋ค.
4. ๋ชจ๋์ ๋ถ๋ฌ์ค๋ ํจ์๋ ( )์ด๋ค.
5. ๋ ธ๋์์ ํ์ฌ ํ์ผ๋ช ๊ณผ ํ์ฌ ํ์ผ ๊ฒฝ๋ก์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ํค์๋๋ ( ), ( )์ด๋ค.
6. ์ฃผ์ด์ง ๋ฐ๋ฆฌ์ด ์ดํ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ๋ ๋ ธ๋ ๋ด์ฅ ๊ฐ์ฒด๋ ( )์ด๋ค.
7. ํด๋์ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ฝ๊ฒ ์กฐ์ํ๋๋ก ๋์์ฃผ๋ ๋ชจ๋์ ( )์ด๋ค.
Programming Quiz
8. ์๋์ CommonJS ๋ชจ๋ ๋ฐฉ์์ผ๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ES ๋ชจ๋ ์คํ์ผ๋ก ๋ฐ๊ฟ์ ์์ฑํ์์ค.
//index.js
const { odd, even } = require('./var');
const checkNumber = require('./func');
function checkStringOddOrEven(str) {
if (str.length % 2) {
}
return even;
}
console.log(checkNumber(10));
console.log(checkStringOddOrEven('node.js_team2'));
9. process ๋ด์ฅ ๊ฐ์ฒด์ process.exit()์ setInterval ํจ์๋ฅผ ์ด์ฉํด 0.5์ด๋ง๋ค 5๋ถํฐ 1๊น์ง ํ์ํ ๋ค, i๊ฐ 1์ด ๋์์ ๋ ์ข ๋ฃํ๋๋ก ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
Answer
1. REPL
2. node
3. CommonJS
4. require
5. __filename, __dirname
6. setTimeout()
7. path
8.
//index.mjs
import { odd, even } from './var.mjs';
import checkNumber from './func.mjs';
function checkStringOddOrEven(str) {
if (str.length % 2) { // ํ์๋ฉด
return odd;
}
return even;
}
console.log(checkNumber(10));
console.log(checkStringOddOrEven('node.js_team2'));
9.
//9
let i=5;
setInterval(() => {
if (i===1) {
console.log('์ข
๋ฃ');
process.exit();
}
console.log(i);
i--;
}, 500);
์ถ์ฒ) ์กฐํ์ , ใNode.js ๊ต๊ณผ์ ๊ฐ์ 3ํใ, ๊ธธ๋ฒ(2022), 3์ฅ ๋ ธ๋ ๊ธฐ๋ฅ ์์๋ณด๊ธฐ.
Corner node.js 2ํ
Editor : ์ด๊ตฌ๋ฏธ
[๋ ธ๋ 2ํ] #5. ๋ ธ๋ ๊ธฐ๋ฅ(2) (0) | 2024.11.08 |
---|---|
[๋ ธ๋ 2ํ] #3.์์๋ฌ์ผ ํ ์๋ฐ์คํฌ๋ฆฝํธ (0) | 2024.10.11 |
[๋ ธ๋ 2ํ] #2.JavaScript ๋ฐ๋ณต๋ฌธ, ๋ฐ๋ณต์, ๊ฐ์ฒด (0) | 2024.10.04 |
[๋ ธ๋ 2ํ] #1.JavaScript ๋ณ์ ์ ์ธ, ์กฐ๊ฑด๋ฌธ, ํจ์, ๋ฐฐ์ด (0) | 2024.10.04 |