Axios ์™€ Fetch

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๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ด๊ฒƒ์œผ๋กœ ์ฟ ํ‚ค๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์–ด๋„ ์„œ๋ฒ„์— ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

JP
์ด์ค‘ํ‘œFrontend Engineer

3๋…„์ฐจ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž. Next.js, React, TypeScript ๊ธฐ๋ฐ˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์ „๋ฌธ. ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์—์„œ SSRยทISR ๋ Œ๋”๋ง ์ „๋žต ์„ค๊ณ„ ๊ฒฝํ—˜.

์ด๋ ฅ์„œ ๋ณด๊ธฐโ†’