1. Node.js๋
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด๋ ํ๊ฒฝ์์๋ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ์คํ๊ธฐ
- Browser์ JavaScript
- ๋ธ๋ผ์ฐ์ ์์ ์คํ
- ์น ๋ด๋ถ์ ์ ํ๋ ๋์
- ์น ํ๋ก ํธ ๊ฐ๋ฐ์์ ์ธ์ด
- Node.js
- ํฌ๋ก์ค ํ๋ซํผ ์คํ (์ด๋ ํ๊ฒฝ์์๋ ์คํ ๊ฐ๋ฅ)
- ์ ํ ์๋ ๋์
- ๋ค์ํ ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ
2. Node.js์ ํน์ง
์ฑ๊ธ ์ฐ๋ ๋ - ๋น๋๊ธฐ - ์ด๋ฒคํธ ๊ธฐ๋ฐ
2-1. ์ฑ๊ธ ์ฐ๋ ๋
- ์ฐ๋ ๋(Thread): ๋ช ๋ น์ ์คํํ๋ ๋จ์, ํ ๊ฐ์ ์ฐ๋ ๋๋ ํ ๋ฒ์ ํ ๊ฐ์ง ๋์๋ง ์คํ ๊ฐ๋ฅ
- ์ฑ๊ธ ์ฐ๋ ๋: ํ ๋ฒ์ ํ ๊ฐ์ง ๋์๋ง ์ํํจ
- ๋ฉํฐ ์ฐ๋ ๋: ๋์์ ์ฌ๋ฌ ๋์ ์ํ ๊ฐ๋ฅ
- ์ฅ์
- ์ฐ๋ ๋ ์์ฑ ๋น์ฉ์ด ์๋ค
- ์ฐ๋ ๋๊ฐ ๋์ด๋์ง ์๊ธฐ ๋๋ฌธ์ CPU ๋ฆฌ์์ค ๊ด๋ฆฌ์ ํจ์จ์
- ๋จ์
- ์ฐ๋ ๋ ๊ธฐ๋ฐ์ ์์ ๋ค์ ํจ์จ์ด ๋จ์ด์ง ex) CPU ์ฐ์ฐ ์์
๐ ๊ทธ๋์ Node.js๋ ๋น๋๊ธฐ ๋์์ผ๋ก ์ฐ๋ ๋ ๊ธฐ๋ฐ์ ์์ ์ ์ต์ํ ํ๋ค.
2-2. ๋น๋๊ธฐ
- ๋์์ ์คํํ ํ ์๋ฃ๊ฐ ๋๊ธธ ๊ธฐ๋ค๋ฆฌ์ง ์๋ ๋ฐฉ์
- ๋์์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋์์ ๋ฐ๋ก ์คํ ๊ฐ๋ฅ
- Node.js๋ ์ฑ๊ธ ์ฐ๋ ๋์ด๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ ๋ฐฉ์์ ์ฌ์ฉ
2-3. ์ด๋ฒคํธ ๊ธฐ๋ฐ
- ๋น๋๊ธฐ ๋์์ ์๋ฃ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ๋น๋๊ธฐ ๋ฐฉ์์ ํน์ ๋์์ ์คํํ ํ, ํด๋น ๋์์ ์ ํ ์ ๊ฒฝ ์ฐ์ง ์์
- ๋์ ํด๋น ๋์์ด ์๋ฃ๋ ๊ฒฝ์ฐ ์คํํ ํจ์๋ฅผ ๋ฏธ๋ฆฌ ๋ฑ๋กํจ (= ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ๋ค.)
- ๋น๋๊ธฐ ๋์์ด ์๋ฃ๊ฐ ๋๋ฉด ๋ฏธ๋ฆฌ ๋ฑ๋ก๋ ํจ์๋ฅผ ์คํ
โจ ๊ฒฐ๋ก
Node.js๋ ์ฑ๊ธ ์ฐ๋ ๋์ด๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ ๋์์ด ํ์ํ๊ณ ,
๋น๋๊ธฐ ๋์์ ๊ตฌํํ๊ธฐ ์ํด ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ๋์ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
3. Node.js ์์ํ๊ธฐ
- Node.js๋ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐ์ค์ธ ๊ธฐ์
- ์๋ก์ด ๋ฒ์ ์์๋ ๋ณด์ ์ด์ ๋ฐ ๋ฒ๊ทธ ์์ , ์ต์ ๊ธฐ์ ๋ค์ด ๋น ๋ฅด๊ฒ ์ ์ฉ๋๊ณ ์๋ค.
- ๊ธ๋ณํ๋ ๊ธฐ์ ์ ๊ฐ์ฅ ์์ ์ ์ธ ์ต์ ๋ฒ์ ์ ์ ํํ๋ ๊ฒ์ด ์ต์
- LTS
- Long-Term Support ๋ฒ์
- Node.js์ ์์ ์ ์ด๊ณ , ์ค๋ ์ง์๋๋ ๋ฒ์
4. ES6
- ECMAScript
- ๊ณ์ํด์ ๋ฐ์ ํด๊ฐ๋ JavaScript์ ํ์ค ๋ฌธ๋ฒ
- 2015๋ , ECMAScript ๋ฒ์ 6 ์ดํ๋ก ๋ง์ ํ๋์ ์ธ ๋ฌธ๋ฒ์ด ์ถ๊ฐ๋จ
- ECMAScript ๋ฒ์ 6 ์ดํ๋ฅผ ํตํ์ด ์ผ๋ฐ์ ์ผ๋ก ES6๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ฌ์ฉ ์ด์
- ํ๋์ ์ธ ๋ฌธ๋ฒ โก ์์ฐ์ฑ ํฅ์
- Node.js๋ ๋น ๋ฅด๊ฒ ์ต์ ECMAScript๋ฅผ ์ง์ํ๋ค. (๋จ, ES6์ ๋ชจ๋ ๋ฌธ๋ฒ์ ์ง์ํ์ง๋ ์์)
4-1. let, const
- ๊ธฐ์กด์ var: ์์์ ๋ณ์ ๊ตฌ๋ถ์ด ์๋ค.
- let๊ณผ const๋ฅผ ํตํด ์์์ ๋ณ์๋ฅผ ๊ตฌ๋ถํ ์ ์๋ค.
4-2. Template String(``)
- ๋ฐฑํฑ( ` )๊ธฐํธ๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์๋ฅผ ํํ
- ${ }๋ฅผ ํตํด ๋ฌธ์์ด ์ฌ์ด์ ๊ฐ๋จํ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
4-3. arrow function
// ๊ธฐ์กด
function doSomething(param) {
console.log('do something');
}
// arrow function
const doSometing = (param) => { // ์์ํ์ผ๋ก ํํ ๊ฐ๋ฅ -> ์๋ก ์ ์ธ ๋ถ๊ฐ
console.log('do something');
}
4-4. class
// ๊ธฐ์กด: prototype์ผ๋ก class ํจ์ ๊ตฌํ
function Model(name, age) {
this.name = name;
this.age = age;
}
Model.prototype.getInfo = function() {
console.log(this.name, this.age);
}
// ES6 => ์ผ๋ฐ์ ์ธ ํํ์ class ๊ตฌํ ๊ฐ๋ฅ
class Model {
constructor(name, age) {
this.name = name;
this.age = age;
}
getInfo() {
console.log(this.name, this.age);
}
}
4-5. destructing
// ๊ธฐ์กด ๋ฌธ๋ฒ
var obj = {name: 'Tom', age: 5};
var name = obj.name;
var age = obj.age;
var arr = ['some', 'values'];
var first = arr[0];
var secont = arr[1];
// ES6
// Object์ key์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ๋ณ์ ์ ์ธ ๊ฐ๋ฅ
const obj = {name: 'Tom', age: 5};
const {name, age} = obj;
const {name: n1, age: a1} = obj;
const arr = ['some', 'values'];
// arr์์ ์์ฐจ์ ์ผ๋ก ๋ณ์ ์ ์ธ ๊ฐ๋ฅ
const [first, second] = arr;
- ๊ธฐ์กด
- Object์ ๋ฐฐ์ด์์ ๊ฐ์ ๊บผ๋ด๊ธฐ ์ํด์, ๊ฐ์ ํ๋์ฉ ์ง์ ํด์ ๋ณ์์ ์ ์ฅ
- ES6
- Object์์ ๊ฐ์ ๊บผ๋ผ๋๋ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํด์ key์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ๊ฐ์ ๊บผ๋ด์์ ๋ณ์ ์ ์ธ ๊ฐ๋ฅ
- key์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๊ฐ์ ๊บผ๋ผ๋๋ { key ๊ฐ: ๋ณ์ ์ด๋ฆ } ์ ํํ ์ฌ์ฉ
- ๋ฐฐ์ด์์ ์์ฐจ์ ์ผ๋ก ๋ณ์๋ฅผ ๊บผ๋ด์ฌ ์ ์๋ค.
- ์คํ ๊ฒฐ๊ณผ
5. ๋น๋๊ธฐ ์ฝ๋ฉ
- Callback: ์ ํต์ ์ธ JavaScript์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ฝ๋ฉ ๋ฐฉ์
- Promise: callback์ ๋จ์ ์ ๋ณด์ํ ๋น๋๊ธฐ ์ฝ๋ฉ ๋ฐฉ์
- Async-Await: promise์ ๋จ์ ์ ๋ณด์ํ ๋น๋๊ธฐ ์ฝ๋ฉ ๋ฐฉ์
5-1. Callback
db.getUsers((err, users) => {
console.log(users);
});
- getUsers์ ์ธ์๋ก ์ ๋ฌ๋๋ ํจ์๊ฐ getUsers๋ฅผ ์คํํ ๋ ๋ฑ๋ก๋๋ ์ด๋ฒคํธ ํจ์
- ์ด๋ฒคํธ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ ํํ๋ฅผ Callback์ด๋ผ๊ณ ํ๋ค.
- ์ฟผ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ์ค๋ฅ๊ฐ ์๋์ง, ํน์ ์ ์ ๋ชฉ๋ก์ ๊ฒฐ๊ณผ๋ก ๋ฏธ๋ฆฌ ๋ฑ๋ก๋ callback ํจ์ ์คํ
- callbackํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ ์๋ฌ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด callback์ ํ์ค
- callback๋ค์ด ๊ณ์ํด์ ์ฐ๊ฒฐ๋๋ค ๋ณด๋ฉด ์ฝ๋ฐฑ ์ง์ฅ ํ์ ๋ฐ์
5-2. Promise
db.getUsersPromise()
.then((uesrs) => {
return promise1(users);
})
.then(r1 => promise2(r1)
.catch(~~);
- then๊ณผ catch๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ ํจ์์ ์คํ ๊ฒฐ๊ณผ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌ
- Chaining์ ์ฌ์ฉํด ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑ
- Short-hand ํํ ๋ฐฉ๋ฒ์ผ๋ก ๋์ฑ ๊ฐ๊ฒฐํ๊ฒ ์์ฑ
- Return ์๋ต ๊ฐ๋ฅ
- ์ธ์๊ฐ ํ๋์ธ ๊ฒฝ์ฐ ( ) ์๋ต ๊ฐ๋ฅ
- resolve, reject ๋ ๊ฐ์ง ํจ์๋ฅผ ๊ฐ์ง
- Promise.all(): promise ํจ์๋ฅผ ๋์์ ์คํ์ํค๊ณ ๋ฑ๋ก๋ ๋ชจ๋ ํจ์๊ฐ ๋ง๋ฌด๋ฆฌ๋๋ฉด ๊ฒฐ๊ณผ๊ฐ์ ํ๊บผ๋ฒ์ ๋ฐํ
5-3. Async-Await
async function doSomething() {
const r1 = await promise1();
const r2 = await promise2(r1);
const r3 = await promise3(r1, r2);
...
return r3;
}
doSomething().then(r3 => {console.log(r3)});
- promise์ ๋ค๋ฅธ ๋ฌธ๋ฒ
- async ํจ์ ๋ด์์ promise ํจ์์ ๊ฒฐ๊ณผ๋ await์ผ๋ก ๋ฐ์ ์ ์๋ค.
- awaitํ promise ํจ์๊ฐ ์๋ฃ๋ ๋ ๊น์ง ๋ค์ ๋ผ์ธ์ผ๋ก ๋์ด๊ฐ์ง ์๋๋ค.
- async ํจ์์ return์ Promise
- ์ค๋ฅ ์ฒ๋ฆฌ๋ try-catch ๋ฌธ ํ์ฉ
6. ์ด๋ฒคํธ ๋ฃจํ
- ์ด๋ฒคํธ(event)๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ๋ณต๋๋ ๋์(loop)
- ์ฆ, Node.js๊ฐ ๋น๋๊ธฐ-์ด๋ฒคํธ ๋์์ ์ฒ๋ฆฌํ๋ ์ผ๋ จ์ ๋ฐ๋ณต ๋์
- ๋น๋๊ธฐ ์ฝ๋ฉ์ด ์ด๋ค ์์๋ก ์ํ๋๋์ง์ ๋ํด ์ดํดํ ์ ์๋ค.
- JavaScript์ ์ผ๋ฐ์ ์ธ ๋์ ๋ฐฉ์
- ๊ตฌ์ฑ์์
- Call Stack: ์์ฑ๋ ํจ์๋ค์ด ๋ฑ๋ก๋๋ LIFO ์คํ, ์ด๋ฒคํธ ๋ฃจํ๋ ์ฝ์คํ์ด ๋น์ด์์ ๋๊น์ง ์คํ์ ํจ์๋ฅผ ์คํ
- Message Queue: setTimeout๊ฐ์ ์ง์ฐ์คํ ํจ์๋ฅผ ๋ฑ๋กํ๋ FIFO ํ, ์ ํด์ง timing์ด ๋๋๊ณ ์ฝ์คํ์ด ๋น์ด์์ ๊ฒฝ์ฐ ๋ฑ๋ก๋ ํจ์๋ฅผ ์ฝ์คํ์ ์ถ๊ฐ
- Job Queue: Promise์ ๋ฑ๋ก๋ ์ฝ๋ฐฑ์ ๋ฑ๋กํ๋ FIFO ํ, ์์ํจ์๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ์ ์ฝ์คํ์ด ๋น์ด์์ง ์๋๋ผ๋ ์กํ์ ๋ฑ๋ก๋ ์ฝ๋ฐฑ์ ์ฝ์คํ์ ์ถ๊ฐ
- ์ด๋ฒคํธ ๋ฃจํ์ ์์ธํ ๋์ ๊ณผ์ ์ ์ฌ๊ธฐ์ ์ ๋ฆฌํด๋์๋ค.
'elice > WIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[week_06] ์น๊ณผ Express.js | ์น์ ์ดํด, ํ๋ ์์ํฌ, Express.js์ ๊ตฌ์กฐ, ๋์๋ฐฉ์ (0) | 2022.02.14 |
---|---|
[week_06] Node.js ๊ธฐ์ด | NPM์ ์ดํด, NPX, Node.js์ ๋ชจ๋, ES Module (0) | 2022.02.12 |
[week_05] async/await๊ณผ API (0) | 2022.02.09 |
[week_05] ๋น๋๊ธฐ ํต์ ๊ณผ Promise (0) | 2022.02.07 |
[๊ณผ์ ] ์๊ธฐ์๊ฐ ํ์ด์ง ์ ์ (0) | 2022.02.04 |