# ๐ค๐ผ ํ๋ก๋ฏธ์ค - ๋์ ๋์ ์ฝ์
# ๐ง๐ผโ๐ ํ๋ก๋ฏธ์ค๋ฅผ ์์์ผ ํ๋ ์ด์
โ์น์๋ฒ์ ํต์ ํ๋ ๋ก์ง์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด โ์ผ์ ์๊ฐ ํ์ ๋์ํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด โ์๋ฒ์ ์์ฒญํ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด์ ์ฌ์ฉ์์๊ฒ ๋ ๋์ ๊ฒฝํ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด โ์นํ์ด์ง๋ฅผ ์น์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด
# ๐ค๐ผ ํ๋ก๋ฏธ์ค
์์ ์ด์ผ๊ธฐ์ธ ์๋ฒ์ ํต์ ์ ์ํ ๊ด๊ณ์ ์ฝ์์ ์์๋ดค์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ํ๋ก ํธ์๋์์ ์ด ํต์ ์ ์ด๋ป๊ฒ ๋ค๋ฃจ๋์ง๋ฅผ ์์์ผ ํ ํ
๋ฐ์. ํต์ ์ด๋ ๊ฒ์ ์คํ ์๊ฐ์ด ์ ํํ ์ผ๋ง๋ ๊ฑธ๋ฆด์ง ์ ์ ์๋ ์์
์ด๊ธฐ ๋๋ฌธ์, ํ๋ก๊ทธ๋๋จธ๋ค์ ํ๋ก๋ฏธ์ค
๋ฅผ ๋ง๋ค์์ต๋๋ค.
# ํ๋ก๋ฏธ์ค ๋๋ ๋ ์
ํ๋ก๋ฏธ์ค
๋ MDN (opens new window) ๋ฌธ์์์ ์๋์ ๊ฐ์ด ์ค๋ช
ํ๊ณ ์์ต๋๋ค.
promise
Promise๋ ํ๋ก๋ฏธ์ค๊ฐ ์์ฑ๋ ๋ ๊ผญ ์ ์ ์์ง๋ ์์ ๊ฐ์ ์ํ ๋๋ฆฌ์๋ก, ๋น๋๊ธฐ ์ฐ์ฐ์ด ์ข ๋ฃ๋ ์ดํ์ ๊ฒฐ๊ณผ๊ฐ์ด๋ ์คํจ ์ด์ ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฐ๊ฒฐํ ์ ์๋๋ก ํฉ๋๋ค. ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ๋ฉ์๋์์ ๋ง์น ๋๊ธฐ ๋ฉ์๋์ฒ๋ผ ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค. ๋ค๋ง ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง๋ ์๊ณ , ๋์ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํด์ ๋ฏธ๋์ ์ด๋ค ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฌ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ฏธ๋์ ์ด๋ค ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํ๋ง๋๋ก ์ค์ฌ์ ์ด์ผ๊ธฐํ๋ค๋ฉด ํ๋ก๋ฏธ์ค๋'๋ฏธ๋ซ๊ฐ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ด ์๋ค. ์ปคํผ์ง์ ๊ฐ์ ๐๋ธ๊ธฐ๋ผ๋ผ๋ฅผ ์ฃผ๋ฌธ์ ํ๋ฉด, ์ง์์ ๐๏ธ์ง๋๋ฒจ์ ๋๊ฒจ์ค๋๋ค. ์ด ์ง๋๋ฒจ์ด ๋ฐ๋ก ํ๋ก๋ฏธ์ค์ ๋๋ค.
์ด ์ง๋๋ฒจ์ ๋ฏธ๋์ ๋ด๊ฐ ์๋ฉ๋ฆฌ์นด๋ ธ๋ฅผ ๋ฐ์ ์ ์์ ๊ฒ์ด๋ผ๋ '์ฝ์' ์ ๋๋ค. ์ด ์ฝ์์ ๊ธฐ๋ค๋ฆฌ๋ฉด์ ์ฌ๋ฌ๋ถ์ ๋ค๋ฅธ ๊ฑธ ํ ์ ์์ต๋๋ค. ์น๊ตฌ์ ์นดํก์ ํ ์๋ ์๊ณ , ๊ฒ์์ ํ ์๋ ์๊ณ ๋๋ ์ ํ๋ธ๋ฅผ ๋ณด๊ณ ์์ ์๋ ์๊ฒ ์ฃ . ๊ทธ๋ฆฌ๊ณ ์ง๋๋ฒจ์ด ์ธ๋ฆฌ๋ฉด ์นด์ดํฐ๋ก ๊ฐ์ ์ฃผ๋ฌธํ ๋ธ๊ธฐ๋ผ๋ผ๋ฅผ ๋ฐ์์ ๋ง์๊ฒ ๐๋ธ๊ธฐ๋ผ๋ด๋ฅผ ์ฆ๊ธธ ์ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ฐ ์ํฉ์ด ๋ฐ์ํ ์๋ ์์ต๋๋ค. ์ง๋๋ฒจ์ด ์ธ๋ ค์ ์นด์ดํฐ์ ๊ฐ๋๋ "์ฃ์กํฉ๋๋ค, ์๋. ์ค๋ ๋ธ๊ธฐ ์ฌ๊ณ ๊ฐ ๋ค ๋จ์ด์ ธ์ ๋ธ๊ธฐ๋ผ๋ผ ์ฃผ๋ฌธ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค ๐ญ" ๋ผ๊ณ ํ๋๊ฒ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ค๋ฅธ ๋ฉ๋ด๋ฅผ ๊ณ ๋ฏผํ๊ณ ์์ฒญํ๋๊ฐ ํฌ๊ธฐํด์ผ๋ง ํ์ฃ .
์ด์ฒ๋ผ ๋ฏธ๋ซ๊ฐ์ธ ๐๏ธํ๋ก๋ฏธ์ค๋ ์ฑ๊ณตํ ์๋, ์คํจํ ์๋ ์์ต๋๋ค.
์ด๋ฐ ๋ฏธ๋ซ๊ฐ์ ๋ค๋ฃจ๊ธฐ ์ํ ํ๋ก๋ฏธ์ค๊ฐ ๋ฑ์ฅํ๊ธฐ ์ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฝ๋ฐฑ์ด์์ต๋๋ค.
callback1(function(value1) {
callback2(value1, function(value2) {
callback3(value2, function(value3) {
callback4(value3, function(value4) {
callback5(value4, function(value5) {
// value5๋ฅผ ์ฌ์ฉํ๋ ์ฒ๋ฆฌ
});
});
});
});
});
์ฝ๋ฐฑ ํจ์๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ์ ๊ฐํธํ๊ณ , ์ค๋ ์๊ฐ ๋์ ํ์ค์ ์ธ ๋ฐฉ๋ฒ์ด์์ต๋๋ค. ํ์ง๋ง ์๋น์ค์ ๋ก์ง์ด ๋ณต์กํด์ง๊ณ ์ฌ๋ฌ ๋น๋๊ธฐ ๋์๋ค์ด ํ์ํ ์์ ๋ถํฐ ๋น๋๊ธฐ ํจ์์์ ๋ค๋ฅธ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ๊ณ , ๊ฑฐ๊ธฐ์ ๋ ๋ค๋ฅธ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฑ์ ์ค์ฒฉ์ด ๋ฐ์ํฉ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ํํ '์ฝ๋ฐฑ ์ง์ฅ' ์ ๋น ์ก๋ค๊ณ ํฉ๋๋ค. ๊ฒ๋ค๊ฐ ์ฝ๋ฐฑ์ ์ฐ๊ฒฐ์ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒฝ์ฐ์์๋ ์๋นํ ๊ณค๋ํ ์ํฉ์ ๋ง๋ค์ด๋ ๋๋ค.
try {
setTimeout(() => { throw new Error('Error!'); }, 1000);
} catch (e) {
console.log('์๋ฌ๋ฅผ ์บ์นํ์ง ๋ชปํ๋ค..');
console.log(e);
}
try ๋ธ๋ก ๋ด์์ setTimeout ํจ์๊ฐ ์คํ๋๋ฉด 1์ด ํ์ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋๊ณ ์ด ์ฝ๋ฐฑ ํจ์๋ ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค. ํ์ง๋ง ์ด ์์ธ๋ catch ๋ธ๋ก์์ catch๋์ง ์์ต๋๋ค. ์ด๋ฏธ try catch ๋ฌธ์ ๋น ์ ธ๋์จ ๋ค์์ setTimeout ํจ์๊ฐ 1์ด ๋ค์ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ฒ๋ค๊ฐ ๋ณดํต ๋น๋๊ธฐ ํจ์๋ค์ ๋ ๊ฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌ๋ฐ์ต๋๋ค. ์์ฒญ์ด ์ฑ๊ณตํ ๊ฒฝ์ฐ์ ์คํํ ์ฝ๋ฐฑ ํจ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ์คํํ ์ฝ๋ฐฑ ํจ์๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ก ์ธํด ๋ณต์ก์ฑ์ด 2๋ฐฐ ์ด์ ์ฆ๊ฐํ์ฃ .
# ๐ค๐ผ ๊ทธ๋์ ๋ฑ์ฅํ ํ๋ก๋ฏธ์ค
ํ์ง๋ง ํ๋ก๋ฏธ์ค๋ฅผ ํ์ฉํ๋ฉด ์ฝ๋ฐฑ ํจ์ ๋ฌธ์ ๋ฅผ ๊ฐํธํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ํ๋ก๋ฏธ์ค๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋ ๋์ ์, ์ฑ๊ณต๊ณผ ์คํจ์ ๋์ํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ค์ฒฉํ์ง ์๊ณ , ์ฌ๋ฌ ๊ฐ์ ๋น๋๊ธฐ ๋์์ ์ฐ๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
ํ๋ก๋ฏธ์ค๋ ๋น๋๊ธฐ ์์ ์ ์ ๋ฌ๋ฐ์์ ์๋ต์ ๋ฐ๋ผ ๋ ๊ฐ์ง ๋ฉ์๋ ์ค ํ๋๋ฅผ ํธ์ถํ๋ ๊ฐ์ฒด์ ๋๋ค. ํ๋ผ๋ฏธ์ค๋ ๋น๋๊ธฐ ์์ ์ด ์ฑ๊ณตํ๊ฑฐ๋ ์ถฉ์กฑ๋ ๊ฒฝ์ฐ then() ๋ฉ์๋์ ๊ฒฐ๊ณผ๋ฅผ ๋๊ฒจ์ค๋๋ค. ๋น๋๊ธฐ ์์ ์ ์คํจํ๊ฑฐ๋ ๊ฑฐ๋ถ๋๋ ๊ฒฝ์ฐ์๋ catch() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. then()๊ณผ catch() ๋ฉ์๋์๋ ๋ชจ๋ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค. ์ด๋ ๋ ๋ฉ์๋์ ์ ๋ฌ๋๋ ํจ์์๋ ๋น๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ์ธ ์๋ต๋ง์ด ์ธ์๋ก ์ ๋ฌ๋ฉ๋๋ค.
ํ๋ก๋ฏธ์ค๋ ๋ ๊ฐ์ ์ธ์, resolve() ์ reject() ๋ฅผ ์ ๋ฌ๋ฐ์ต๋๋ค. resolve()๋ ์ฝ๋๊ฐ ์ ์์ ์ผ๋ก ๋์ํ์ ๋ ์คํ๋ฉ๋๋ค. resolve()๊ฐ ํธ์ถ๋๋ฉด then() ๋ฉ์๋์ ์ ๋ฌ๋ ํจ์๊ฐ ์คํ๋ฉ๋๋ค. ํ๋ก๋ฏธ์ค๋ฅผ ์ค์ ํ ๋ then()๊ณผ catch() ๋ฉ์๋๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. then() ๋ฉ์๋๋ ์ฑ๊ณตํ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ , catch() ๋ฉ์๋๋ ๊ฑฐ์ ๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
new Promise(function(resolve, reject) {
// ...
}).then(resolve()).catch(reject())
then()์ ์ฐ์์ผ๋ก ์ฌ์ฉํ๋ฉด, ์ฌ๋ฌ ๊ฐ์ ์ค์ฒฉ๋ ์ฝ๋ฐฑ ํจ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋์ ์ฌ๋ฌ ๊ฐ์ then() ๋ฉ์๋๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์๋๋ก ๋ด๋ ค์ค ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ฏ๋ก, ์๋ฌต์ ์ธ ๋ฐํ์ ์ด์ฉํ๋ ํ์ดํ ํจ์๋ก ๋ชจ๋ ์ฝ๋๋ฅผ ํ ์ค๋ก ๋ง๋ค ์ ์์ต๋๋ค.
getUserPreferences()
.then(preference => getMusic(preferenc.theme))
.then(music => { console.log(music.album) })
์ฌ๊ธฐ์ ํ๋ก๋ฏธ์ค๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ์๋ catch() ๋ฉ์๋๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ฐ๊ฒฐํ ํ์๊ฐ ์์ต๋๋ค. catch() ๋ฉ์๋๋ฅผ ํ๋๋ง ์ ์ํด์ ํ๋ก๋ฏธ์ค๊ฐ ๊ฑฐ์ ๋๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ ๋๊ตฌ๋ฅผ ๋ค๋ฃฐ ์ ์๊ฒ ๋์์ต๋๋ค. ์ด๋ฐ ํ๋ก๋ฏธ์ค๊ฐ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ํฉ ์ค ํ๋๋ ๋ฐ๋ก API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด ํ๋ก๋ฏธ์ค๋ฅผ ํ์ฉํด ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ fetch์ ๋ํด ์์๋ด ์๋ค.
# ๋ํํ๊ณ ์ถ์ fetch
๊ท๋ชจ๊ฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ์ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ์๋ ํ์ฐ์ ์ผ๋ก API๋ฅผ ๋ค๋ฃจ๊ฒ ๋ฉ๋๋ค. API๋ฅผ ์ด์ฉํ๋ฉด ํ์ด์ง๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ด์, ํ๋ฉด์ ์๋ก ๊ณ ์นจ ํ์ง ์์๋ ์์๋ฅผ ๊ฐฑ์ ํ ์ ์์ต๋๋ค. ์ฆ ๋ฌธ์๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ด์ฃ .
์ต๊ทผ ํ๋ก ํธ์๋์ ํธ๋ ๋ ์ค ํ๋์ธ ๋จ์ผ ํ์ด์ง ์น์ฑ(Single Page Application)์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ธ๊ธฐ๋ฅผ ๋๋ ์ด์ ์ค ํ๋์ด์ง๋ง, Ajax๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ ์ ์ค๋ ์๊ฐ ๋์ ๊ฝค ๋ฒ๊ฑฐ๋ก์ด ๋ฐฉ๋ฒ์ด์์ต๋๋ค. ๊ทธ๋์ ์ค๋์๊ฐ ๊ฐ๋ฐ์๋ค์ ๋ณต์ก๋๋ฅผ ๋ฎ์ถ jQuery์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ฐ์. ๊ฐ๋ฐ์๋ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ฌ๋๋ค์ด๋ค ๋ณด๋, ๊ธฐ์กด์ ๋ณต์ก๋๋ฅผ ๋ฎ์ถfetch๋ผ๋ ๋๊ตฌ๋ฅผ ๋ง๋ค์ด๋์ต๋๋ค.
# fetchํ๊ณ ์ถ๋ค๋ฉด
fetch()๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด API ๋์ (์๋ ํฌ์ธํธ)์ด ํ์ํฉ๋๋ค. ์ด ์๋ํฌ์ธํธ๋ฅผ ๊ฐ๋จํ๊ฒ ๋ค๋ฃจ๊ธฐ ์ํด jsonplaceholder (opens new window)๋ผ๋ ์๋น์ค๋ฅผ ์ด์ฉํ ๊ฒ๋๋ค. ์ด ์๋น์ค๋ ๊ฐ์์ ๋ธ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
๋จผ์ ์์ฒญํ ๋ด์ฉ์ ๊ฐ๋จํ GET ์์ฒญ์ ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ fetch() ํธ์ถ์ ๊ฐ๋จํ๋ฐ์. ์๋์ ๊ฐ์ด ๋์ url์ ์ธ์๋ก ํด์ fetch()๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
fetch('https://jsonplaceholder.typicode.com/posts/1')
์ ์์ฒญ์ ํ๋ฉด ์๋ต ๋ณธ๋ฌธ์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provid...",
"body": "quia et suscipit\nsuscipit rec..."
}
๐จ๐ผโ๐จ ์ฐธ ์ฝ์ฃ ?
์์ฒญ์ ๋ณด๋ด๊ณ ๋๋ฉด fetch()๋ ์๋ต์ ์ฒ๋ฆฌํ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค. ์ด์ด์ ํด์ผ ํ ์์ ์ then() ๋ฉ์๋์ ์๋ต์ ์ฒ๋ฆฌํ๋ ์ฝ๋ฐฑํจ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ์ฌ์ค ์ฐ๋ฆฌ๊ฐ ํ์ํ ๊ฒ์ ์๋ต ๋ณธ๋ฌธ์ธ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ ๋๋ค. ๊ทธ๋ ์ง๋ง ์๋ต ๊ฐ์ฒด๋ ๋ณธ๋ฌธ ์ธ์๋ ์ํ ์ฝ๋, ํค๋ ๋ฑ ๋ค์ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ํํ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฃจ๋ JSON ํํ๊ฐ ์๋ ์ ์์ต๋๋ค. ๊ทธ๋์ json()์ด๋ผ๋ ๋ฉ์๋๋ฅผ ํธ์ถํด ์๋ต๊ฐ์ฒด๋ฅผ JSON์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค.
์ด๋ ์ฃผ์ํ ์ ์ json()๋ฉ์๋๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ then() ๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ถ๊ฐํ then() ๋ฉ์๋์์ ์ฝ๋ฐฑ์์ ํ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์ค ์ ๋ชฉ๋ง ํ์ํ ๊ฒฝ์ฐ์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
fetch('https://jsonplaceholder.typicode.com/posts/1')
.then(data => {
return data.json
})
.then(post => {
console.log(post.title)
})
๊ทธ๋ฐ๋ฐ ํ ๊ฐ์ง ์ํ๊น์ด ์ฌ์ค์ด ์์ต๋๋ค๐ญ. fetch() ํ๋ก๋ฏธ์ค๋ ์ํ ์ฝ๋๊ฐ 40x ์๋ฌ๋ก ์ธํด ์์ฒญ์ ์คํจํ ๊ฒฝ์ฐ์๋ ์๋ต ๋ณธ๋ฌธ์ ๋ฐํํฉ๋๋ค. ์ฆ ์์ฒญ์ด ์คํจํ๋ ๊ฒฝ์ฐ๋ฅผ catch ๋ฉ์๋๋ง์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ธ๋ฐ์. ์๋ต์๋ ์๋ต ์ฝ๋๊ฐ 200์์ 299 ์ฌ์ด์ธ ๊ฒฝ์ฐ true๋ก ์ค์ ๋๋ ok๋ผ๋ ํ๋๊ฐ ์์ต๋๋ค. ์ด ํ๋๋ฅผ ์ด์ฉํด์ ์๋ต์ ํ์ธํ๊ณ , ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
fetch('https://jsonplaceholder.typicode.com/posts/1')
.then(data => {
if (!data.ok) {
throw new Error(data.status)
}
return data.json()
})
.then(post => {
console.log(post.title)
})
.catch(error => {
console.log(error)
})
์ด์ ์๋ก์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์ถ๊ฐํ๋ API๋ฅผ ํ์ฉํด๋ณผ๊น์? POST ์์ฒญ์ GET ์์ฒญ๊ณผ๋ ๋ค๋ฅด๊ฒ, ๋ ๋ฒ์งธ ์ธ์๋ก ์กฐ๊ฑด์ ๋ด์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค. ๋จผ์ , POST ์์ฒญ์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ POST ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์ ์ธํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ก์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ฑํ๋ JSON ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ JSON ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ํค๋์ Content-Type์ application/json์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก JSON ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ฌธ์์ด๋ก ์์ฒญ ๋ณธ๋ฌธ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
const newPost = {
title: 'jun',
body: 'jun is cool boy',
userId: '1'
}
const option = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(newPost)
}
fetch('https://jsonplaceholder.typicode.com/posts/1', option)
.then(data => {
if (!data.ok) {
throw new Error(data.status)
}
return data.json()
})
.then(post => {
console.log(post.title)
})
.catch(error => {
console.log(error)
})
# Async Await
์ด๋ฐ ํ๋ก๋ฏธ์ค๋ async/await์ ์ด์ฉํด์ ๋์ฑ ํธํ๊ฒ ๋ค๋ฃฐ ์ ์๊ฒ ๋ฐ์ ํ์ต๋๋ค. ํ๋ก๋ฏธ์ค๋ ์ฝ๋ฐฑ๊ณผ ๋น๊ตํ๋ฉด ์์ฒญ๋ ๋ฐ์ ์ด์ง๋ง, ์ธํฐํ์ด์ค๊ฐ ์ฌ์ ํ ๋ค์ ํฌ๋ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํด๋ ์ฌ์ ํ ๋ฉ์๋์์ ์ฝ๋ฐฑ์ ๋ค๋ค์ผ ํฉ๋๋ค. ๋คํํ ์ธ์ด๋ ๊ณ์ ๋ฐ์ ํฉ๋๋ค.
async ํค์๋๋ฅผ ์ด์ฉํด์ ์ ์ธํ ํจ์๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋น๋๊ธฐ ํจ์์ ๋ด๋ถ์์ await ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ด ๋ฐํ๋ ๋๊น์ง ํจ์์ ์คํ์ ์ค์ง์ํฌ ์ ์์ต๋๋ค.
async function getUser() {
cosnst eastjun = await getTargetUser();
return eastjun;
}
๋น๋๊ธฐ ํจ์์ ์ฌ๋ฐ๋ ์ ์ ํ๋ก๋ฏธ์ค๋ก ๋ณํ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ getUser()์ ํธ์ถํ๋ ๊ฒฝ์ฐ then() ๋ฉ์๋๊ฐ ํ์ํฉ๋๋ค. ๋ญ๊ฐ ํฌ๊ฒ ๋ฌ๋ผ์ง ๊ฒ ๊ฐ์ง ์์ ์ ์๋๋ฐ, async ํจ์๊ฐ ๋น๋๋ ๋๋ ์ฌ๋ฌ ๊ฐ์ ํ๋ก๋ฏธ์ค๋ฅผ ๋ค๋ฃฐ ๋์ ๋๋ค.
async function getArtistPreference() {
const theme = await getUSerPreferences()
const album = await getMusic(theme)
const artist = await getArtist(album)
return artist
}
getArtistPreference()
.then(artist => console.log(artist))
.catch(error => console.error(error))
# ๐ ์ ๋ฆฌ
โ ํ๋ก๋ฏธ์ค๋ ์ด๋ค ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ ๋ฏธ๋ซ๊ฐ์ด๋ค. โ ํ๋ก๋ฏธ์ค๋ ์ฑ๊ณต๊ณผ ์คํจ์ ๋์ํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ณ , ๋น๋๊ธฐ ์์ ์ ์ ๋ฌ๋ฐ์์ ์๋ต์ ๋ฐ๋ผ ๋ ๊ฐ์ง ๋ฉ์๋ ์ค ํ๋๋ฅผ ํธ์ถํ๋ค. โ ํ๋ก๋ฏธ์ค๋ ๋ ๊ฐ์ ์ธ์ resolve()์ reject()๋ฅผ ์ ๋ฌ๋ฐ๋๋ค. โ fetch๋ ๋คํธ์ํฌ ํต์ ์ ํฌํจํ ๋ฆฌ์์ค ์ต๋์ ์ํ ์ธํฐํ์ด์ค๊ฐ ์ ์๋ API์ด๋ค. โ fetch()๋ฅผ ๋ถ๋ฌ๋ค์ด๋ ๊ฒฝ์ฐ ์๋ํฌ์ธํธ๋ฅผ ์ง์ ํด์ผ ํ๋ค. โ fetch()๋ Promise๋ฅผ ๋ฆฌํดํ๋ค. โ async/awiat์ ์ด์ฉํ๋ฉด ํ๋ก๋ฏธ์ค๋ฅผ ํจ์ฌ ๊น๋ํ๊ฒ ๋ค๋ฃฐ ์ ์๋ค.
# ๐ ์ฐธ๊ณ ๋งํฌ
โ ๐ RESTful API