리액트 API 연동: Axios 한 번에 정리(로딩·에러·취소)
Axios는 인스턴스·인터셉터로 공통 헤더·에러 포맷·타임아웃을 표준화하기에 적합합니다. 예제로 실무 기본 흐름(로딩/에러/요청 취소)을 알아봅니다.
fetch vs Axios: 무엇을 쓸까?
- fetch: 브라우저 내장(외부 설치 불필요).
AbortController로 취소,Response.ok체크·직접 파싱 필요. - Axios: 인스턴스/인터셉터·타임아웃·JSON 자동 변환 등 DX(개발 편의)가 좋음. Node/브라우저 양쪽에서 동일 코드로 쓰기 쉬움.
가이드: 의존성 최소·간단한 연동이면 fetch, 범용 공통 헤더·토큰·리트라이·에러 표준화가 필요하면 Axios 권장.
1) axios 인스턴스 + 인터셉터
1. 패키지 설치
npm i axios2. HTTP 인스턴스 파일
// src/lib/http.js
import axios from "axios";
export const http = axios.create({
baseURL: "https://jsonplaceholder.typicode.com",
timeout: 10000,
});
// 요청 인터셉터(토큰/공통 헤더)
http.interceptors.request.use((config) => {
// const token = localStorage.getItem("token");
// if (token) config.headers.Authorization = `Bearer ${token}`;
return config;
});
// 응답 인터셉터(에러 메시지 표준화)
http.interceptors.response.use(
(res) => res,
(error) => {
const status = error.response?.status;
const message = error.response?.data?.message || error.message;
return Promise.reject(new Error(status ? `[${status}] ${message}` : message));
}
);2) 예제: UsersAxiosBasic (로딩/에러/취소)
// src/examples/UsersAxiosBasic.jsx
import React, { useEffect, useState } from "react";
import { http } from "../lib/http";
export default function UsersAxiosBasic() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [err, setErr] = useState(null);
useEffect(() => {
const ctrl = new AbortController();
async function run() {
setLoading(true); setErr(null);
try {
const { data } = await http.get("/users", { signal: ctrl.signal });
setData(data);
} catch (e) {
if (e.name !== "CanceledError") setErr(e);
} finally {
setLoading(false);
}
}
run();
return () => ctrl.abort();
}, []);
if (loading) return <p>로딩 중...</p>;
if (err) return <p>에러: {String(err.message || err)}</p>;
return <pre>{JSON.stringify(data, null, 2)}</pre>;
}▼ 실행 화면: UsersAxiosBasic (axios) 선택 시 /users API를 호출해 로딩 → 사용자 JSON 목록이 출력되는 모습(에러 발생 시 메시지 표시).

체크리스트
- 로딩/에러/빈 상태 UI는 항상 명확히.
- 페이지 전환·탭 전환 시 이전 요청은 AbortController로 취소.
- 공통 규칙은 axios 인스턴스(헤더/타임아웃/에러 포맷/인터셉터)에 몰아넣기.
참고 링크
함께 보면 좋은 게시글
- 리액트 useEffect 사용법: 의존성 배열과 생명주기 이해
- 리액트 커스텀 훅 만들기: useLocalStorage·useFetch 핵심 2가지
- React 이벤트 처리 방법: onClick·onChange·onSubmit 예제
- 리액트 라우터 DOM 설치 및 기본 사용법(React Router v6)
- 리액트 useReducer vs useState: 언제 쓰고 어떻게 마이그레이션할까
이 글이 도움이 되셨다면 공유 부탁 드립니다.



