[ํฌ์ค์ฝ X ์ฝ๋ฉ์จ ํ์คํ ์น๊ฐ๋ฐ์ ๋ถํธ์บ ํ 7๊ธฐ] 4์ฃผ์ฐจ ํ๊ณ ๋ก ch. 1 Node.js, ๋น๋๊ธฐ ์ฒ๋ฆฌ, ๋ถํด ํ ๋น, ...์ฐ์ฐ์, rest
[ํฌ์ค์ฝ X ์ฝ๋ฉ์จ ํ์คํ ์น๊ฐ๋ฐ์ ๋ถํธ์บ ํ 7๊ธฐ]
4์ฃผ์ฐจ ํ๊ณ ๋ก
์์ธ ๊ธฐ์์ฌ์ ์ ์ฃผํ ๋ ์ด ์๊ทธ์ ๊ฐ์๋ฐ
๋ฒํฐ๊ณ ๋ฒํฐ๋ค๋ณด๋
๋ฒ์จ 4์ฃผ์งธ ํ๊ณ ๋ก์ ๋๋ค!!
์์ง 8์ฃผ๊ฐ ๋ ๋จ์์ง๋ง..
์ธ์์ ~ ๋ฒํฐ๋ ๊ฑฐ์ผ~~
8์ฃผ ๋ค์ ์ด ๊ธ์ ๋ค์๋ณธ๋ค๋ฉด
์ฐธ์ผ๋ก ๋ฟ๋ฏ ํ๊ฒ ์ง ?
์์์ ์งํ์ ~
๊ทธ๋ ๋ค๋ฉด ๋ณธ๊ฒฉ์ ์ธ
์์ ํ๊ณ ๋ก!
์ด๋ฒ ์ฃผ์ Node.js ๋ฅผ ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ํ๋ค
์์๋ถํฐ ๋จธ๋ฆฌ๊ฐ ์ด์ง ์ํ~
ํด..
๋ ํ๋ฒ ๋ฒํ จ๋ณด์~~
Node.js๋?
ํน์ง 1. javascript์ธ์ด๋ฅผ ์ฌ์ฉํ๋ค.
ํน์ง 2. Single Thread
ํ๋ก์ธ์ค
- ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ
- ์ด์์ฒด์ ์์ ํ ๋นํ๋ ์์ ๋จ์
Thread(์ค๋ ๋)
- ํ๋ก์ธ์ค ๋ด์์ ์คํ๋๋ ํ๋ฆ์ ๋จ์
- ํ๋์ ํ๋ก์ธ์ค์๋ n๊ฐ์ ์ค๋ ๋๊ฐ ์กด์ฌํ๋ฉฐ ๋์์ ์๋ํ ์ ์๋ค.
-> ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ฉด
ํ๋ก๊ทธ๋จ์ด ์์ ์ค๋จ ๋จ
ํน์ง3. Non - Blocking I/O
๋๊ธฐ (Synchronous)
- ๋ฐ์ดํฐ ์์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ ํ์๋ฆฌ์์ ๋์์ ์ผ์ด๋๋ ๊ฒ
- ํ ์์ฒญ์ ์๋ฒ์ ์๋ต์ด ์ด๋ฃจ์ด์ง ๋๊น์ง ๊ณ์ ๋๊ธฐ
๋น๋๊ธฐ(Asynchronous)
๋์์ ์ผ์ด๋์ง ์๋ ๊ฒ
- ์์ฒญํ ํ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ํ๋์ ํจ
I/O์์ : ํ์ผ ์์คํ ์ ๊ทผ (์ฝ๊ธฐ, ์ฐ๊ธฐ, ๋ง๋ค๊ธฐ ๋ฑ),
๋คํธ์ํฌ ์์ฒญ
Node.js ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชจ๋ i/o๋ฉ์๋๋ฅผ
๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ ๊ณตํ๋ค.
ํน์ง 4. Event - driven
- Event - Driven :์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ๋ฏธ๋ฆฌ ์ง์ ํด๋ ์์ ์ ์ํ
ex. ํด๋ฆญ, ๋คํธ์ํฌ ์์ฒญ, ํ์ด๋จธ ๋ฑ
- ์ด๋ฒคํธ ๋ฆฌ์ค๋
: ์ด๋ฒคํธ ๋ฑ๋ก ํจ์
-์ฝ๋ฐฑ ํจ์
: ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์คํ๋๋ ํจ์
๋ชจ๋(Module)
- ํน์ ํ ๊ธฐ๋ฅ์ ํ๋ ํจ์๋ ๋ณ์๋ค์ ์งํฉ
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋ ์กฐ๊ฐ
์ฅ์ :
์ฝ๋ ์ถ์ํ, ์ฝ๋ ์บก์ํ,
์ฝ๋ ์ฌ์ฌ์ฉ, ์์กด์ฑ ๊ด๋ฆฌ
๋ชจ๋ ๋ง๋ค๊ธฐ
1. ํ๋์ ๋ชจ๋ ํ์ผ์ ์ฌ๋ฌ๊ฐ ๋ง๋ค๊ธฐ
const a="a๋ณ์";
const b="b๋ณ์";
module.exports={
a,
b
};
2. ํ๋์ ๋ชจ๋ ํ์ผ์ ํ๋ ๋ง๋ค๊ธฐ
function connect() {
return a+b;
}
module.exports=connect;
๋น๋๊ธฐ ์ฒ๋ฆฌ
setTimeout()
setTimeout(code, delay);
// delay๋์ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ code ํจ์๋ฅผ ์คํ
์ฝ๋ฐฑ ์ง์ฅ ์ ๋ฆฌํ๊ธฐ
Promise
- ๋น๋๊ธฐ ํจ์๋ฅผ ๋๊ธฐ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๊ฐ์ฒด
- ์ฑ๊ณต๊ณผ ์คํจ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๋ฐํ
- ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋ ์ดํ์
๋ค์ ์์ ์ ์ฐ๊ฒฐ์์ผ ์งํํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง
promise ์ฌ์ฉ๋ฒ
function promise1(flag){
return new Promise(function(resolve, reject){
if(flag){
resolve( `promise์ํ๋ fullfilled! tnen์ผ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค \n ์ด๋์ flag๊ฐ ${flag}์
๋๋ค. `)
}else{
reject(`promise์ํ๋ rejected! catch๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.\n ์ด๋์ flag๋ ${flag}์
๋๋ค.`)
}
})
}
- resolve(value) : ์์ ์ด ์ฑ๊ณตํ ๊ฒฝ์ฐ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ value์ ํจ๊ป ํธ์ถ
- reject(error) : ์๋ฌ(rejected) ๋ฐ์ ์ ์๋ฌ ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ error์ ํจ๊ป ํธ์ถ
- resolve( ) : then ๋ฉ์๋ ์คํ
-reject( ) : catch ๋ฉ์๋ ์คํ
function goMart(){
console.log('๋งํธ์ ๊ฐ์ ์ด๋ค ์๋ฃ๋ฅผ ์ด์ง ๊ณ ๋ฏผํ๋ค.');
}
function pickDrink(){
return new Promise(function(resolve, reject){
setTimeout(function(){
console.log('๊ณ ๋ฏผ ๋!!');
product ='์ ๋ก ์ฝ๋ผ';
price = 2000;
resolve();
}, 3000);
})
}
let product;
let price;
goMart();
pickDrink().then(function (){
console.log(`์ํ๋ช
: ${product}, ๊ฐ๊ฒฉ: ${price}`);
});
Promise ์ฒด์ด๋ ์ฌ์ฉ ์ํ ๊ฒฝ์ฐ
function add(n1, n2, cb){
setTimeout(function(){
let result = n1 + n2;
cb(result);
}, 1000);
}
function mul(n, cb){
setTimeout(function(){
let result = n * 2;
cb(result);
}, 700);
}
function sub(n, cb){
setTimeout(function(){
let result = n - 1;
cb(result);
}, 500);
}
add(4, 3, function(x){
console.log('1: ', x);
mul(x, function(y){
console.log('2: ', y);
sub(y, function(z){
console.log('2: ', z);
});
});
});
-> ์ฝ๋ฐฑ ํจ์ ์ฌ์ฉ ์, ์ฝ๋ฐฑ ์ง์ฅ์ด ์๊น
Promise ์ฒด์ด๋ ์ฌ์ฉํ ๊ฒฝ์ฐ
function add(n1, n2){
return new Promise(function(resolve, reject){
setTimeout(function(){
let result = n1+ n2;
resolve(result);
}, 1000);
});
}
function mul(n){
return new Promise(function(resolve, reject){
setTimeout(function(){
let result = n * 2;
resolve(result);
}, 700);
});
}
function sub(n){
return new Promise(function(resolve, reject){
setTimeout(function(){
let result = n - 1;
// resolve(result);
reject(new Error('์๋์ ์ผ๋ก ์๋ฌ๋ฅผ ์ผ์ผ์ผ ๋ดค์!'));
}, 500);
});
}
add(4, 3)
.then(function(result){
console.log('1: ', result);
return mul(result);
})
.then(function(result){
console.log('2: ', result);
return sub(result);
})
.then(function(result){
console.log('3: ', result);
})
.catch(function(err){
console.log('์คํจ!');
console.log(err);
});
Promise ์ฒด์ด๋ ์ฌ์ฉ ์
์ฅ์ 1.
then ๋ฉ์๋ ์ฐ์ ์ฌ์ฉ -> ์์ฐจ์ ์ธ ์์ ์ด ๊ฐ๋ฅํ๋ค
์ฝ๋ฐฑ ์ง์ฅ์์ ํ์ถ ๊ฐ๋ฅํ๋ค.
์ฅ์ 2.
์์ธ์ฒ๋ฆฌ ๊ฐํธ
๋ง์ง๋ง catch ๊ตฌ๋ฌธ์์ ํ ๋ฒ์ ์์ธ ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค
Promise -> async / await
ํ๋ก๋ฏธ์ค ๊ธฐ๋ฐ ์ฝ๋๋ฅผ ์ข ๋ ์ฐ๊ธฐ ์ฝ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ํ๊ธฐ ์ํด ๋ฑ์ฅ
๋น๋๊ธฐ ์ฒ๋ฆฌ ํจํด ์ค ๊ฐ์ฅ ์ต๊ทผ์ ๋์จ ๋ฌธ๋ฒ
๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด
์์๊ฐ ์ค์ํ๋ค!
//๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด
//ํน์ง : ๊ตฌ์กฐ ๋ถํด ๋น์ ์์๊ฐ ์ค์ !
const lists = ["apple", "grape"];
console.log(lists[0]);
[item1, item2, item3 = "peach"] = lists;
console.log(item1, item2, item3);
function test() {
return ["one", "two", "three"];
}
const [one, two, three, four] = ["one", "two", "three"];
console.log(one, two, three, four);
//swap
let a = 10;
let b = 20;
console.log(a, b);
[a, b] = [b, a];
console.log(a, b);
๊ฒฐ๊ณผ>
๊ฐ์ฒด ๊ตฌ์กฐ ๋ถํด
-> ํค ๊ฐ์ด ์ค์ํ๋ค!
// ๊ฐ์ฒด ๊ตฌ์กฐ ๋ถํด
// ํน์ง : ํค ๊ฐ์ด ์ค์ํ๋ค!
const obj = {
key1: "one",
key2: "two",
};
console.log(obj.key1);
console.log(obj["key1"]);
const { key1: newKey1, key2, key3 = "three" } = obj;
obj.key3 = "three";
console.log(obj);
const { key2: newKey2, key1, obj3 = "three" } = obj;
console.log(newKey2, key1, obj3);
๊ฒฐ๊ณผ>
... ์ฐ์ฐ์
...spread ๋ฌธ๋ฒ์ด๋?
const a = [1, 2, 3];
const b = [4, 5];
const spread = [...a, ...b];
console.log(spread);
const c = [..."Hello"];
console.log(c);
๊ฒฐ๊ณผ>
Rest ํ๋ผ๋ฏธํฐ
Restํ๋ผ๋ฏธํฐ๋ ๋งค๊ฐ๋ณ์ ์ด๋ฆ ์์ ์ธ๊ฐ์ ์ (...) ์ ๋ถ์ฌ์
์ ์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์๋ฏธํ๋ค.
Restํ๋ผ๋ฏธํฐ๋ ํจ์์ ์ ๋ฌ ๋ ์ธ์๋ค์ ๋ชฉ๋ก์
๋ฐฐ์ด๋ก ์ ๋ฌ ๋ฐ๋๋ค.
const values = [10, 20, 30];
function get(a, ...rest) {
console.log(rest); //[20, 30]
}
get(...values);
Rest ํ๋ผ๋ฏธํฐ๋ ์ด๋ฆ ๊ทธ๋๋ก
๋จผ์ ์ ์ธ๋ ํ๋ผ๋ฏธํฐ์ ํ ๋น ๋ ์ธ์๋ฅผ ์ ์ธํ
๋๋จธ์ง ์ธ์๋ค์ด ๋ชจ๋ ๋ฐฐ์ด๋ฐ ๋ด๊ฒจ ํ ๋น๋๋ค.
๋ฐ๋ผ์ Rest ํ๋ผ๋ฏธํฐ๋ ๋ฐ๋์ ๋ง์ง๋ง ํ๋ผ๋ฏธํฐ ์ด์ด์ผ ํ๋ค.