๐Ÿ—‚๏ธ Axios ๋ž€?

๊น€์ˆ˜์ง„ยท2025๋…„ 5์›” 27์ผ

Axios

๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„ ๊ฐ„์— HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
์‰ฝ๊ฒŒ ๋งํ•ด: ํ”„๋ก ํŠธ์—”๋“œ โ†’ ๋ฐฑ์—”๋“œ(API ์„œ๋ฒ„) ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜ ๋ฐ›์•„์˜ฌ ๋•Œ ์“ฐ๋Š” ๋„๊ตฌ์ด๋‹ค.

Axios vs fetch

๋‘๊ฐœ ๋ชจ๋‘ HTTP์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‘๊ฐœ์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ผ๊นŒ?

ํ•ญ๋ชฉAxiosfetch()
์ง€์› ์—ฌ๋ถ€์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์„ค์น˜ ํ•„์š”)๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ๋‚ด์žฅ
๋ฌธ๋ฒ• ๊ฐ„๊ฒฐ์„ฑ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ๋‹ค์†Œ ๋ณต์žก (ํŠนํžˆ ์—๋Ÿฌ/JSON ์ฒ˜๋ฆฌ)
์‘๋‹ต JSON ์ž๋™ ์ฒ˜๋ฆฌ์ž๋™ ํŒŒ์‹ฑ (res.data)์ˆ˜๋™์œผ๋กœ .json() ํ˜ธ์ถœ ํ•„์š”
์—๋Ÿฌ ์ฒ˜๋ฆฌHTTP ์˜ค๋ฅ˜๋„ .catch()๋กœ ์žกํž˜200~299 ์™ธ ์—๋Ÿฌ๋Š” ์ง์ ‘ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ
์š”์ฒญ/์‘๋‹ต ์ธํ„ฐ์…‰ํ„ฐ๊ฐ€๋Šฅ๋ถˆ๊ฐ€๋Šฅ
์š”์ฒญ ์ทจ์†ŒCancelToken ์ง€์›์ง์ ‘ AbortController ์จ์•ผ ํ•จ
๋ธŒ๋ผ์šฐ์ € ์ง€์›IE ํฌํ•จ ๋Œ€๋ถ€๋ถ„ ๋ธŒ๋ผ์šฐ์ €IE ๋ฏธ์ง€์›
ํ—ค๋” ์„ค์ •์‰ฌ์›€์ƒ๋Œ€์ ์œผ๋กœ ๋ณต์žกํ•จ

fetch() ์‚ฌ์šฉ ์˜ˆ์‹œ

// fetch๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๊ธฐ๋ณธ ๋‚ด์žฅ๋œ ํ•จ์ˆ˜๋กœ, URL์— HTTP ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค
fetch("https://jsonplaceholder.typicode.com/users")
  .then((res) => {
    // res.ok๋Š” HTTP ์ƒํƒœ์ฝ”๋“œ๊ฐ€ 200~299 ๋ฒ”์œ„์ผ ๋•Œ true์ด๋‹ค
    if (!res.ok) {
      throw new Error("HTTP ์˜ค๋ฅ˜: " + res.status); // ์ˆ˜๋™์œผ๋กœ ์—๋Ÿฌ ์ฒดํฌ ํ•„์š”
    }
    return res.json(); // ์‘๋‹ต ๋ณธ๋ฌธ์„ JSON์œผ๋กœ ๋ณ€ํ™˜ (๋น„๋™๊ธฐ ์ž‘์—…)
  })
  .then((data) => {
    // ์œ„์—์„œ ํŒŒ์‹ฑํ•œ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์‚ฌ์šฉ
    console.log("์œ ์ € ๋ฐ์ดํ„ฐ (fetch):", data);
  })
  .catch((err) => {
    // ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜ ๋˜๋Š” ์œ„์—์„œ throwํ•œ ์—๋Ÿฌ๊ฐ€ catch๋กœ ์žกํž˜
    console.error("์—๋Ÿฌ ๋ฐœ์ƒ (fetch):", err);
  });

Axios ์‚ฌ์šฉ ์˜ˆ์‹œ

// axios๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, HTTP ์š”์ฒญ์„ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค
import axios from 'axios';
axios.get("https://jsonplaceholder.typicode.com/users")
  .then((res) => {
    // res.data๋Š” ์ด๋ฏธ JSON์œผ๋กœ ์ž๋™ ํŒŒ์‹ฑ๋œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค
    console.log("์œ ์ € ๋ฐ์ดํ„ฐ (axios):", res.data);
  })
  .catch((err) => {
    // ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋ฟ ์•„๋‹ˆ๋ผ HTTP ์ƒํƒœ์ฝ”๋“œ ์—๋Ÿฌ(404, 500 ๋“ฑ)๋„ ์ž๋™์œผ๋กœ catch๋จ
    console.error("์—๋Ÿฌ ๋ฐœ์ƒ (axios):", err);
  });

Axios ์„ค์น˜

pnpm add axios
๋˜๋Š” 
npm install axios

์ฃผ์š” ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ์„ค๋ช…
axios.get(url)๋ฐ์ดํ„ฐ ์กฐํšŒ
axios.post(url, data)๋ฐ์ดํ„ฐ ์ „์†ก
axios.put(url, data)์ „์ฒด ์ˆ˜์ •
axios.patch(url, data)์ผ๋ถ€ ์ˆ˜์ •
axios.delete(url)๋ฐ์ดํ„ฐ ์‚ญ์ œ

โœ… axios.get(url)

์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ "์กฐํšŒ(GET)" ํ•  ๋•Œ ์‚ฌ์šฉ
์‚ฌ์šฉ ์ƒํ™ฉ) ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก ์กฐํšŒ, ํŠน์ • ์œ ์ € ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

import axios from 'axios';

// ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ์กฐํšŒ
axios.get('https://jsonplaceholder.typicode.com/users')
  .then((res) => {
    // res.data์—๋Š” JSON ํ˜•ํƒœ์˜ ์œ ์ € ๋ฐฐ์—ด์ด ๋‹ด๊ฒจ ์žˆ์Œ
    console.log('์œ ์ € ๋ฆฌ์ŠคํŠธ:', res.data);
  })
  .catch((err) => {
    // ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋‚˜ HTTP ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์‹คํ–‰๋จ
    console.error('์กฐํšŒ ์‹คํŒจ:', err);
  });

โœ… axios.post(url, data)

์„œ๋ฒ„์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ "์ƒ์„ฑ(POST)" ํ•  ๋•Œ ์‚ฌ์šฉ
์‚ฌ์šฉ ์ƒํ™ฉ) ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ๋Œ“๊ธ€/๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ

// ์„œ๋ฒ„์— ์ƒˆ ๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜์—ฌ ์ƒ์„ฑ ์š”์ฒญ
axios.post('https://jsonplaceholder.typicode.com/posts', {
  title: '์ƒˆ ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ',      // ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ
  body: '๊ฒŒ์‹œ๊ธ€ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.',   // ๊ฒŒ์‹œ๊ธ€ ๋ณธ๋ฌธ
  userId: 1                     // ์ž‘์„ฑ์ž ID
})
.then((res) => {
  // ์ƒ์„ฑ๋œ ๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ๊ฐ€ res.data์— ๋‹ด๊ฒจ์„œ ๋Œ์•„์˜ด
  console.log('๊ฒŒ์‹œ๊ธ€ ์ƒ์„ฑ ๊ฒฐ๊ณผ:', res.data);
})
.catch((err) => {
  // ์š”์ฒญ ์‹คํŒจ ๋˜๋Š” ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  console.error('๊ฒŒ์‹œ๊ธ€ ์ƒ์„ฑ ์‹คํŒจ:', err);
});

โœ… axios.put(url, data)

ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ "์™„์ „ํžˆ ๋ฎ์–ด์”Œ์šฐ๋Š”" ์ˆ˜์ •(์ „์ฒด ์—…๋ฐ์ดํŠธ) ์— ์‚ฌ์šฉ
์‚ฌ์šฉ ์ƒํ™ฉ) ๋งˆ์ดํŽ˜์ด์ง€ ์ •๋ณด ์ „์ฒด ์ˆ˜์ •, ๊ฒŒ์‹œ๊ธ€ ํ†ต์งธ๋กœ ๋ฎ์–ด์“ฐ๊ธฐ

// ๊ธฐ์กด ๊ฒŒ์‹œ๊ธ€ ์ „์ฒด๋ฅผ ์ƒˆ ๋ฐ์ดํ„ฐ๋กœ ๋ฎ์–ด์“ฐ๊ธฐ (๋ชจ๋“  ํ•„๋“œ๋ฅผ ๋‹ค์‹œ ๋ณด๋‚ด์•ผ ํ•จ)
axios.put('https://jsonplaceholder.typicode.com/posts/1', {
  title: '์ „์ฒด ์ˆ˜์ •๋œ ์ œ๋ชฉ',
  body: '์ „์ฒด ์ˆ˜์ •๋œ ๋‚ด์šฉ',
  userId: 1
})
.then((res) => {
  // ์ˆ˜์ •๋œ ๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜
  console.log('์ „์ฒด ์ˆ˜์ • ๊ฒฐ๊ณผ:', res.data);
})
.catch((err) => {
  console.error('์ „์ฒด ์ˆ˜์ • ์‹คํŒจ:', err);
});

โœ… axios.patch(url, data)

ํŠน์ • ๋ฐ์ดํ„ฐ์˜ "์ผ๋ถ€๋ถ„๋งŒ" ์ˆ˜์ • ํ•  ๋•Œ ์‚ฌ์šฉ
์‚ฌ์šฉ ์ƒํ™ฉ) ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ๋งŒ ์ˆ˜์ •, ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ํ•œ ๊ฐ€์ง€๋งŒ ๋ณ€๊ฒฝ

// ๊ธฐ์กด ๊ฒŒ์‹œ๊ธ€์˜ ์ผ๋ถ€๋งŒ ์ˆ˜์ • (์—ฌ๊ธฐ์„  ์ œ๋ชฉ๋งŒ ์ˆ˜์ •)
axios.patch('https://jsonplaceholder.typicode.com/posts/1', {
  title: '๋ถ€๋ถ„๋งŒ ์ˆ˜์ •๋œ ์ œ๋ชฉ'
})
.then((res) => {
  // ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •๋œ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜
  console.log('๋ถ€๋ถ„ ์ˆ˜์ • ๊ฒฐ๊ณผ:', res.data);
})
.catch((err) => {
  console.error('๋ถ€๋ถ„ ์ˆ˜์ • ์‹คํŒจ:', err);
});

โœ… axios.delete(url)

ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ "์‚ญ์ œ(DELETE)" ํ•  ๋•Œ ์‚ฌ์šฉ
์‚ฌ์šฉ ์ƒํ™ฉ) ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ, ๋Œ“๊ธ€ ์‚ญ์ œ, ๊ณ„์ • ํƒˆํ‡ด

// ํŠน์ • ID๋ฅผ ๊ฐ€์ง„ ๊ฒŒ์‹œ๊ธ€์„ ์‚ญ์ œ ์š”์ฒญ
axios.delete('https://jsonplaceholder.typicode.com/posts/1')
  .then((res) => {
    // ์‚ญ์ œ๋Š” ๋ณดํ†ต ๋‚ด์šฉ ์—†์ด ์ƒํƒœ ์ฝ”๋“œ๋งŒ ๋Œ์•„์˜ด (204 No Content)
    console.log('์‚ญ์ œ ์™„๋ฃŒ, ์ƒํƒœ์ฝ”๋“œ:', res.status);
  })
  .catch((err) => {
    console.error('์‚ญ์ œ ์‹คํŒจ:', err);
  });

0๊ฐœ์˜ ๋Œ“๊ธ€