-
axios์ fetch, ๊ทธ๋ฆฌ๊ณ Next๋ ์ fetch ์ฌ์ฉ์ ๊ถ์ฅํ ๊น?์นดํ ๊ณ ๋ฆฌ ์์ 2024. 1. 14. 23:42
์ต๊ทผ์ ํ์ฌ์์ Next14๋ก ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์์ํ๊ฒ ๋๋ฉด์, ๊ณต์๋ฌธ์์์ ์ค๋ช ํ๊ณ ์๋ native fetch API๋ฅผ ํ์ฅํ fetch๋ฅผ ์ฌ์ฉํ ์ง, axios ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ง์ ๋ํ ๊ณ ๋ฏผ์ ๋ถ๋ชํ๊ฒ ๋์๋ค. ๋งจ ์ฒ์์ fetch๋ฅผ ์ฌ์ฉํ๋ค๊ฐ axios๋ฅผ ์ฌ์ฉํ๊ฒ ๋์์ ๋, ์ ๋ง ์ ๋ง ํธ๋ฆฌํจ์ ๋๊ผ์๋๋ฐ, ๋ ์ฌ์ด์ ์ ํํ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ์์ธํ ์์ง ๋ชปํด ๊ธฐ์ ๊ฒฐ์ ์ ๋ชป ๋ด๋ฆฌ๊ณ ์๋ ์์ ์ ๋ฐ๊ฒฌํ๊ฒ ๋์๋ค. ๊ทธ๋ฆฌํ์ฌ ๋ ์ฌ์ด ์ฐจ์ด์ ์ ์ดํด๋ณด๊ธฐ๋ก ํ๋ค.
Axios๋ ?
Axios๋ node.js์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ Promise ๊ธฐ๋ฐ HTTP ํด๋ผ์ด์ธํธ ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ํ ์ ๋๋ค(๋์ผํ ์ฝ๋๋ฒ ์ด์ค๋ก ๋ธ๋ผ์ฐ์ ์ node.js์์ ์คํํ ์ ์์ต๋๋ค). ์๋ฒ ์ฌ์ด๋์์๋ ๋ค์ดํฐ๋ธ node.js์ http ๋ชจ๋์ ์ฌ์ฉํ๊ณ , ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์์๋ XMLHttpRequests๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Fetch API๋?
Fetch API๋ ๋คํธ์ํฌ ํต์ ์ ํฌํจํ ๋ฆฌ์์ค ์ทจ๋์ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ฉฐ, XMLHttpRequest๋ณด๋ค ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋์ฒด์ ์ ๋๋ค.
๊ฐ๊ฐ Axios ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ณต์๋ฌธ์์ mdn์์ ๊ฐ์ ธ์จ ์ ์์ด๋ค. ์ฌ๊ธฐ์ ์ง์คํด์ ๋ณผ ๊ฒ์, axios๋ ์น ๋ธ๋ผ์ฐ์ ์์ XMLHttpRequests๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๋์ด์์ผ๋ฉฐ, Fetch API๋ XMLHttpRequest๋ณด๋ค ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋์ฒด์ฌ๋ผ๋ ์ ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด, fetch๋ XMLHttpRequests๋ฅผ ์ฌ์ฉํ๊ณ ์๋ Axios๋ณด๋ค ๋ ๋ซ๋ค๋ ๋ป์ผ๊น?
์ด๋ฅผ ์๊ธฐ ์ํด์๋ XMLHttpRequest๊ฐ ์ ํํ ๋ฌด์์ด๊ณ , fetch๋ ์ด๋ค ์ ์์ ๊ทธ๋ณด๋ค ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋์ฒด์ฌ์ธ์ง ์ดํด๋ณผ ํ์๊ฐ ์๋ค.
XMLHttpRequest๋?
Ajax ์์ ์ฌ์ฉ๋๋ HTTP ํต์ ์ ์ํ ๋ฉ์๋์ ํ๋กํผํฐ๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ค์ ์ง๋ฌธ์ Ajax๊ฐ ๋ฌด์์ธ์ง๋ก ๋์ด๊ฐ๊ฒ๋๋ค.
Ajax๋?
AJAX (Asynchronous JavaScript์ XML)๋ XMLHttpRequest ๊ธฐ์ ์ ์ฌ์ฉํด ๋ณต์กํ๊ณ ๋์ ์ธ ์นํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ด๋ค.
Ajax๊ฐ ๋ฑ์ฅํ๊ธฐ ์ด์ ๊น์ง, ์ฆ ์ด๋ฆ์์ ์ ์ ์๋ฏ, ๋น๋๊ธฐ์ ํต์ ๋ฐฉ๋ฒ์ด ๋์ค๊ธฐ ์ ๊น์ง๋ ์น ํ์ด์ง์ ๋ณ๊ฒฝ์ฌํญ์ด ์์ ๋์, htmlํ๊ทธ๋ก ์์ํด์ htmlํ๊ทธ๋ก ๋๋๋ ์์ ํ HTML์ ์๋ฒ๋ก๋ถํฐ ์ ์ก๋ฐ์ ์ฒ์๋ถํฐ ๋ค์ ๋ ๋๋งํด ์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํ์๋ค.
์ด๋ด ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๋จ์ ์ด ์์๋ค.
1) ๋ณ๊ฒฝํ ํ์ ์๋ ๋ถ๋ถ๊น์ง ๋ค์ ๋ฐ์์ผ ํ๋ ๋ถํ์ํ ๋ฐ์ดํฐ ํต์ ์ด ๋ฐ์ํ๊ณ ,
2) ์ฒ์๋ถํฐ ๋ค์ ๋ ๋๋ง์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ํ๋ฉด์ด ์๊ฐ์ ์ผ๋ก ๊น๋นก์ด๋ ํ์์ด ๋ฐ์ํ์ผ๋ฉฐ3) ๋น๋๊ธฐ๊ฐ ์๋ ๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ์๋ฒ๋ก๋ถํฐ ์๋ต์ด ์์ ๋๊น์ง ๋ค์ ์ฒ๋ฆฌ๊ฐ ๋ธ๋กํน๋๋ค.
Ajax๊ฐ ๋ฑ์ฅํจ์ผ๋ก์จ ์ด ํจ๋ฌ๋ค์์ ํ๊ธฐ์ ์ผ๋ก ์ ํํ๋ค.
1) ๊ฐฑ์ ์ด ํ์ํ ๋ฐ์ดํฐ๋ง ์ ์ก๋ฐ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ๋ฐ์ดํฐ ํต์ ์ด ๋ฐ์ํ์ง ์๊ณ ,
2) ์ ์ฒด๋ฅผ ๋ค์ ๋ ๋๋งํ์ง ์๊ณ , ํ์ํ ๋ถ๋ถ๋ง ์ฌ๋ ๋๋งํ๊ธฐ ๋๋ฌธ์ ๊น๋นก์ ํ์์ด ๋ฐ์ํ์ง ์์ผ๋ฉฐ,
3) ํด๋ผ์ด์ธํธ ์๋ฒ๊ฐ์ ํต์ ์ด ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ธ ์ดํ ๋ธ๋กํน์ด ๋ฐ์ํ์ง ์๊ฒ ๋์๋ค.
XMLHttpRequest๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค.
const xhr = new XMLHttpRequest(); // XMLHttpRequest ๊ฐ์ฒด์ ์์ฑ xhr.open('GET', '/users'); // HTTP ์์ฒญ ์ด๊ธฐํ xhr.setRequestHeader('content-type', 'application/json'); // HTTP ์์ฒญ ํค๋ ์ค์ xhr.send(); // HTTP ์์ฒญ ์ ์ก // POST ํต์ (๋ชธ์ฒด๊ฐ ์์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ง๋ ฌํ ํ์ฌ ์ ์ก) xhr.open('POST', '/users'); xhr.setRequestHeader('content-type', 'application/json'); // HTTP ์์ฒญ ํค๋ ์ค์ xhr.send(JSON.stringify({id:1, content: 'HTML', completed: false});
fetch API์ ๊ฐ์ฅ ๋๋๋ฌ์ง๋ XMLHttpRequest์ ์ฐจ์ด๋ ์ฌ๊ธฐ๋ผ๊ณ ์๊ฐํ๋๋ฐ, HTTP ์๋ต ์ฒ๋ฆฌ์ XMLHttpRequest๋ ์ด ๊ฐ์ฒด๊ฐ ๋ฐ์์ํค๋ ์ด๋ฒคํธ๋ฅผ ์บ์นํ๋ค.(์ฆ callback์ ํ์ฉํ๋ค.) XMLHttpRequest๋ onreadystatechange, onload, onerror๊ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ๋ฅผ ๊ฐ๋๋ฐ, ์ด ์ค์์ HRRP ์์ฒญ์ ํ์ฌ ์ํ๋ฅผ ๋ํ๋ด๋ readyState ํ๋กํผํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ฐ์ํ๋readystatechange ์ด๋ฒคํธ๋ฅผ ์บ์นํ์ฌ ๋ค์๊ณผ ๊ฐ์ด HTTP ์๋ต์ ์ฒ๋ฆฌํ ์ ์๋ค.
์์ฒ๋ผ xhr ๊ฐ์ฒด๋ฅผ ๋ง๋ ํ, ์๋์ฒ๋ผ ์์ฒญ์ ๋ณด๋ธ ํ ์๋ต์ ๋ฐ์๋ณด์๋ค.
readyState๊ฐ 1์์ DONE ์ํ์ธ 4๋ก ๋ฐ๋์๊ณ , status ๊ฐ์ด 200์ผ๋ก ๋ณํ์ผ๋ฉฐ response์ ๊ฐ์ด ๋ค์ด์จ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ต์ข ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด status ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํตํด ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค. ํน์ HTTP ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๊ฒฝ์ฐ๋ง ๋ฐ์ํ๋ onload ์ด๋ฒคํธ๋ฅผ ํตํด ์๋ต์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
xhr.onload = () => { if(xhr.status ===200){ console.log(JSON.parse(xhr.response)); }else{ console.error('Error', xhr.status, xhr.statusText) } };
์์ ๊ฐ์ด onload ๋ฉ์๋์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋ฐฑ์ ๋ฌ์๋๊ณ ์์ฒญ์ ๋ณด๋ด์, ์๋ต์ด ์๋ฃ๋๋ ๋๋ก ๋ด๊ฐ ์ํ๋ ์ฝ๋ฐฑ์ด ์คํ๋์๋ค.
Ajax ํต์ ์ ํ ์ ์๊ฒ ๋ ๊ฒ์ ์ข์ง๋ง, ๋ญ๊ฐ ๋ฒ๊ฑฐ๋กญ๋ค. ๊ทธ๋ ๊ฒ Fetch API๊ฐ ๋ฑ์ฅํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ค์,
Fetch API๋ XMLHttpRequest๋ณด๋ค ๋ฌด์์ด ๋ ์ข์๊ฐ?
- ๊ฐ๊ฒฐํ๊ณ ๋จ์ํ ๋ฌธ๋ฒ
- Promise๋ฅผ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์ callback์ ํ์ฉํ์ง ์์๋ ๋๋ฉฐ, ํ๋ก๋ฏธ์ค ์ฒด์ด๋์ ํตํด ๋น๋๊ธฐ ์๋ต์ ๋ ์ง๊ด์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
- Headers, Request, Response๋ฅผ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ค์ ํ ์ ์๋ค.
Request const request = new Request('https://jsonplaceholder.typicode.com/users') console.log(request.url) // https://jsonplaceholder.typicode.com/users console.log(request.method) // GET (HTTP method) console.log(request.credentials) // same-origin Response const res = await fetch(request) console.log(res.ok) // true (boolean) console.log(res.status) // 200 (HTTP status) console.log(res.url) // https://jsonplaceholder.typicode.com/users const json = await res.json() // ๋ณธ๋ฌธ์ JSON์ผ๋ก ๊ตฌ๋ฌธ ๋ถ์ const text = await res.text() // ๋ณธ๋ฌธ์ ํ ์คํธ๋ก ๊ตฌ๋ฌธ ๋ถ์ const formData = await res.formData() // ๋ณธ๋ฌธ์ ํผ๋ฐ์ดํฐ ํํ Header const headers = new Headers() headers.append('Content-Type', 'text/xml') const request = new Request('https://jsonplaceholder.typicode.com/users', { headers }) const res = await fetch(request) console.log(res.headers.get('Content-Type')) // application/json; charset=UTF-8
์ด๋ฌํ ์ฃผ์ ์ฐจ์ด์ ๋ค์ด ์์ง๋ง, nextjs์์ ๊ตณ์ด fetch๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ caching์ ๋ํ ์ ์ด๋ฅผ ๋ ๋ชจ๋ํ๊ณ ๊ฐ๊ฒฐํ ๋ฐฉ์์ผ๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ถ๊ฐ๋ก, XMLHttpRequest์ fetch API์ ์บ์ฑ ๋ฐฉ์์ ์์๋ณด์.
XMLHttpRequest์ ์บ์ฑ ๋ฐฉ์
ํค๋์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์บ์ฑ์ ๋ํ ์ต์ ๋ค์ ๋ฌ ์ ์๋ค.
var xhr = new XMLHttpRequest(); xhr.open("GET", "https://example.com/api/data", true); xhr.setRequestHeader("Cache-Control", "no-cache"); xhr.setRequestHeader("Pragma", "no-cache"); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { // Handle the response } }; xhr.send();
fetch API์ ์บ์ฑ ๋ฐฉ์
Request ๊ฐ์ฒด์ cache ํ๋กํผํฐ๋ฅผ ํ์ฉํ๋ฉด ๋๋ฉฐ, XMLHttpRequest๋ณด๋ค ํจ์ฌ ํญ๋์ ์ต์ ์ ์ ๊ณตํ๋ค.
- default : ๋ธ๋ผ์ฐ์ ๋ HTTP ์บ์์์ ์ผ์นํ๋ ์์ฒญ์ ์ฐพ๋๋ค.
- ์ผ์นํ๋ ํญ๋ชฉ์ด ์๊ณ , ์ ํญ๋ชฉ์ธ ๊ฒฝ์ฐ ์บ์์์ ๋ฐํ
- ์ผ์นํ๋ ํญ๋ชฉ์ด ์๊ณ , ์ค๋๋ ํญ๋ชฉ์ด๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์๊ฒฉ ์๋ฒ์ ์กฐ๊ฑด๋ถ ์์ฒญ์ ํจ, ์๋ฒ๊ฐ ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๊ณ ํ์ํ. ๋ฉด, ์บ์์์ ๋ฆฌ์์ค ๋ฐํ, ๋ณ๊ฒฝ๋์๋ค๋ฉด ๋ฆฌ์์ค๊ฐ ์๋ฒ์์ ๋ค์ด๋ก๋๋๊ณ ์บ์๊ฐ ์ ๋ฐ์ดํธ ๋จ.
- ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ผ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์ ์ ์์ฒญ ํ ๋ค์ด๋ก๋๋ ๋ฆฌ์์ค๋ก ์บ์๋ฅผ ์ ๋ฐ์ดํธํจ. - no-store : ๋ธ๋ผ์ฐ์ ๋ ์บ์๋ฅผ ์ดํด๋ณด์ง ์๊ณ ์๊ฒฉ ์๋ฒ์์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค๋ฉฐ, ๋ค์ด๋ก๋๋ ๋ฆฌ์์ค๋ก ์บ์๋ฅผ ์ ๋ฐ์ดํธํ์ง ์์.
- reload : ๋ธ๋ผ์ฐ์ ๋ ์บ์๋ฅผ ์ดํด๋ณด์ง ์๊ณ ์๊ฒฉ ์๋ฒ์์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค๋ฉฐ, ๋ค์ด๋ก๋ ๋ ๋ฆฌ์๋ฅด๋ก ์บ์๋ฅผ ์ ๋ฐ์ดํธ ํจ.
- no-cache : ๋ธ๋ผ์ฐ์ ๋ HTTP ์บ์์์ ์ผ์นํ๋ ์์ฒญ์ ์ฐพ์. ์ ์์ฒญ์ด๋ ์ค๋๋ ์์ฒญ์ด๋ ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์๊ฒฉ ์๋ฒ์ ์กฐ๊ฑด๋ถ ์์ฒญ์ ๋ณด๋. ์๋ฒ๊ฐ ๋ฆฌ์์ค ๋ณ๊ฒฝ์ด ๋์ง ์์๋ค๊ณ ํ๋ฉด ์บ์์์ ๋ฆฌ์์ค๊ฐ ๋ฐํ๋จ. ๋ณ๊ฒฝ์ด ๋์๋ค๋ฉด ๋ฆฌ์์ค๊ฐ ์๋ฒ์์ ๋ค์ด๋ก๋๋๊ณ ์บ์๊ฐ ์ ๋ฐ์ดํธ ๋จ.
์ฝ๋๋ก ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด cache ํ๋กํผํฐ์ ์ํ๋ ์ต์ ์ ๋ฃ์ด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
fetch("https://example.com/api/data", { method: "GET", cache: "no-cache" // Specify caching behavior }) .then(function (response) { if (response.ok) { // Handle the response } }) .catch(function (error) { // Handle errors });
๋ฐ๋ก ์ด๋ฐ ์บ์ฑ ์ต์ ๋ค ๋๋ฌธ์ NextJs๋ fetch API๋ฅผ ํ์ฅํด์ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ ๋ค๋ฉด Axios์๋ ์ด๋ฐ ์บ์ฑ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ ๊ธฐ๋ฅ๋ค์ด ์์๊น? ์๋! ์๋ค!! Axios๋ ์ ์์์๋ ์จ์๋ฏ, ๋ธ๋ผ์ฐ์ ์์๋ XMLHttpRequest๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ์์ธ ์บ์ฑ ์ต์ ๋ค์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ์ํด์๋ ๋ณ๋์ ํจํค์ง ์ค์น๊ฐ ํ์ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ทธ ๋์ ์ฐ๋ฆฌ๋ ์ด๋ค ์ด์ ๋๋ฌธ์ Axios๋ฅผ ์ฌ์ฉํ๊ณ ์์์๊น?
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ serialize, deserialize ํ ํ์๊ฐ ์์ด ๊ฐ์ฒด ํํ๋ก ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
- baseUrl์ ์ค์ ํ ์ ์๋ค.
- default header๋ฅผ ์ค์ ํ ์ ์๋ค.
- request, response interceptor๋ฅผ ํ์ฉํ ์ ์๋ค.
์ ๊ธฐ๋ฅ๋ค์ fetch API๊ฐ ํด์ค ์ ์๋ ๊ฒ๋ค์ด๊ธฐ์, ๋ค์๊ณผ ๊ฐ์ด axios ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ axiosClient๋ฅผ ๋ง๋ ํ ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ค.
// axios.ts
import axios, { AxiosRequestConfig, AxiosError, AxiosHeaders } from 'axios';
const axiosClient = axios.create({baseURL: 'http://localhost:8080',timeout: 8000,headers: {// eslint-disable-next-line @typescript-eslint/naming-convention'Content-type': 'application/json',},});
axiosClient.interceptors.request.use((config: AxiosRequestConfig) => {if (config.headers === undefined) {config.headers = {};}
const token = localStorage.getItem('token');if (token) {(config.headers as AxiosHeaders).set('Authorization', token);}
return config;},(error: AxiosError) => Promise.reject(error),);
export default axiosClient;๊ทธ๋ฌ๋ ๊ณต๋ถ๋ฅผ ํด๋ณด๋, ์บ์ฑ ๊ธฐ๋ฅ๋ค ๋๋ฌธ์ ๊ณต์๋ฌธ์๊ฐ fetch ์ฌ์ฉ์ ๊ถ์ฅํ๊ณ ์๋ ๊ฒ์ ์ดํดํ๊ฒ ๋์๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ด๋ป๊ฒ ํ๋ฉด ์๋ก์ด ํ๋ก์ ํธ์์ ๋ด๊ฐ axios์์ ๋๋ ธ๋ ์ด์ ๋ค์ fetch๋ฅผ ์ฌ์ฉํ๋ฉด์๋ ๋๋ฆด ์ ์์๊น? ์ด ๋ถ๋ถ์ ํด๊ฒฐํ ํ ์ด์ด์ ๊ธ์ ์จ๋ณด๊ธฐ๋ก ํ๋ค.
์ฐธ๊ณ
https://dawonny.tistory.com/286
https://blog.deercorp.com/next-js-app-router-and-fetch-library/
https://developer.mozilla.org/ko/docs/Web/API/Request/cache
๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive