
Axios ์ Fetch
๐ axios
๐ axios vs fetch
Fetch API๋ ๋คํธ์ํฌ ์์ฒญ์ ์ํด fetch()๋ผ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค์ด๋ค. ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ๋์ด ์์ด ๋ฐ๋ก ์ค์นํ ํ์๊ฐ ์๋ค. node.js์ ์คํ์ ๊ธฐ๋ฅ์ ํ์ฑํํ์ฌ ์ฌ์ฉํ ์ ์๋ค. Axios๋ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก CDN ํน์ npm ์ด๋ yarn๊ณผ ๊ฐ์ ํจํค์ง ๋งค๋์ ๋ฅผ ํตํด ์ค์นํ์ฌ ํ๋ก์ ํธ์ ์ถ๊ฐํ ์ ์๋ค. Axios๋ ๋ธ๋ผ์ฐ์ ํน์ node.js ํ๊ฒฝ์์ ์คํํ ์ ์๋ค. Fetch ์ axios๋ ๋ชจ๋ promise ๊ธฐ๋ฐ์ HTTP ํด๋ผ์ด์ธํธ์ด๋ค. ์ฆ ์ด ํด๋ผ์ด์ธํธ๋ฅผ ์ด์ฉํด ๋คํธ์ํฌ ์์ฒญ์ ํ๋ฉด ์ดํ(resolve) ํน์ ๊ฑฐ๋ถ(reject)ํ ์ ์๋ promise๊ฐ ๋ฐํ๋๋ค.
|axios|fetch| |------|-------| |์จ๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ค์น๊ฐ ํ์|ํ๋ ๋ธ๋ผ์ฐ์ ์ ๋นํธ์ธ์ด๋ผ ์ค์น ํ์ ์์| |XSRF ๋ณดํธ๋ฅผ ํด์ค๋ค.|๋ณ๋ ๋ณดํธ ์์| |data ์์ฑ์ ์ฌ์ฉ|body ์์ฑ์ ์ฌ์ฉ| |data๋ object๋ฅผ ํฌํจํ๋ค|body๋ ๋ฌธ์์ดํ ๋์ด์๋ค| |status๊ฐ 200์ด๊ณ statusText๊ฐ โOKโ์ด๋ฉด ์ฑ๊ณต์ด๋ค|์๋ต๊ฐ์ฒด๊ฐ ok ์์ฑ์ ํฌํจํ๋ฉด ์ฑ๊ณต์ด๋ค| |์๋์ผ๋ก JSON๋ฐ์ดํฐ ํ์์ผ๋ก ๋ณํ๋๋ค|.json()๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.| |์์ฒญ์ ์ทจ์ํ ์ ์๊ณ ํ์์์์ ๊ฑธ ์ ์๋ค.|ํด๋น ๊ธฐ๋ฅ ์กด์ฌ ํ์ง์์| |HTTP ์์ฒญ์ ๊ฐ๋ก์ฑ์ ์์| ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ์ง ์์| |download์งํ์ ๋ํด ๊ธฐ๋ณธ์ ์ธ ์ง์์ ํจ|์ง์ํ์ง ์์| |์ข๋ ๋ง์ ๋ธ๋ผ์ฐ์ ์ ์ง์๋จ|Chrome 42+, Firefox 39+, Edge 14+, and Safari 10.1+์ด์์ ์ง์|
์์ ๊ฐ์ ํ๋ฅผ ๋ณด์์ ๋ axios๋ ๋ณ๋์ ์ค์น๊ฐ ํ์ํ๋ค๋ ๋จ์ ์ด ์์ง๋ง ๊ทธ๊ฒ์ ์ปค๋ฒํ ๋งํ fetch ๋ณด๋ค ๋ง์ ๊ธฐ๋ฅ ์ง์๊ณผ ๋ฌธ๋ฒ์ด ์กฐ๊ธ์ด๋๋ง ๊ฐ์ํ ๋๋ค๋ ์ฅ์ ์ด ์๋ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๋ฐ๋ผ์, ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ๋๋ fetch๋ฅผ ์ฐ๊ณ , ์ด์ธ์ ํ์ฅ์ฑ์ ์ผ๋ํด๋ดค์ ๋ axios๋ฅผ ์ฐ๋ฉด ์ข๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
๐ axios ์์ฒญ(request) ํ๋ผ๋ฏธํฐ ์ต์
- **method **: ์์ฒญ๋ฐฉ์. (get์ด ๋ํดํธ)
- url : ์๋ฒ ์ฃผ์
- baseURL : url์ ์๋๊ฒฝ๋ก๋ก ์ธ๋ url ๋งจ ์์ ๋ถ๋ ์ฃผ์. ์๋ฅผ๋ค์ด, url์ด /post ์ด๊ณ baseURL์ด https://some-domain.com/api/ ์ด๋ฉด, https://some-domain.com/api/post๋ก ์์ฒญ ๊ฐ๊ฒ ๋๋ค.
- **headers **: ์์ฒญ ํค๋
- data : ์์ฒญ ๋ฐฉ์์ด 'PUT', 'POST', 'PATCH' ํด๋นํ๋ ๊ฒฝ์ฐ body์ ๋ณด๋ด๋ ๋ฐ์ดํฐ
- params : URL ํ๋ผ๋ฏธํฐ ( ?key=value ๋ก ์์ฒญํ๋ url get๋ฐฉ์์ ๊ฐ์ฒด๋ก ํํํ ๊ฒ)
- timeout : ์์ฒญ timeout์ด ๋ฐ๋ ๋๊ธฐ ์ milliseconds์ ์๊ฐ์ ์์ฒญ. timeout ๋ณด๋ค ์์ฒญ์ด ๊ธธ์ด์ง๋ค๋ฉด, ์์ฒญ์ ์ทจ์๋๊ฒ ๋๋ค.
- responseType : ์๋ฒ๊ฐ ์๋ตํด์ฃผ๋ ๋ฐ์ดํฐ์ ํ์ ์ง์ (arraybuffer, documetn, json, text, stream, blob)
- responseEncoding : ๋์ฝ๋ฉ ์๋ต์ ์ฌ์ฉํ๊ธฐ ์ํ ์ธ์ฝ๋ฉ (utf-8)
- transformRequest : ์๋ฒ์ ์ ๋ฌ๋๊ธฐ ์ ์ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฟ ์ ์๋ค. ์์ฒญ ๋ฐฉ์ 'PUT', 'POST', 'PATCH', 'DELETE' ์ ํด๋นํ๋ ๊ฒฝ์ฐ์ ์ด์ฉ ๊ฐ๋ฅ ๋ฐฐ์ด์ ๋ง์ง๋ง ํจ์๋ string ๋๋ Buffer, ๋๋ ArrayBuffer๋ฅผ ๋ฐํํฉ
- header: ๊ฐ์ฒด๋ฅผ ์์ ๊ฐ๋ฅ
- transformResponse : ์๋ต ๋ฐ์ดํฐ๊ฐ ๋ง๋ค์ด์ง๊ธฐ ์ ์ ๋ณํ ๊ฐ๋ฅ
- **withCredentials **: cross-site access-control ์์ฒญ์ ํ์ฉ ์ ๋ฌด. ์ด๋ฅผ true๋ก ํ๋ฉด cross-origin์ผ๋ก ์ฟ ํค๊ฐ์ ์ ๋ฌ ํ ์ ์๋ค.
- auth : HTTP์ ๊ธฐ๋ณธ ์ธ์ฆ์ ์ฌ์ฉ. auth๋ฅผ ํตํด์ HTTP์ ๊ธฐ๋ณธ ์ธ์ฆ์ด ๊ตฌ์ฑ์ด ๊ฐ๋ฅ
- maxContentLength: http ์๋ต ๋ด์ฉ์ max ์ฌ์ด์ฆ๋ฅผ ์ง์ ํ๋๋ก ํ๋ ์ต์
- validateStatus : HTTP์๋ต ์ํ ์ฝ๋์ ๋ํด promise์ ๋ฐํ ๊ฐ์ด resolve ๋๋ - - reject ํ ์ง ์ง์ ํ๋๋ก ํ๋ ์ต์
- maxRedirects : node.js์์ ์ฌ์ฉ๋๋ ๋ฆฌ๋ค์ด๋ ํธ ์ต๋์น๋ฅผ ์ง์
- httpAgent / httpsAgent : node.js์์ http๋ https๋ฅผ ์์ฒญ์ ํ ๋ ์ฌ์ฉ์ ์ ์ agent๋ฅผ ์ ์ํ๋ ์ต์
- proxy : proxy์๋ฒ์ hostname๊ณผ port๋ฅผ ์ ์ํ๋ ์ต์
- cancelToken : ์์ฒญ์ ์ทจ์ํ๋๋ฐ ์ฌ์ฉ๋์ด ์ง๋ ์ทจ์ํ ํฐ์ ๋ช
์

๐ axios ์๋ต(response) ๋ฐ์ดํฐ
axios๋ฅผ ํตํด ์์ฒญ์ ์๋ฒ์๊ฒ ๋ณด๋ด๋ฉด, ์๋ฒ์์ ์ฒ๋ฆฌ๋ฅผํ๊ณ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์ ์๋ต ํ๊ฒ ๋๋ค.
์ด๋ฅผ .then์ผ๋ก ํจ์์ธ์๋ก(response)๋ก ๋ฐ์ ๊ฐ์ฒด์ ๋ด์ง ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ก ์๋ต ๋ฐ์ดํฐ์ด๋ค.
ajax๋ฅผ ํตํด ์๋ฒ๋ก๋ถํฐ ๋ฐ๋ ์๋ต์ ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ๋ค.


๐ Axios ๋จ์ถ ๋ฉ์๋
axios๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด ๋ชจ๋ ์์ฒญ ๋ฉ์๋๋ aliases๊ฐ ์ ๊ณต๋๋ค. ์ ์ฒ๋ผ ๊ฐ์ฒด ์ต์ ์ ์ด๊ฒ์ ๊ฒ ์ฃผ๋ฉด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ณ ๋์ ๋ถํ๋, ํจ์ํ์ผ๋ก ์ฌ๊ตฌ์ฑํ์ฌ ๋๋ ๋ ผ ๊ฒ์ผ๋ก ์ดํดํ๋ฉด ๋๋ค. axios์ Request method์๋ ๋ํ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
GET : axios.get(url[, config]) POST : axios.post(url, data[, config]) PUT : axios.put(url, data[, config]) DELETE : axios.delete(url[, config])
๐ง axios GET
get ๋ฉ์๋์๋ 2๊ฐ์ง ์ํฉ์ด ํฌ๊ฒ ์กด์ฌํ๋ค.
- ๋จ์ ๋ฐ์ดํฐ(ํ์ด์ง ์์ฒญ, ์ง์ ๋ ์์ฒญ) ์์ฒญ์ ์ํํ ๊ฒฝ์ฐ
- ํ๋ผ๋ฏธํฐ ๋ฐ์ดํฐ๋ฅผ ํฌํจ์ํค๋ ๊ฒฝ์ฐ (์ฌ์ฉ์ ๋ฒํธ์ ๋ฐ๋ฅธ ์กฐํ)


๐ง axios POST
post ๋ฉ์๋์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ Message Body์ ํฌํจ์์ผ ๋ณด๋ธ๋ค. ์์์ ๋ดค๋ get ๋ฉ์๋์์ params๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ๋น์ทํ๊ฒ ์ํ๋๋ค.
๐ง axios Delete
delete ๋ฉ์๋์๋ ์ผ๋ฐ์ ์ผ๋ก body๊ฐ ๋น์ด์๋ค. REST ๊ธฐ๋ฐ API ํ๋ก๊ทธ๋จ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋์ด ์๋ ๋ด์ฉ์ ์ญ์ ํ๋ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
๐ง axios Put
REST ๊ธฐ๋ฐ API ํ๋ก๊ทธ๋จ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋์ด ์๋ ๋ด์ฉ์ ๊ฐฑ์ (์์ )ํ๋ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.. PUT๋ฉ์๋๋ ์๋ฒ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ฃผ ๋ชฉ์ ์ผ๋ก ํ๊ณ ์๋ค. put ๋ฉ์๋๋ ์๋ฒ ๋ด๋ถ์ ์ผ๋ก get -> post ๊ณผ์ ์ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ post ๋ฉ์๋์ ๋น์ทํ ํํ์ด๋ค.
๐ withCredentials ์ต์
ํ์ค CORS์์ฒญ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฟ ํค๋ฅผ ์ค์ ํ๊ฑฐ๋ ๋ณด๋ผ ์ ์๋ค. ํ๋ก ํธ์์ axios์์ฒญํ ๋, withCredentials๋ถ๋ถ์ true๋ก ํด์ ์๋์ผ๋ก CORS ์์ฒญ์ ์ฟ ํค๊ฐ์ ๋ฃ์ด์ค์ผ ํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ฒ๋ ์๋ตํค๋์ Access-Control-Allow-Credentials๋ฅผ true๋ก ์ค์ ํด์ผ ํ๋ค. ์ด๊ฒ์ผ๋ก ์ฟ ํค๊ฐ ์ ๋ฐ์ดํธ ๋์ด๋ ์๋ฒ์ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋ค.




