โข ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ค๋ฅธ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด(JAVA, C++๋ฑ)์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋น๋๊ธฐ ๋์์ ์ฒ๋ฆฌํ๋ค.
โข ์ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ ํ๋ ๊ฒฝ์ฐ, ๋์์ ๋ํ ์ ํํ ์ดํด๊ฐ ์์ผ๋ฉด ์ฝ๋์ ํ๋ฆ์ ๋ฐ๋ผ๊ฐ๊ธฐ ์ด๋ ต๋ค.
โข ์๋ฐ์คํฌ๋ฆฝํธ ๋ด๋ถ์ ๋น๋๊ธฐ ๋์์ ์ดํดํ๊ธฐ ์ํด์๋ ์ด๋ฒคํธ ๋ฃจํ ๋ฑ์ ๊ฐ๋
์ ์์์ผ๋ง ํ๋ค.
โข ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํ๋์ ๋ฉ์ธ ์ค๋ ๋๋ก ๊ตฌ์ฑ๋๋ค.
โข ๋ฉ์ธ ์ค๋ ๋๋ ์ฝ๋๋ฅผ ์ฝ์ด ํ ์ค์ฉ ์คํํ๋ค.
โข ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ์ ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ํ๋ฉด์ ๊ทธ๋ฆฐ๋ค.
์๋ฐ ์คํฌ๋ฆฝํธ๋ setTimeout์ ์ฒ๋ฆฌํ ๋ setTimeout์ด๋ผ๋ ๋น๋๊ธฐ API๊ฐ ์๋ํด ํจ์๋ฅผ ํน์ ํ(JS์์ง์ด ์๋ ๋ณ๋์ ํ๊ฒฝ)์ ์ ์ฅํ๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฉ์ธ ์ค๋ ๋๋ task queue๋ฅผ ํ์ธํ๋ฉฐ ํจ์๋ฅผ ๊ฐ์ ธ์ ์คํ = ์ฆ ํ๋์ ๋ฉ์ธ ์ค๋ ๋๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ!
๋ฐ๋ฉด ์๋ฐ์ ๊ฒฝ์ฐ, setTimeout์ ๋ง๋๋ฉด ์๋ก์ด ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ (๋ฉํฐ ์ค๋ ๋) ํ์ด๋จธ๊ฐ ์ง๋ ๋๊น์ง ๊ทธ ์ค๋ ๋๋ ๋์ํ์ง ์๊ณ ๊ธฐ๋ค๋ฆฐ๋ค
โข ๋๊ธฐ์ ์ ์ด ํ๋ฆ์ ํ์ฌ ์คํ์ค์ธ ์ฝ๋๊ฐ ์ข
๋ฃ๋๊ธฐ ์ ๊น์ง ๋ค์ ์ค์ ์ฝ๋๋ฅผ ์คํํ์ง ์๋ ๊ฒ์ ์๋ฏธํ๋ค.
โข ๋ถ๊ธฐ๋ฌธ, ๋ฐ๋ณต๋ฌธ, ํจ์ ํธ์ถ ๋ฑ์ด ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ค.
โข ์ฝ๋์ ํ๋ฆ๊ณผ ์ค์ ์ ์ด ํ๋ฆ์ด ๋์ผํ๋ค.
โข ์ฑ๊ธ ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๊ธด ์๊ฐ ์ ์ ํ๋ฉด, ํ๋ก๊ทธ๋จ์ ๋ฉ์ถ๊ฒ ํ๋ค.
// ๋๊ธฐ์ ์ฝ๋์๋ ์ด๋ค ๊ฒ๋ค์ด ์์์ง!
// ์ ์ธ๋ฌธ
let a = 10
// ๋๊ธฐ์ ์คํ
console.log("a : ", a)
// ๋ฐ๋ณต๋ฌธ
function foo(num) {
for (let i = 0; i < 10; ++i) {
console.log(num)
}
}
// ํจ์ ํธ์ถ
foo(num)
//๋ฑ์ด ์๋ค!
๋๊ธฐ์ ์ ์ด์ ๋จ์ : ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ๋ช
์ด๋ผ๋ฉด ๋งค์ฐ ๋นํจ์จ์ , ์ฌ์ฉ์์ ์์ฒญ์ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌ ๋ถ๊ฐ๋ฅ
โข ๋น๋๊ธฐ์ ์ ์ด ํ๋ฆ์ ํ์ฌ ์คํ์ค์ธ ์ฝ๋๊ฐ ์ข
๋ฃ๋๊ธฐ ์ ์ ๋ค์ ๋ผ์ธ์ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
โข ํ๋ก๋ฏธ์ค, ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๋ ํจ์ ๋ฑ์ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ค.
โข ์ฝ๋ ํ๋ฆ๊ณผ ์ค์ ์ ์ด ํ๋ฆ์ด ๋ค๋ฅด๋ค.
โข ๋น๋๊ธฐ ์์
์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ฉ์ธ ์ค๋ ๋๋ ๋ค๋ฅธ ์์
์ ์ฒ๋ฆฌํ๋ค.
let a = 10
setTimeout(function callback() {
console.log('a : ', a)
}, 3000)
console.log('Finished')
//Finished
//a: 10
โข ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
โข ๋์ , ๋น๋๊ธฐ ์ฝ๋๋ ์ ํด์ง 'ํจ์'๋ฅผ ์ ๊ณตํ์ฌ ํ์ฉํ ์ ์๋ค.
โข ์ด ํจ์๋ค์ API(Application Programming Interface)๋ผ ํ๋ค.
โข ๋น๋๊ธฐ API์ ์์๋ก, setTimeout, XMLHttpRequest, fetch ๋ฑ์ Web API๊ฐ ์๋ค.
โข node.js์ ๊ฒฝ์ฐ ํ์ผ ์ฒ๋ฆฌ API, ์ํธํ API ๋ฑ์ ์ ๊ณตํ๋ค.
// ํ์ด๋จธ ๋น๋๊ธฐ ์ฒ๋ฆฌ
setTimeout(() => console.log('ํ์ด๋จธ๋'), 1000)
setInterval(() => console.log('์ธํฐ๋ฒํ์ด๋จธ'), 1000)
// ๋คํธ์ํฌ ์ฒ๋ฆฌ
fetch('https://google.com')
.then(() => console.log('๋คํธ์ํฌ์์ฒญ์ฑ๊ณต.'))
.catch(() => console.log('๋คํธ์ํฌ์์ฒญ์คํจ.'))
=> ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ฝ์คํ์ ์ฝ๊ณ ์ฝ๋๋ฅผ ์คํํจ, ์ฝ์คํ์ ์๋๋ถํฐ ์ฐจ๋ก๋ก ์คํ ์ปจํ
์คํธ๊ฐ ์์ด๊ฒ ๋๋ค, ์๋ฅผ๋ค์ด setTimeout์ WEB API์ ๋ฑ๋ก๋์์ ๋ ๋ช ์ด ๋ค ์ข
๋ฃ๋๋ฉด task queue๋ก ๋ค์ด๊ฐ๋๋ก ์ค์ ๋์ด์๋ค.
โข ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๋ชจ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ์ธ๋ถ์ ์๋ค.
โข ์ด๋ฒคํธ ๋ฃจํ(event loop), ํ์คํฌ ํ(task queue), ์ก ํ(job queue) ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
โข API๋ชจ๋์ ๋น๋๊ธฐ ์์ฒญ์ ์ฒ๋ฆฌ ํ ํ์คํฌํ์ ์ฝ๋ฐฑํจ์๋ฅผ ๋ฃ๋๋ค.
โข ๋ชจ๋ ์ฝ๋๊ฐ ์คํ ๋ ํ ์ฝ ์คํ์ด ๋น์ด์์ผ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง(API ๋ชจ๋ ๋ฑ๋ ๋ง์ฐฌ๊ฐ์ง)์ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ํตํด ํ์คํฌ ํ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฝ์คํ์ ๋ฃ๊ณ ์คํํ๋ค.
request("user-data", (userData) => {
console.log("userData ๋ก๋")
saveUsers(userData)
});
console.log("DOM ๋ณ๊ฒฝ")
console.log("์ ์ ์
๋ ฅ")
request๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํด์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋๋ฌ์ ๋, userData๋ผ๋ ์ฝ๋ฐฑํจ์ task queue์ ๋ฃ์ด์ฃผ๋ ์ญํ ์ ํ๋ค.
โข Promise API๋ ๋น๋๊ธฐ API ์ค ํ๋์ด๋ค.
โข ํ์คํฌ ํ๊ฐ ์๋ ์ก ํ(Job queue, ํน์ microtask queue)๋ฅผ ์ฌ์ฉํ๋ค.
โข ์ก ํ๋ ํ์คํฌ ํ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค.
setTimeout(() => {
console.log("ํ์์์ 1");
}, 0);
Promise.resolve().then(() => console.log("ํ๋ก๋ฏธ์ค1"));
setTimeout(() => {
console.log("ํ์์์ 2");
}, 0);
Promise.resolve().then(() => console.log("ํ๋ก๋ฏธ์ค2"));
//ํ๋ก๋ฏธ์ค1 ํ๋ก๋ฏธ์ค2
//ํ์์์1 ํ์์์2
//ํ๋ก๋ฏธ์ค์ ์ฒ๋ฆฌ๊ฐ ๋ ๋น ๋ฅธ๊ฒ์ ์ ์ ์๋ค
โข ๋น๋๊ธฐ ์์
์ ํํํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด.
โข ๋น๋๊ธฐ ์์
์ ์งํ, ์ฑ๊ณต, ์คํจ ์ํ๋ฅผ ํํํ๋ค.
โข ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์์๋ฅผ ํํํ ์ ์๋ค.
new Promise(callback)์ ์ฌ์ฉํ๊ฑฐ๋ fetch()๊ฐ์ promise๋ฅผ ๋ฐํํ๋ ๋น๋๊ธฐ API๋ฅผ ์ฌ์ฉํ ์ ์๋ค!
pending(์งํ) ์ํ -> settled (์ฑ๊ณต=resolved,fulfilled ํน์ ์คํจ=rejected) ์ํ
โข new Promise(callback)
โข callback ํจ์๋ (resolve, reject) ๋ ์ธ์๋ฅผ ๋ฐ๋๋ค.
โข Promise๊ฐ ์ฑ๊ณตํ์ ๋ resolve๋ฅผ ํธ์ถํ๋ค.
โข Promise๊ฐ ์คํจํ์ ๋ reject๋ฅผ ํธ์ถํ๋ค.
let promise = new Promise((resolve, reject) => {
if (Math.random() < 0.5) {
return reject("์คํจ") //0.5๋ณด๋ค ์์ผ๋ฉด '์คํจ'๋ฐํ
}
resolve(10) //์ฑ๊ณต ์ 10์ ๋ฐํ
})
โข then() ๋ฉ์๋์ ์ฑ๊ณตํ์ ๋ ์คํํ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋๊ธด๋ค.
โข catch() ๋ฉ์๋์ ์คํจํ์ ๋ ์คํํ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋๊ธด๋ค.
โข finally() ๋ฉ์๋๋ ์ฑ๊ณต/์คํจ ์ฌ๋ถ์ ์๊ด์์ด ๋ชจ๋ ์คํํ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋๊ธด๋ค.
โข then(callback1, callback2)๋ก callback1์ ์๋ฆฌ์ ์ฑ๊ณต์ ์ฝ๋ฐฑ, callback2์ ์๋ฆฌ์ ์คํจ์ ์ฝ๋ฐฑ์ ์ธ์๋ก ๋๊ธธ ์ ์๋ค.
(catch์์ด! ์๋ฅผ๋ค๋ฉด .then(function onSuccess(){...},function onFailure(){...})
promise
.then(data => {
console.log("์ฑ๊ณต:", data)
})
.catch(e => {
console.log("์คํจ:", e)
})
.finally(() => {
console.log("promise ์ข
๋ฃ")
})
โข then/catch ๋ฉ์๋๊ฐ ๋ ๋ค๋ฅธ promise๋ฅผ ๋ฆฌํดํ์ฌ, ๋น๋๊ธฐ ์ฝ๋์ ์์๋ฅผ ๋ถ์ฌํ๋ค.
โข ์ด๋ ๊ฒ ๋์ผํ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ ๊ฒ์ ์ฒด์ด๋(chaining) ์ด๋ผ ํ๋ค.
โข ํจ์๋ฅผ ํธ์ถํ ์ฃผ์ฒด๊ฐ ํจ์๋ฅผ ๋๋ธ ๋ค ์๊ธฐ ์์ ์ ๋ฆฌํด(return this๋ฅผ ์๋ตํ ์ํ)ํ๋๋ก ํ์ฌ ๊ตฌํํ๋ค.
promise
.then(data => {
return fetchUser(data) }) //ํ๋ก๋ฏธ์ค๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ฅผ ๋ฐํ
//๊ทธ ๋ค์ then์ด ํธ์ถ๋๊ธฐ ์ ์ promise๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ค =๋น๋๊ธฐ ์ฝ๋์ ์์ ๋ถ์ฌ
.then(user => {
console.log('User : ', user)
})
.catch(e => {
console.log("์คํจ:", e)
})
ํ๋ก๋ฏธ์ค๋ ์ ์ ์ธ ๋ฉ์๋๊ฐ ์กด์ฌํ๋ค
new Promise๊ฐ ์๋๋ผ Promise๋ผ๋ ํด๋์ค ๋ช
์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ์ ์ ํจ์
โข Promise.resolve ํจ์๋ ์ฑ๊ณตํ Promise๋ฅผ ๋ฐ๋ก ๋ฐํํ๋ค.
โข Promise.reject ํจ์๋ ์คํจํ Promise๋ฅผ ๋ฐ๋ก ๋ฐํํ๋ค.
โข ์ธ์์ ์ผ๋ก Promise ๋ฉ์๋ ์ฒด์ธ์ ๋ง๋ค ์ ์๋ค. promise๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ํจ์๋ฅผ ํธ์ถํ ํ์์์ด ๋ฐ๋ก ์ฑ๊ณต,์คํจ ํ๋ก๋ฏธ์ค๋ฅผ ํธ์ถํ ์ ์๋ ๊ฒ!
โข ๋น๋๊ธฐ ์ฝ๋๋ก ์งํํด์ผ ํ๋ ์ํฉ ๋ฑ์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
Promise
.resolve(10)
.then(console.log)
Promise
.reject("Error")
.catch(console.log)
์ด ๋ํ ์ ์ ์ธ ๋ฉ์๋ : ๋ชจ๋ ์ฑ๊ณตํ๊ฑฐ๋ ํ๋๋ผ๋ ์คํจํ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค
โข Promise.all์ Promise์ ๋ฐฐ์ด์ ๋ฐ์ ๋ชจ๋ ์ฑ๊ณต ์ ๊ฐ Promise์ resolved ๊ฐ์ ๋ฐฐ์ด๋ก ๋ฐํํ๋ค.
โข ํ๋์ Promise๋ผ๋ ์คํจํ ์, ๊ฐ์ ๋จผ์ ์คํจํ Promise์ ์คํจ ์ด์ ๋ฅผ ๋ฐํํ๋ค.
Promise.all([
promise1,
promise2,
promise3
])
.then(values => {
console.log("๋ชจ๋์ฑ๊ณต:", values)
})
.catch(e => {
console.log("ํ๋๋ผ๋์คํจ:", e)
})
โข Promise๋ฅผ ํ์ฉํ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ๋ ๋ฌธ๋ฒ.
โข async/await ๋ฌธ๋ฒ์ผ๋ก ๋น๋๊ธฐ ์ฝ๋๋ฅผ '๋๊ธฐ ์ฝ๋'์ฒ๋ผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๋ค.
โข async ํจ์๊ณผ await ํค์๋๋ฅผ ์ด์ฉํ๋ค.
โข await ํค์๋๋ ๋ฐ๋์ async ํจ์ ์์์๋ง ์ฌ์ฉํด์ผ ํ๋ค.
โข async๋ก ์ ์ธ๋ ํจ์๋ ๋ฐ๋์ Promise๋ฅผ ๋ฆฌํดํ๋ค.
โข async ํจ์๋ function ํค์๋ ์์ async๋ฅผ ๋ถ์ฌ ๋ง๋ ๋ค.
โข async ํจ์ ๋ด๋ถ์์ await ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
โข fetchData, fetchUser๋ Promise๋ฅผ ๋ฆฌํดํ๋ ํจ์์ด๋ค.
//์๋ฅผ๋ค๋ฉด ์ด๋ ๊ฒ..
function fetchData(){
return new Promise
}
//fetchData()
// .then() //then์์ data๋ฅผ ๋ฐ์ ์ ์๋ค
// .catch()
async function asyncFunc() {
let data = await fetchData()
let user = await fetchUser(data)
return user
}
โข await ํค์๋๋, then ๋ฉ์๋ ์ฒด์ธ์ ์ฐ๊ฒฐํ ๊ฒ์ฒ๋ผ ์์๋๋ก ๋์ํ๋ค.
โข ๋น๋๊ธฐ ์ฝ๋์ ์ฝ๊ฒ ์์๋ฅผ ๋ถ์ฌํ๋ค.
async function asyncFunc() {
let data1 = await fetchData1()
let data2 = await fetchData2(data1) //๋ง์ฝ ์ด๊ฒ promise๋ฅผ ๋ฆฌํดํ๊ฒ ๋๋ค๋ฉด ๋ค์ await๋ก ๊ฐ๊ธฐ ์ ์ resolve๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค, promise์ ๊ฐ๋ค
let data3 = await fetchData3(data2)
return data3
}
function promiseFunc() {
return fetchData1()
.then(fetchData2)
.then(fetchData3)
}
โข Promise๋ฅผ ๋ฆฌํดํ๋ ํจ์์ ๊ฒฝ์ฐ, ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด catch ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ค.
โข catch ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด async ํจ์์์ try-catch ๊ตฌ๋ฌธ์ ์ด์ฉํ์ฌ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ค.
function fetchData1() {
return request()
.then((response) => response.requestData)
.catch(error => {
// error ๋ฐ์
})
}
โข try-catch ๊ตฌ๋ฌธ์ผ๋ก async/await ํํ ๋น ๋๊ธฐ ์ฝ๋ ์๋ฌ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
โข catch ์ ์ e๋, Promise์ catch ๋ฉ์๋๊ฐ ๋ฐ๋ ๋ฐํ ๊ฐ๊ณผ ๋์ผํ๋ค.
async function asyncFunc() {
try {
let data1 = await fetchData1()
return fetchData2(data1)
} catch (e) {
console.log("์คํจ:", e)
}
}
๋ค์๊ณผ ๊ฐ์ด ๋น๋๊ธฐ๋ก ์๋๋๋ ํจ์๊ฐ ์์ต๋๋ค.
์ด ๋น๋๊ธฐ ํจ์๋ 2์ด ๋ค์ Elice๋ผ๋ ์ด๋ฆ์ ์ธ์๋ก ๋ฐ์ ์ฝ๋ฐฑํจ์์ ์ธ์๋ก ๋๊ฒจ์ค๋๋ค.
function getName(cb) {
setTimeout(() => {
cb("Elice");
}, 2000);
}
์์ ํจ์๋ฅผ ์คํํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด getName ํจ์์ ์ฝ๋ฐฑํจ์๋ฅผ ๋ฃ์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
getName((name) => {
console.log(name);
})
// 2์ด ํ Elice
๋ง์ฝ getName ํจ์๋ฅผ ์ด์ฉํด์ Elice๋ผ๋ ์ด๋ฆ์ 3๋ฒ ์ถ๋ ฅํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์?
๋ค์๊ณผ ๊ฐ์ด getName ํจ์๋ฅผ ์ ์ฐจ์ ์ผ๋ก ์คํ์ํค๋ฉด 2์ด ๋ค์ Elice๋ผ๋ ์ด๋ฆ์ด ๋์ต๋๋ค.
getName((name) => {
console.log(name);
})
getName((name) => {
console.log(name);
})
getName((name) => {
console.log(name);
})
// 2์ด ํ
// Elice
// Elice
// Elice
ํ์ง๋ง ์์ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋ฐฑํจ์๋ฅผ ํธ์ถํ๋ฉด ๊ฐ ํจ์์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ๋ค์ด ์ด๋ฆ, ๋์ด, ์ฃผ์๊ฐ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์ ธ์์ผ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
function getName(cb) {
setTimeout(() => {
cb("Elice");
}, 2000);
}
function getAge(cb) {
setTimeout(() => {
cb(6);
}, 2000);
}
function getAddress(cb) {
setTimeout(() => {
cb("Seoul");
}, 2000);
}
ํด๋น ์ ๋ณด ์ถ๋ ฅํ๊ณ ์ ํฉ๋๋ค. ํ์ง๋ง console.log๋ฅผ ํ ๋ฒ๋ง ์ฌ์ฉํด์ผํฉ๋๋ค. ์ด๋ป๊ฒ ํด์ผํ ๊น์?
๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด์ง ์๊ณ ์ง์ ํ๋ฒ ์๋ํด๋ณด์ธ์.
getName((name) => {
getAge((age) => {
getAddress((address) => {
console.log(name, age, address)
})
})
})
์์ ์ฝ๋์ฒ๋ผ ์ฝ๋ฐฑํจ์ ์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ๋ณตํ์ฌ ํธ์ถํด์ผ name, age, address๋ฅผ ํ๊บผ๋ฒ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋น๋๊ธฐ ํจ์๊ฐ 3๊ฐ ์ฐ์ด๊ณ , ๊ฐ 2์ด์ฉ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ 6์ด ๋ค์ Elice 6 Seoul์ด๋ผ๋ log๊ฐ ๋์ค๊ฒ ๋ ๊ฒ๋๋ค.
๋ฐ๋ก ์ด๊ฒ์ ์ฝ๋ฐฑ ์ง์ฅ์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค. ๋น๋๊ธฐ ํจ์๋ฅผ 3๊ฐ๋ง ์ผ์ ๋ฟ์ธ๋ฐ๋,
์ฝ๋๊ฐ ์ ๋ง ๋ณต์กํด์ก์ต๋๋ค. ๋น๋๊ธฐ ํจ์๊ฐ ๋ ๋ง๋ค๋ฉด ๊ด๋ฆฌํ๊ธฐ ๋ ํ๋ค๊ฒ ์ฃ ?
์ ์ด๋ฒ์๋ Promise๋ฅผ ์ด์ฉํ์ฌ ์ฝ๋ฐฑ ์ง์ฅ์ ๋ณด๊ธฐ ์ข๊ฒ ๋ฐ๊พธ์ด ๋ด
์๋ค.
์์ ์ฌ์ฉํ ๋น๋๊ธฐ ํจ์์ธ getName, getAge, getAddress๋ฅผ ๊ฐ์ ธ์ค๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Promise ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํด๋ณด๊ฒ ์ต๋๋ค.
function getName() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("Elice");
}, 2000);
})
}
function getAge() {
return new Promise((resolve) => {
setTimeout(() => {
resolve(6);
}, 2000);
})
}
function getAddress() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("Seoul");
}, 2000);
})
}
๊ฐ ํจ์๋ Promise ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Promise ๊ฐ์ฒด๋ ํญ์ 2์ด ํ์ resolve ๋์ด ์ด๋ฆ, ๋์ด, ์ฃผ์์ ๋ํ ์ ๋ณด๋ฅผ ์ฃผ๋๋ก ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ด ํธ์ถํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
getName().then((res) => {
console.log(res);
})
getAge().then((res) => {
console.log(res);
})
getAddress().then((res) => {
console.log(res);
})
ํ์ง๋ง ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ์ ๋ณด๋ฅผ ํ๋์ ํจ์์์ ์ ์ดํ๊ธฐ ํ๋ค๊ฒ ์ฃ ?
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
Promise
.all([getName(), getAge(), getAddress()])
.then((res) => {
const [name, age, address] = res;
console.log(name, age, address)
})
Promise.all์ ์ฒซ๋ฒ์งธ ์ธ์์ ๋ฐฐ์ด์ ๋ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฐฐ์ด์ ์์๋ ๋ชจ๋ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด์
๋๋ค.
getName, getAge, getAddress ํจ์๋ ๋ชจ๋ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ Promise.all์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ, Promise.all์ ๋ณ๋ ฌ์ ์ผ๋ก ๋ฐฐ์ด์ ์์์ ์๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋์์ ์คํ์ํต๋๋ค. ๋ฐ๋ผ์ ๊ฒฐ๊ณผ์ ์ผ๋ก 2์ด ํ์ Elice 6 Seoul์ ์ถ๋ ฅํ ์ ์์ต๋๋ค. ์ฆ, ๋์์ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์๋ค์ ์คํํ ์ ์๋ ๊ฒ์
๋๋ค. ์ฝ๋ฐฑํจ์๋ก๋ ํ ์ ์๋ ์ผ์
๋๋ค.
ํ๋ก๋ฏธ์ค๋ฅผ ๋ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฆ์์คํ ํจ์ ํํ์ async ํ์ดํ ํจ์๋ฅผ ์ด์ฉํด ์์ฑํ ์ ์์ต๋๋ค. await ํค์๋์์ ํ๋ก๋ฏธ์ค๊ฐ resolve ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ๋ค์ ์์๋ก ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ 6์ด ํ์ Elice 6 Seoul์ด ์ถ๋ ฅ๋ฉ๋๋ค.
(async () => {
const name = await getName();
const age = await getAge();
const address = await getAddress();
console.log(name, age, address);
})();
Promise์ async/await๋ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ ์ํฉ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์
๋ ๋ฐฉ๋ฒ ๋ชจ๋ ์ ์๊ณ ์์ด์ผํฉ๋๋ค. ๋ฉ์๋ ์ฒด์ด๋์ด ๋ง์ด ์ฌ์ฉ๋๋ ์ฝ๋์์๋ Promise๊ฐ ์ฝ๋์ ์ผ๊ด์ฑ์ ์ง์ผ์ ๋ ๊น๋ํ๊ฒ ๋ณด์ผ ์ ์๊ณ , ๊ฐ๋ณ ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ ๋ฐ์์ค๋ ๊ฒฝ์ฐ์๋ asyne/await์ด ํจ๊ณผ์ ์
๋๋ค.
โข Web์์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ํต์ ํ๋ ๋ฐฉ๋ฒ์ ์ ํ ๊ฒ.
โข ํด๋ผ์ด์ธํธ๋ ์น ๋ธ๋ผ์ฐ์ ๋ฑ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๋ ๋์.
โข ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ๊น์ง ๋์ํ์ง ์์.
โข ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์๋ ๋ฌด์ํ ๋ง์ ์์๊ฐ ์กด์ฌ.
โข HTTP๋ ์ด๋ฐ ์กด์ฌ๋ค ์ฌ์ด์ ํต์ ๋ฐฉ๋ฒ์ ๊ท์ .
โข ์๋ฒ ์ฃผ์, ์์ฒญ ๋ฉ์๋, ์ํ ์ฝ๋, target path, ํค๋ ์ ๋ณด, ๋ฐ๋ ์ ๋ณด ๋ฑ์ด ํฌํจ.
โข ์์ฒญ ๋ฉ์์ง, ์๋ต ๋ฉ์์ง์ ๋ชจ์์ด ๋ค๋ฆ.
โข HTTP/1.1 ๋ฉ์์ง๋ ์ฌ๋์ด ์ฝ์ ์ ์์.
โข HTTP ๋ฉ์์ง์ ํค๋์๋ ์ฝํ
์ธ ๊ด๋ จ ์ ๋ณด, ์ธ์ฆ ๊ด๋ จ ์ ๋ณด, ์ฟ ํค ์ ๋ณด, ์บ์ ๊ด๋ จ ์ ๋ณด ๋ฑ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ํต์ ์ ํ์ํ ์ ๋ณด๋ฅผ ๋ด๋๋ค.
โข ํด๋ผ์ด์ธํธ ์์ฒญ์, ์๋ฒ ์๋ต์ ๋ชจ๋ ํค๋์ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค.
โข HTTP ์์ฒญ ์, ํด๋ผ์ด์ธํธ๋ ์์ฒญ์ ๊ฒฐ๊ณผ์ ๋ํ ์ํ ์ ๋ณด๋ฅผ ์ป๋๋ค.
โข 200, 400, 500 ๋ฑ ์ซ์ ์ฝ๋์, OK, NOT FOUND ๋ฑ์ ํ
์คํธ๋ก ์ด๋ฃจ์ด์ง.
โข ์ฝ๋๋ฅผ ์ด์ฉํด ๊ฐ ๊ฒฐ๊ณผ์ ํด๋นํ๋ ํ์๋ฅผ ํ ์ ์์.
โข HTTP์์, ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
โข ์์ฒญ์์์ฒญ๋ฉ์๋๋กํน์ ์์ฒญ์๋ํ๋์์์ ์ํ๋ค.
โข GET, POST, PUT, PATCH, DELETE, OPTIONS, CONNECT, TRACE ๋ฑ์ด ๊ท์ ๋จ.
โข API(Application Programming Interface)๋ ์ฌ์ฉ์๊ฐ ํน์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ์ ๊ณตํ๋ ํจ์๋ฅผ ์๋ฏธํ๋ค.
โข REST API๋ HTTP์ ์์ฒญ ๋ฉ์๋์ ์ํ๋ ์๋ฒ API์ ํด๋ผ์ด์ธํธ ๊ฐ ํต์ ์ ๊ตฌ์กฐ๊ฐ ์ง์ผ์ผ ํ ์ข์ ๋ฐฉ๋ฒ์ ๋ช
์ํ ๊ฒ์ด๋ค.
โข ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ผ๋ก๋ ์์ฒญ ๋ฉ์๋์ ์๋ฏธ, URI ์ค๊ณ, ํด๋ผ์ด์ธํธ์ ์ํ์ ๋ํ ๋์ ๋ฑ์ ์ ์ํ๋ค.
โข GET - ๋ฆฌ์์ค ์ ๋ณด๋ฅผ ์ป์.
โข POST - ๋ฆฌ์์ค๋ฅผ ์์ฑ.
โข PUT - ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ฑฐ๋ ์
๋ฐ์ดํธ.
โข DELETE - ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐ.
โข ๊ธฐ์กด XMLHTTPRequest๋ฅผ ๋์ฒดํ๋ HTTP ์์ฒญ API.
โข ES6์ ์ถ๊ฐ๋ Promise๋ฅผ ๋ฆฌํดํ๋๋ก ์ ์๋จ.
โข ๋คํธ์ํฌ ์์ฒญ ์ฑ๊ณต ์, Promise๋ Response ๊ฐ์ฒด๋ฅผ resolve ํ๋ค.
โข ๋คํธ์ํฌ ์์ฒญ ์คํจ ์, Promise๋ ์๋ฌ๋ฅผ reject ํ๋ค.
let result = fetch(serverURL)
result
.then(response => {
if (response.ok) {
// ์์ฒญ์ฑ๊ณต.
}
})
.catch(error => {
// ์์ฒญ์คํจ.
})
โข Response ๊ฐ์ฒด๋ ๊ฒฐ๊ณผ์ ๋ํ ๋ค์ํ ์ ๋ณด๋ฅผ ๋ด๋๋ค.
โข response.ok๋ HTTP Status code๊ฐ 200-299 ์ฌ์ด๋ฉด true, ๊ทธ ์ธ false์ด๋ค.
โข response.status๋ HTTP status code๋ฅผ ๋ด๋๋ค.
โข response.url์ ์์ฒญํ URL ์ ๋ณด๋ฅผ ๋ด๋๋ค.
fetch(serverURL)
.then(response => {
response.ok
response.status
response.statusText
response.url
response.bodyUsed
})
โข response.headers๋ก Response ๊ฐ์ฒด์ ํค๋ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
fetch(serverURL)
.then(resp => {
for (let [k, v] of resp.headers) {
console.log(k, v)
}
})
โข response.json() ๋ฉ์๋๋ ์ป์ด์จ body ์ ๋ณด๋ฅผ json์ผ๋ก ๋ง๋๋ Promise๋ฅผ ๋ฐํํ๋ค.
โข Promise๊ฐ resolve ๋๋ฉด ์ป์ด์จ body ์ ๋ณด๋ฅผ ์ฝ๋๋ค.
โข response.text(), response.blob(), response.formData() ๋ฑ์ ๋ฉ์๋๋ก ๋ค๋ฅธ ํํ์ ๋ฐ๋๋ฅผ ์ฝ๋๋ค.
fetch(serverURL)
.then(response => {
return response.json()
})
.then(json => {
console.log('body : ',json)
})
โข fetch(url, options) ๋ก, fetch ๋ฉ์๋ ์ต์
์ ๋ฃ๋๋ค.
โข method ํ๋๋ก ์ฌ๋ฌ ์์ฒญ ๋ฉ์๋๋ฅผ ํ์ฉํ๋ค.
โข headers, body ํ๋๋ฅผ ํ์ฉํด ์๋ฒ์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ๋ณด๋ธ๋ค.
fetch(serverURL, {
method: 'post',
headers: {
'Content-Type':
'application/json;charset=utf-8',
Authentication: 'mysecret'
},
body: JSON.stringify(formData)
})
.then(response => {
return response.json()
})
.then(json => {
console.log('POST์์ฒญ๊ฒฐ๊ณผ:', json)
})