KDT/TIL
8/24 TIL : node.js, promise, async/await
ebulsok
2022. 9. 7. 15:23
๐ node.js : Chrome V8 JavaScript ์์ง์ผ๋ก ๋น๋๋ JavaScript ๋ฐํ์
- ์คํฌ๋ฆฝํธ ์ธ์ด๋ผ ์ด๋ ํ๊ฒฝ์์๋ ๋์
- ์ฑ๋ฅ์ด ๋น ๋ฅด๊ณ ์ข์
- js๋ฅผ ์ฐ๋ ๊ฐ๋ฐ์๊ฐ ๋ง์
- Ryan Dahl์ด ์๋ฒ์ฉ ๊ธฐ๋ฅ์ ๊ฐ๋ฐ
๐ฉ ๊ฐ๋ฐํ๊ฒฝ ์ธํ (์๋์ฐ ๊ธฐ์ค)
- node.js ์ค์น(https://nodejs.org/ko/)
- ๋ฒ์ ๊ด๋ฆฌ tool ์ค์น(https://github.com/coreybutler/nvm-windows/releases)
- nvm ๋ฒ์ ํ์ธ: [ํฐ๋ฏธ๋] nvm version
- node.js ๋ฒ์ ํ์ธ: [ํฐ๋ฏธ๋] nvm ls
๐ฉ npm: node package manager
- [ํฐ๋ฏธ๋] npm init -y
- ํ์ผ ์คํ: [ํฐ๋ฏธ๋] node ํ์ผ๋ช
๐ฉ formatting: ์ฝ๋์ ์คํ์ผ์ ํต์ผ์์ผ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ ๋ฒ๊ทธ๋ฅผ ์๋ฐฉ
- prettier ์ค์ : [ํฐ๋ฏธ๋] npm install --save-dev prettier
- prettier ํ์ฅ ์ค์น
- .prettierrc ํ์ผ ์์ฑ
- { "semi": true, "singleQuote": true }
- .vscode ํด๋ ์์ฑ, setting.json ํ์ผ ์์ฑ
{
"[javascript]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
๐ฉ Linting: formatting์ ๊ฐ๊น์ง๋ง ๋ ๋ง์ ๊ท์ฝ๊ณผ ๊ท์จ์ ๊ฒ์ฌํด์ฃผ๋ ๋ฐฉ๋ฒ, ์น๊ฐ๋ฐ์์๋ airbnb์์ ์ฌ์ฉํ๋ linting ๊ท์จ์ด ์ ๋ช ํจ
- ESLint ์ค์น: [ํฐ๋ฏธ๋] npm install --save-dev eslint
- .eslintrc.js ํ์ผ ์์ฑ
- module.exports = { extends: ['airbnb-base'], rules: { 'linebreak-style': 0, 'no-console': 'off', }, };
- airbnb linting rule: [ํฐ๋ฏธ๋] npm install --save-dev eslint-config-airbnb-base eslint-plugin-import
๐ฉ typescript ์ค์น: [ํฐ๋ฏธ๋] npm install --save-dev typescript
- js ํ์ผ์ // @ts-check ์ฃผ์ ์ถ๊ฐ
- [ํฐ๋ฏธ๋] npm install --save-dev @types/node
๐ฉ ๊ฐ๋จํ node.js ์๋ฒ - main.js
// @ts-check
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.end('Hello');
});
const PORT = 4000;
server.listen(PORT, () => {
console.log(`The server is listening at port: ${PORT}`);
});
๐ JavaScript ์คํ ๊ฐ๋
- JS์ ๋ฉ์ธ ์ค๋ ๋๋ ๋ช ๋ น์ด๋ฅผ ์์๋๋ก call stack์ ๋ฐ์ด ๋ฃ๊ณ , ์์ธ ์์๋๋ก ๋ช ๋ น์ด๋ฅผ ์ฒ๋ฆฌํจ
- ๋ช ๋ น์ด๋ก ์ฒ๋ฆฌํ๋ ์์ค web api ๋๋ callback queue์ ํธ์ถ์ด ์๊ธฐ๋ฉด ํด๋น ์์ญ์ผ๋ก ํธ์ถ๋ ํจ์๋ฅผ ๋ฃ์ด์ค
- web api๋ ํธ์ถ๋ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌ ์๋ฃํ๋ฉด callback queue์ ์๋ฃ๋ ๊ฒ์ ๋ฃ์ด์ค
- callback queue๋ call stack์ด ์ ๋ถ ๋น๋ฉด, ์ด๋ฒคํธ ๋ฃจํ๊ฐ callback queue์ ๊ฒ์ call stack์ ๋ฐ์ด๋ฃ์ด์ค(tick)
๐ฉ callback
- ์๋ฌด๋ฆฌ ์ธํฐ๋ท์ด ๋นจ๋ผ๋ ๋น๋๊ธฐ ๋ฐฉ์์ธ JS๋ ์๋ฒ์ ์๋ต์ ๋ฐ๊ธฐ๋ ์ ์ ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ํํ๊ฒ ๋๊ณ , ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ => ํน์ ์๋ต์ด ๋ฐ์ํ์ ๋ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด callback ๋ฐฉ์์ ์ฌ์ฉ => ์ฝ๋ ์ํ ์์๋ฅผ JS ๋ฉ์ธ ์ค๋ ๋์๋ง ์์กดํ์ง ์์๋ ๋จ
- ๊ทธ๋ฌ๋ ์ฝ๋ ๊ฐ๋ ์ฑ์ด ์ข์ง ์๊ธฐ ๋๋ฌธ์ ๋ฒ๊ทธ, ์ฝ๋ ์ ์ง๋ณด์ ๋ฌธ์ ๊ฐ ์์
๐ฉ promise: ES6์์ ์ถ๊ฐ๋ JS ๋ฌธ๋ฒ
- new Promise๋ก ์๋ก์ด ์์ฑ์๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉ
- promise๊ฐ ์์ฑ๋๋ฉด ์ผ๋จ ์์ ์ ์คํํ๊ณ ํด๋น ์์ ์ด ์๋ฃ ์ฌ๋ถ๋ฅผ executor ๋งค๊ฐ๋ณ์(= resolve/reject)๋ฅผ ํตํด ์ ๋ฌ
- resolve: ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ ค์ผํ๋ ์ฝ๋๊ฐ ์ํ ์๋ฃ๋๋ฉด ์์ ์ด ์๋ฃ๋์์์ resolve๋ก ์ ๋ฌ, resolve๊ฐ ์คํ๋๋ฉด then์ผ๋ก ํด๋น ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌ
- reject: ๋น๋๊ธฐ ์์ ์ด ์คํจํ์ ๋ reject๋ฅผ callback์ผ๋ก ์ ๋ฌ, catch๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌ, ๋ณดํต Error๋ผ๋ ์์ฑ์๋ฅผ ์ฌ์ฉ
- finally: promise ์ฝ๋์ ์ฑ๊ณต ์ฌ๋ถ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์คํ. then, catch์ ํจ๊ป ์ฌ์ฉ
const promise = new Promise((resolve, reject) => {
console.log('Promise์ ๊ธฐ๋ฅ์ ๋ฐ๋ก ์ํํฉ๋๋ค');
setTimeout(() => {
// resolve('์์
์ฑ๊ณต ์ ๊ฒฐ๊ณผ๋ฅผ resolve๋ก ์ ๋ฌํด์ค๋๋ค');
const userId = 'bulsok';
if (userId === 'bulsok') resolve(userId);
else reject(new Error('์๋ฌ!'));
}, 2000);
});
promise
.then((value) => {
console.log(`์์ฒญํ์ ID๋ ${value}`);
})
.catch((err) => {
console.log(err);
})
.finally(() => {
console.log('Promise ์ํ์ค ์ข
๋ฃ');
});
๐ฉ Syntactic sugar
- promise๋ ์ฌ๋ฌ๋ฒ ์ฐ๊ฒฐ๋๋ฉด chain์ด ๋ฐ์ํ๋ฏ๋ก ์ฝ๋ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ ์ ๊ณตํ๋ ๊ฒ => async/await
- async: function ์์ async๋ฅผ ๋ถ์ด๋ฉด ํด๋น ํจ์๋ ํญ์ promise๋ฅผ ๋ฐํ, ๋ด๋ถ์ await ํค์๋ ์ฌ์ฉ ๊ฐ๋ฅ
- await: promise๊ฐ ์์ ํ ์ํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ญํ , ๊ธฐ๋ค๋ฆฌ๋ ์ค์ cpu๋ ๋ค๋ฅธ ์ผ์ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฆฌ์์ค ๋ญ๋น ์์