goal
- fetch๋ฅผ ์ด์ฉํด ์น์์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
์น ๊ฐ๋ฐ์ ํ ๋, ajaxํต์ ์ ์์ฃผ ์ฌ์ฉํ๊ฒ ๋๋ค. ajax ๋ฅผ ์ฌ์ฉํ ๋, XHR, JQuery, Fetch ๋ฅผ ์ธ ์ ์๋๋ฐ, ๊ทธ ์ค ๊ฐ์ฅ ๋ฒ ์คํธ์ธ fetch์ ๋ํด์ ์์๋ณธ๋ค.
fetch
๋? : ์๋ฐ์คํฌ๋ฆฝํธ์์ => ์๋ฒ๋ก ๋คํธ์ํฌ ์์ฒญ(request)์ ๋ณด๋ด๊ณ ์๋ต(response)์ ๋ฐ์ ์ ์๋๋ก ํด์ฃผ๋ ๋ฉ์๋
XMLHttpRequest์ ๋น์ทํ์ง๋ง fetch๋ Promise ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ด์ ๋ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
๋น๋๊ธฐ ์์ฒญ์ ๊ฐ์ฅ ๋ํ์ ์ธ ์ฌ๋ก๋ฅผ ๊ผฝ์ผ๋ผ๊ณ ํ๋ค๋ฉด, ๋จ์ฐ ๋คํธ์ํฌ ์์ฒญ์ ๋ค ์ ์๋ค. ๋ค์ํ ๋คํธ์ํฌ ์์ฒญ ์ค, URL๋ก ์์ฒญํ๋ ๊ฒฝ์ฐ๊ฐ ๊ฐ์ฅ ํํ๋ค. ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ API๊ฐ ๋ฐ๋ก fetch API์ด๋ค!
์ ํ๋ฉด์์ ๊ณ์ ์ ์ฒด ํ๋ฉด์ ์๋ก ๋ถ๋ฌ ์ค๋ ๊ฒ ๋ณด๋ค ์ค์๊ฐ ๋ด์ค๋, ์ ํด์ง ์๊ฐ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ ๊ด๊ณ , ํฌ์คํ
๋ฑ ์ํ๋ ์ ๋ณด๋ง ์
๋ฐ์ดํธ ํ๊ธฐ ์ํด์, fetch API
๋ฅผ ์ด์ฉํ์ฌ ์ํ๋ ์ ๋ณด๋ฅผ ์๊ฒฉ URL๋ก๋ถํฐ ๋ถ๋ฌ์จ๋ค.
fetch API
๋ ํน์ URL๋ก๋ถํฐ ์ ๋ณด๋ฅผ ๋ฐ์์ค๋ ์ญํ ์ ์ํํ๋ค.
์ด ๊ณผ์ ์ ๋น๋๊ธฐ๋ก ์ด๋ฃจ์ด์ง๋ค.
fetch (url, [options])
url
: ์ ๊ทผํ๊ณ ์ ํ๋ URLoptions
: ์ ํ์ ์ธ ๋งค๊ฐ๋ณ์๋ก, method๋ header ๋ฑ์ ์ง์ ํ ์ ์์options
์ ์๋ฌด๊ฒ๋ ๋๊ธฐ์ง ์์ผ๋ฉด, ์์ฒญ์ ์ธ์ ๋ GET
method ๋ก ์งํ๋์ด, url
๋ก๋ถํฐ ์ปจํ
์ธ ๊ฐ ๋ค์ด๋ก๋ ๋๋ค.fetch()
๋ฅผ ํธ์ถํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋คํธ์ํฌ ์์ฒญ์ ๋ณด๋ด๊ณ ํ๋ผ๋ฏธ์ค๊ฐ ๋ฐํ๋๋ค.fetch()
๋ฅผ ํธ์ถํ๋ ์ฝ๋์์ ์ฌ์ฉ๋๋ค.์์ฒญํค๋, ์๋ตํค๋, POST์์ฒญ์ ๋ํ ์์ธํ ์ค๋ช ์ ๐๏ธ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ
fetch ๋งค์๋๋ JavaScript์์ ์๋ฒ๋ก ๋คํธ์ํฌ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ์ ์ ์๋๋ก ํด์ฃผ๋ ๋งค์๋
fetch์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ์์ฒญ์ ๋ํ ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ ์ ์๋ค.( fetch์ ํ๋ผ๋ฏธํฐ๋ค์ ๐๏ธ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ )
fetch API๋ ๊ธฐ๋ณธ์ ์ผ๋ก Promise์ ํ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
fetch๋ก๋ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
์ฌ๋ฐ๋ฅธ url๋ก ์์ฒญ์ ๋ณด๋ด์ผ ํ๊ณ , then์ผ๋ก ๋ถ๋ฌ์ค๋ ์๋ต์ ๋ํด ์์ฒด ๋ด์ฅ ๋ฉ์๋์ธ json()์ ์ ์ฉํด์ผ ํ๋ค.
json()์ Response ์คํธ๋ฆผ (์คํธ๋ฆผ์ ๋ํ ์งง๋งํ ์ค๋ช ์ ๐๏ธ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ )์ ๊ฐ์ ธ์์ ์คํธ๋ฆผ์ด ์๋ฃ๋ ๋๊น์ง ์ฝ์ ํ, ๋ค ์ฝ์ body์ ํ ์คํธ๋ฅผ Promiseํํ๋ก ๋ฐํํ๋ค.
fetch ๋ก ์ธํด ๋ฐํ๋๋ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋, Promis๋ก ๊ฐ์ธ์ ธ ์๋ Response ๊ฐ์ฒด. ๊ทธ๋ฆฌ๊ณ ์ด Reponse ๊ฐ์ฒด๋ json ์ด๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ, ์ด ๋ฉ์๋๋ฅผ ์คํ ์์ผ์ผ ๋น๋ก์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ฐ์ดํฐ๊ฐ Promise ์ ๊ฐ์ธ์ ธ์ ๋์ค๊ฒ ๋๋ค.
์๋ ์์
fetch ์์ฒญ
๐๏ธ
Promise<Response> ๊ฐ ๋ฐํ ๋จ
๐๏ธ
Response ๋ฅผ ๊บผ๋ (Promise ํจํด ํน์ async await ํจํด)
๐๏ธ
Response ์ json ๋ฉ์๋๋ฅผ ์คํ
๐๏ธ
Promise<data> ๊ฐ ๋ฐํ ๋จ
๐๏ธ
data๋ฅผ ๊บผ๋
var newsURL = 'http://localhost:5000/data/latestNews';
var weatherURL = 'http://localhost:5000/data/weather';
function getNewsAndWeather() {
return fetch(newsURL) // ์ฌ๋ฐ๋ฅธ url์์ฒญ์ ๋ณด๋ธ๋ค
.then(res => res.json())
// ๋ฐ๋ก ๋ค์ ์ค๋ ์๋ต์ ๋ํด json()์ ํด์ค๋ค
// (axios๋ ์ด๊ณผ์ ์ ์๋์ผ๋ก ํด์ค๋ค)
// ์์ฒด์ ์ผ๋ก json()๋ฉ์๋๊ฐ, ์๋ต(res)์ JSONํํ๋ก ๋ณํ์ํจ ๋ค, ๋ค์ Promise๋ก ์ ๋ฌํ๋ค
.then((result1) => { // result1์ newsURL์์ ๋ฐ์ ๊ฒฐ๊ณผ
return fetch(weatherURL)
.then(res => res.json())
.then((result2) => {
//! ์คํจํ ๋ฐฉ๋ฒ
// let obj = {}
// obj.news = result1;
// obj.weather = result2;
// return obj
//! ์คํจํ ๋ฐฉ๋ฒ
// return `{news: ${result1.data}, weather: ${result2}}`
return {news: result1.data, weather: result2}
})
})
.catch((err) => console.log(err)) // ์๋ฌ๋ฉ์์ง๋ฅผ ํ์ธํ ์ ์์
}
function getNewsAndWeatherAll() {
//! ์คํจํ ๋น๋ฒ
//! return Promise.all([newsURL, weatherURL])
//! .then(([contents1, contents2]) => {
//! return {news: contents1.data, weather: contents2}
//! })
//! ์ ๋ต 1
let news = fetch(newsURL).then(res => res.json()) // json์ผ๋ก ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ํํ๋ก ๋ง๋ค์ด์
let weather = fetch(weatherURL).then(res => res.json())
return Promise.all([news, weather]) // promise๋ก ๊ฐ์ธ์ง ๋ฐ์ดํฐ๋ฅผ all๋ก ํ๋ฒ์ ๊ฐ์ ธ์ค๊ธฐ
.then(([n, w]) => { // ์ธ์๊ฐ ๋๊ฐ์ด๋ฏ๋ก, ๋๊ฐ์ ์ธ์๋ฅผ ๋๊ธฐ๊ณ
return {news: n.data, weather: w} // ์ํ๋ ํ์์ผ๋ก ์ถ๋ ฅ
})
// or
//! ์ ๋ต 2
return Promise.all([fetch(newsURL), fetch(weatherURL)]) // fetch๋ก ๊ฐ url์ ๋ฐฐ์ด์ ๋ด์ ๊ฐ์ ธ์์
.then(([news, weather]) => { // ๋ฐฐ์ด๋ก ๋ด๊ธด ์ธ์๋ฅผ ๋๊ธฐ๊ณ
return Promise.all([news.json(), weather.json()]) // json์ ํด์ฃผ๋๋ฐ, ์ด๋ Promise๋ก ๊ฐ์ธ์ฃผ์ด์ผ
})
.then(([n,w]) => { // ๊ฐ์ธ์ค ๋ฐ์ดํฐ๋ฅผ all๋ก ๋๊ฐ๋ฅผ ๋๊ฒผ์ผ๋ฏ๋ก, ๋๊ฐ์ ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ๋ฌถ์ด์
return {news: n.data, weather: w} // ์ํ๋ ํ์์ผ๋ก ์ถ๋ ฅ
})
}
// async function ์ ์ธ์ AsyncFunction๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํ๋์ ๋น๋๊ธฐ ํจ์๋ฅผ ์ ์ํ๋ค.
async function getNewsAndWeatherAsync() {
let news = await fetch(newsURL).then(res => res.json())
let weather = await fetch(weatherURL).then(res => res.json())
return {news: news.data, weather: weather}
}
์ถ์ฒ : https://hoorooroob.tistory.com/๐๏ธ
์ถ์ฒ : https://ko.javascript.info/fetch๐๏ธ