์น ๊ฐ๋ฐ์์ API๋ฅผ ํธ์ถํ๊ธฐ ์ํด์ ์ ์ผ ๋จผ์ ๋ ์ค๋ฅด๋ ๊ฒ์ด request, axios, jQuery ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ํ์ง๋ง ์ด์ ๋ธ๋ผ์ฐ์ ๊ฐ fetch() ํจ์๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค(bundle)ํ์ผ์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๋ ๋ญ๋น๋ฅผ ํ์ง ์์๋ ๋๋ค. ๋ฌผ๋ก ๋๋ ์ฃผ๋ก reactJs, nextJs ๋ก ์์ ํ๊ธฐ ๋๋ฌธ์ axios๋ฅผ ์จ์ ํธ์ถํ๋ค. ๊ทธ๋ฌ๋ค ์ด๋ฒ์ ์ด๋ฏธ์ง url์์ ํ์ผ์ ์ถ์ถํ๊ธฐ ์ํด์ fetch ํจ์๋ฅผ ์จ์ response๋ฅผ ๋ฐ์์ฌ ์ผ์ด ์์๋ค. ๋ฐฉ๋ฒ์ ์ฐพ์์ ์์๋ณด๋ค๊ฐ fetchํจ์๋ฅผ ์ด๋ ๊ฒ ์ธ ์ ์๋ค๋ ๊ฒ๋ ์๊ฒ ๋์๋ค. ๊ฒธ์ฌ๊ฒธ์ฌ- fetch์ ๋ํด ์์๋ณด๊ณ ๊ณต๋ถํ๋ ค๊ณ ํ๋ค.
๐ข Fetch ๋ฅผ ์์!
fetch() ํจ์๋ ๋คํธ์ํฌ ์์ฒญํ๊ณ ์๋ต์ ๋ฐ์ ์๊ฐ ์๋ค. (Request / Response) ์บ์, ์น ์๋น์ค ํธ๋ค๋ง ๋ฑ Response๋ฅผ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์กฐ์ํ๋ ๊ฒ๋ ํ์ฉํ๋ค! fetch()๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ ๊ฐ ๋ฐ๋๋ฐ, ์ฒซ ๋ฒ์งธ ์ธ์๋ก url๋ฅผ, ๋ ๋ฒ์งธ ์ธ์๋ก ์ต์ ๊ฐ์ฒด๋ฅผ ๋ฐ๊ณ Promise ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ๋ฐํ๋ ๊ฐ์ฒด๋ API ํธ์ถ์ด ์ฑ๊ณตํ์ ๊ฒฝ์ฐ ์๋ต(response) ๊ฐ์ฒด๋ฅผ resolve ํ๊ณ ์คํจํ์ ๊ฒฝ์ฐ์๋ ์์ธ(error) ๊ฐ์ฒด๋ฅผ reject ํ๋ค.
Fetch interface
4๊ฐ์ง์ ์ธํฐํ์ด์ค๊ฐ ์กด์ฌํ๋ค.
โช Headers - ์์ฒญ / ์๋ต์ ํค๋๋ก, ๊ทธ์ ๋ฐ๋ฅธ instance๋ฅผ ์์ฑํ ์ ์๊ณ , ๋ค์ํ ์ก์ (๋ฉ์๋)์ ๊ฐ์ง๊ณ ์๋ค. ์ด๊ฒ์ ๋ฐ๋ผ์ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ค. ex) append(), delete(), entries(), forEach(), get(), has(), keys(), set(), values(), getAll()
const myHeaders = new Headers();
myHeaders.append('Content-Type', 'text/xml');
myHeaders.get('Content-Type') // should return 'text/xml'
โช Requests - ์์ฒญ ํค๋์ค์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ค.
const request = new Request('https://www.mozilla.org/favicon.ico');
const url = request.url;
const method = request.method;
const credentials = request.credentials;
fetch(request)
.then((response) => response.blob())
.then((blob) => {
image.src = URL.createObjectURL(blob);
});
โช Response - fetch()๊ฐ Promise๋ฅผ ๋ฆฌํดํ๋๋ฐ, ๊ทธ๋ ๊ฒฐ๊ณผ ๊ฐ์์ Response๋ฅผ ์ป์ ์ ์๋ค.
const image = document.querySelector('.my-image');
fetch('flowers.jpg')
.then((response) => response.blob())
.then((blob) => {
const objectURL = URL.createObjectURL(blob);
image.src = objectURL;
});
โช fetch() - ๋ฆฌ์์ค ํ์น๋ฅผ ์ํ ๋ฉ์๋
๋ํดํธ๋ก GET ๋ฐฉ์์ผ๋ก ์๋์ ํ๊ณ , GET๋ฐฉ์์ ์์ฒญ ์ ๋ฌธ์ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์ต์ ์ธ์๊ฐ ํ์ ์๋ค.
fetch('url')
.then((response) => console.log(response))
๋๋ถ๋ถ์ API๋ค์ JSONํํ๋ก ์๋ตํ๊ธฐ ๋๋ฌธ์ Response ๊ฐ์ฒด ์ญ์ json() ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค
์ fetch์ ๋ํด ์ ๋ฆฌํ ๋ง์์ ๋จน์๋๋?
์ ๋ฌด๋ฅผ ํ๋ค๊ฐ ์ด๋ฏธ์ง url์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ file๋ก ๋ณํํด์ค์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค. ์ด๋ ์ผ๋ ๊ฒ์ด fetch์๋ค. ๋งจ๋ json ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฑฐ๋, ์ฃผ๊ธฐ๋ง ํ์ง, ์ด๋ฏธ์ง ํ์ผ url์ ๋ด๊ธฐ ์ด๋ ํ ์ ๋ณด๋ฅผ ๊ฐ๊ณตํ๋ค๋๊ฐ ํด๋ณผ ์๊ฐ์ ๋ชปํ๊ธฐ์ ๊ณผ์ฅ์ ํ์๋ฉด ์ผํน ๊ทธ ์์ฒด์๋ค. fetch๋ฅผ ์ด์ฉํด์ FormData()๋ฅผ ์ฌ์ฉํด ํ์ผ์ ์ ๋ก๋ํ ์๊ฐ ์๋๋ฐ, ๋ง์ฐฌ๊ฐ์ง๋ก response๋ก ์ด๋ฏธ์ง url์ ๋ด๊ฒจ์๋ ์ ๋ณด๋ฅผ ๋ฐ์ ์๋ ์๋ค.
fetch๋ฅผ ์ฌ์ฉํด์ ์ด๋ฏธ์ง ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ์ด์ผ๊ธฐ์ด๋ค. ์ด๋ blob์ด๋ผ๋ ๊ฒ์ด ๋ฑ์ฅํ๋๋ฐ, blob์ ๋ฐ์ด๋๋ฆฌ ํํ๋ก ํฐ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ๋ ๋ง์ด ์ฐ์ธ๋ค. ์ด๋ฅผ ํ ๋ฉด ๋น๋์ค, ์ด๋ฏธ์ง, ์ฌ์ด๋ ๊ฐ์ ๋ฉํฐ๋ฏธ๋์ด ๊ฐ์ฒด์ ๋ง์ด๋ค.
response = fetch(url)
response.blob()
์ ํ๋ฉด response์๋ ํด๋น url , type ๋ฑ์ ํ์ธํ ์ ์๊ณ , ํด๋น ์ด๋ฏธ์ง์ blob์ ๋ถ์ด๋ฉด type, size๋ฅผ ํ์ธํ ์ ์๋ค.
์ด๋ ์ฌ๊ธฐ์ ๋์ค๋ ๋ฆฌ์์ค๋ฅผ ๋ฐ๋ผ๋ด์ ๋ด๊ฐ ํ์ํ ์ ๋ณด๋ง ์! ๋ฝ์๋ด์ ์์ ์ ์งํํ๋ค.
โถ https://developer.mozilla.org/en-US/docs/Web/API/Response
๐ ์ฐธ๊ณ ์๋ฃ
โช https://velog.io/@prayme/Fetch-API
โช https://developer.mozilla.org/ko/docs/Web/API/Fetch_API/Using_Fetch
'๊ฐ๋ฐ > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
localStorage vs Cookie ๋ง๋ฃ์๊ฐ ์ค์ ํ๊ธฐ (0) | 2023.04.12 |
---|---|
[์๋ฐ์คํฌ๋ฆฝํธ] js vs jsx ? ํ์ฅ์ ๋ญ๊ฐ ๋ค๋ฅด์ง? (0) | 2022.12.30 |
http Content-Type : application/x-www-form-urlencoded (0) | 2022.09.19 |
[์๋ฐ์คํฌ๋ฆฝํธ ] 2์ฐจ์ ๋ฐฐ์ด ์ค๋ณต ์ ๊ฑฐํ๊ธฐ (0) | 2022.04.09 |
[์๋ฐ์คํฌ๋ฆฝํธ] ์ง๋๊ฐ ์๊ฐ ๊ตฌํ๋ ๋ฐฉ๋ฒ.. (** ๋ถ ์ , ** ์ด ์ ) (0) | 2022.03.24 |