๐ค ๋น๋๊ธฐ ์ ์ผ๋ก ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ JavaScript๋ก ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น?
API๋ ๋ฌด์์ธ์ง ๊ทธ๋ฆฌ๊ณ ๋น๋๊ธฐ๋ฅผ ๋ณต์ตํ๋ฉฐ fetch API์ ๋ํด ์์๋ณด์.
์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ ๋จ์ด๋ ๊ณ ์ ํ ๊ธฐ๋ฅ์ ๊ฐ์ง ๋ชจ๋ ์ํํธ์จ์ด๋ฅผ ๋ํ๋ด๋ฉฐ, ์ธํฐํ์ด์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ์๋น์ค ๊ณ์ฝ์ด๋ผ๊ณ ํ ์ ์๋ค. ์ด ๊ณ์ฝ์ ์์ฒญ๊ณผ ์๋ต์ ์ฌ์ฉํ์ฌ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ก ํต์ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
์์ ํจ์๊ฐ ์ข
๋ฃ๋์ง ์์์์๋ ํ์ ํจ์๊ฐ ์คํ๋๋ ๋ฐฉ์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ผ ํ๋ค.
์ฑ๊ธ์ฐ๋ ๋๋ก ๋์ํ๋ JS์๊ฒ database์ ๊ทผ์ด๋, ๋คํธ์ํฌ ํต์ ์์
๋ฑ์
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ blocking ๋์ง ์๊ณ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ํด์ค๋ค.
JS๋ ์ฑ๊ธ์ฐ๋ ๋๋ก ํ๋ฒ์ ํ๋์ ํ์คํฌ๋ง ์ฒ๋ฆฌํ๋ค.
์๋ JS์์ง ๋ด์ Call Stack์ ์คํ ์ปจํ
์คํธ๊ฐ ์กด์ฌํ๋ฉด JS์์ง์ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ค.
ํ์ง๋ง, ์ฝ๋ฐฑํจ์๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์คํ ์ปจํ
์คํธ์ ๊ฒฝ์ฐ Call Stack์ด ์๋
๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํด์ฃผ๋ Callback Queue์ ์์ด๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ Event Loop๊ฐ ๊ณ์ํด์ JS ์์ง์ Call Stack๊ณผ ๋ธ๋ผ์ฐ์ ์ Callback Queue๋ฅผ ํ์ธํ๋ฉด์
Call Stack์ด ๋น์ด์๋ค๋ฉด Callback Quere์ ์๋ ์คํ ์ปจํ
์คํธ๋ฅผ Call Stack์ผ๋ก ์ด๋์ํค๊ณ
JS์์ง์ด ์ด๋ฅผ ์คํํ๊ฒ ํด์ค๋ค.
ํจ์ ๋ด๋ถ์ ๋น๋๊ธฐ๋ก ๋์ํ๋ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ๋น๋๊ธฐ ํจ์๋ผ ํ๋ค.
๋๋ฌธ์, ๋ด๋ถ์ ๋น๋๊ธฐ๋ก ๋์ํ๋ ์ฝ๋๋ฅผ ๋น๋๊ธฐ ํจ์์๊ฒ ์ฝ๋ฐฑํด์ผ ํ๋ค.
๐ย ๋น๋๊ธฐ ํจ์๋ ๋ด๋ถ์์ ๋น๋๊ธฐ๋ก ๋์ํ๋ ์ฝ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ค.
ํจ์ ๋ด๋ถ์ ๋น๋๊ธฐ๋ก ๋์ํ๋ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ๋น๋๊ธฐ ํจ์๋ผ ํ๊ณ ,
๋ด๋ถ์ ๋น๋๊ธฐ๋ก ๋์ํ๋ ์ฝ๋๋ ๊ฒฐ๊ณผ๋ฅผ ํจ์์๊ฒ ์ฝ๋ฐฑํด์ค์ผ ํ๋ค.
๋๋ฌธ์ ๋น๋๊ธฐ ํจ์๋ฅผ ์ฝ๋ฐฑํจ์๋ผ๊ณ ๋ ๋งํ๋ค.
๋น๋๊ธฐ ํจ์(์ฝ๋ฐฑํจ์)๋ฅผ ํตํด ๋น๋๊ธฐ ์ ์ผ๋ก ์์ง์ด๋ ์ฝ๋์ ์ฒ๋ฆฌ๋ฅผ ํ๋ฒ๋ง ํ๋ค๋ฉด ๊ด์ฐฎ์ง๋ง,
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ก ๋ฐ์ ๊ฐ์ผ๋ก ๋ ๋ค๋ฅธ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํด์ผ ํ๋ค๋ฉด,
์ฝ๋๋ ๊ณ์ํด์ ์ฝ๋ฐฑ์ ํธ์ถํ๊ฒ ๋์ด ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ณ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๋ค.
์ด๋ฅผ ์ฝ๋ฐฑ ํฌ์ด๋ผ ํ๋ค.
๋น๋๊ธฐ ํจ์(์ฝ๋ฐฑํจ์)์ ์ฝ๋ฐฑ ํฌ์ ๋ณด์ํ๊ณ ์ ๋์
๋ Promise๋ ์์ฑ์ ํจ์๋ค.
Promise ์์ฑ์ ํจ์๋ ๋น๋๊ธฐ ํจ์(์ฝ๋ฐฑํจ์)๋ฅผ resolve์ reject๋ก ์ ๋ฌ ๋ฐ๋๋ค.
์ฌ๊ธฐ์ resolve์ reject๋ ๋น๋๊ธฐ ํจ์(์ฝ๋ฐฑํจ์)๊ฐ ์ฒ๋ฆฌ๋์๋ค๋ ๊ฒ์ด๋ค.
โ Callback Queue๋ก ๋ค์ด๊ฐ์ ๋งํ๋ค.
์ฐ๋ฆฌ๋ ์์ ๋น๋๊ธฐ ํจ์์ ๋ด๋ถ ๋น๋๊ธฐ๋ก ๋์ํ๋ ์ฝ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ค๊ณ ๋ฐฐ์ ๋ค.
Promise๋ก ์ ๋ฌ๋ ๋น๋๊ธฐ ํจ์๋ ์ฝ๋ฐฑ ๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ถ์์ ์ฒ๋ฆฌํด์ผ ํ๋ค.
Promise์์ ์ฒ๋ฆฌ๋ ๋น๋๊ธฐ ํจ์(์ฝ๋ฐฑํจ์)์ ๋ด๋ถ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ๋ฉ์๋๋ก
then, catch, fainally๊ฐ ์กด์ฌํ๋ค.
fetchNumber
.then((num) => num * 2)
.then((num) => num * 3)
.then((num) => {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(num - 1), 1000);
});
})
.then((num) => console.log(num));
// 5
์ด์ฒ๋ผ then์ ์ฌ๋ฌ๋ฒ ๋ฌถ์ด์ ์ฒ๋ฆฌํ๋ ๊ฒ์ย ํ๋ก๋ฏธ์ค ์ฒด์ด๋ ์ด๋ผ ํ๋ค.
๋น๋๊ธฐ ๋คํธ์ํฌ API๋ ๋คํธ์ํฌ ์์ฒญ๊ณผ ์๋ต ์ฒ๋ฆฌ์ ์ฌ์ฉ๋๋ ๋น๋๊ธฐ ๋ฐฉ์์ API
๋ฅผ ๋งํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์น ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์์ ์ฌ์ฉ๋๋ฉฐ, ๋คํธ์ํฌ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ๋ ๊ณผ์ ์์
๋ธ๋กํน ๋์ง ์์ผ๋ฏ๋ก, ๋ค๋ฅธ ์์
์ ์ํํ ์ ์๋ค.
๋น๋๊ธฐ ๋คํธ์ํฌ API ์ค ํ๋๋ก JavaScript์ ๋ด์ฅ๋์ด ์๋ค.
XMLHttpRequest์ ๊ฐ์ ์ด์ ์ ๋คํธ์ํฌ API ๋ณด๋ค ๋ ๊ฐํธํ๊ณ ์ ์ฐํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
๊ฐ์ฅ ์ค์ํ ์ฐจ์ด์ ์ผ๋ก๋ Promise๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค๋ ์ ์ด๋ค.
fetch(url, options)
.then(response => {
// handle response
})
.catch(error => {
// handle error
});
fetch('https://example.com/api/data')
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error(error);
});
์๋ ์์ ์ฝ๋๋ก fetch(URL).then(cp1).then(cp2)๊ฐ ์ด๋ป๊ฒ ์คํ๋๋์ง ์์๋ณด์.
function getData() {
debugger;
fetch("http://localhost:3000/goods")
.then((response) => response.json())
.then((json) => console.log(json));
}
console.log("1")
getData();
console.log("2")
mdn Promise
Promise
๋ ๋ค์ ์ค ํ๋์ ์ํ๋ฅผ ๊ฐ์ง๋๋ค.
- ๋๊ธฐ(pending): ์ดํํ์ง๋, ๊ฑฐ๋ถํ์ง๋ ์์ ์ด๊ธฐ ์ํ.
- ์ดํ(fulfilled): ์ฐ์ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋จ.
- ๊ฑฐ๋ถ(rejected): ์ฐ์ฐ์ด ์คํจํจ.
๋๊ธฐ ์ค์ธ ํ๋ก๋ฏธ์ค๋ ๊ฐ๊ณผ ํจ๊ป ์ดํํ ์๋, ์ด๋ค ์ด์ (์ค๋ฅ)๋ก ์ธํด ๊ฑฐ๋ถ๋ ์๋ ์์ต๋๋ค. ์ดํ์ด๋ ๊ฑฐ๋ถ๋ ๋, ํ๋ก๋ฏธ์ค์ย
then
ย ๋ฉ์๋์ ์ํด ๋๊ธฐ์ด(ํ)์ ์ถ๊ฐ๋ ์ฒ๋ฆฌ๊ธฐ๋ค์ด ํธ์ถ๋ฉ๋๋ค. ์ด๋ฏธ ์ดํํ๊ฑฐ๋ ๊ฑฐ๋ถ๋ ํ๋ก๋ฏธ์ค์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฐ๊ฒฐํด๋ ํธ์ถ๋๋ฏ๋ก, ๋น๋๊ธฐ ์ฐ์ฐ๊ณผ ์ฒ๋ฆฌ๊ธฐ ์ฐ๊ฒฐ ์ฌ์ด์ ๊ฒฝํฉ ์กฐ๊ฑด์ ์์ต๋๋ค.Promise.prototype.then() ๋ฐย Promise.prototype.catch() ๋ฉ์๋์ ๋ฐํ ๊ฐ์
์๋ก์ด ํ๋ก๋ฏธ์ค์ด๋ฏ๋ก ์๋ก ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
๋ง์ดํฌ๋ก ํ ์คํฌ ํ
๋ ์ฐ์ ์ ์ผ๋ก Promise๋ค์ ์ฝ๋ฐฑํจ์๋ค์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์กด์ฌํ๋ ํ์คํฌํ์๋ ๋ณ๊ฐ์ ๊ณต๊ฐ์ด๋ค.
JavaScript Visualized: Promises & Async/Await
์๋ฐ์คํฌ๋ฆฝํธ์ ์ด๋ฒคํธ ๋ฃจํ
๋ง์ดํฌ๋กํ์คํฌ, ๋งคํฌ๋กํ์คํฌ
ํ๋ก๋ฏธ์ค
What really happens when you fetch() ?