React에서 서버 데이터를 다루는 방식은 크게 두 계층으로 나뉜다.
첫 번째는 HTTP 클라이언트 계층이다. Fetch API와 Axios가 여기에 속하며, 실제 네트워크 요청을 담당한다. 두 번째는 서버 상태 관리 계층이다. Tanstack Query와 SWR이 여기에 속하며, 내부적으로 Fetch API나 Axios를 사용해 요청을 보내고, 그 결과를 클라이언트에서 캐싱·동기화·상태를 관리한다.
일반적으로 HTTP 클라이언트 중 하나를 고르고, 필요에 따라 서버 상태 관리 라이브러리를 조합하는 방식으로 사용한다.
1. Fetch API
브라우저와 Node.js에 기본 내장된 HTTP 요청 API다. 별도 설치 없이 사용할 수 있으며 Promise 기반으로 동작한다. 로우 레벨 API를 지향하기 때문에 응답 파싱, 에러 처리, 인터셉터 등 부가 기능은 직접 구현해야 한다.
기본 사용법
GET 요청
POST 요청
에러 처리
Fetch는 네트워크 오류에만 Promise를 reject한다. HTTP 4xx, 5xx 응답은 정상 응답으로 처리되므로 성공 여부를 직접 확인해야 한다.
요청 취소
AbortController를 통해 진행 중인 요청을 취소할 수 있다.인터셉터
Fetch API는 인터셉터를 기본 제공하지 않는다. 인증 헤더 추가나 에러 공통 처리 같은 작업이 필요하다면
fetch를 래핑한 커스텀 함수를 만들어야 한다.장단점
장점
- 별도 설치 없이 브라우저에서 바로 사용 가능
- 번들 크기 증가 없음 (0kb)
- Web 표준 API이므로 장기적으로 안정적
단점
- HTTP 에러를 자동으로 throw하지 않아 성공 여부 직접 확인 필요
등 응답 파싱을 직접 처리해야 함res.json()- 로우 레벨 API이므로 부가 기능 직접 구현 필요
- 요청 취소 시
처리를 직접 해야 함AbortError - 로딩/에러 상태 관리 없음
2. Axios
브라우저와 Node.js 환경을 모두 지원하는 Promise 기반 HTTP 클라이언트다. JSON 자동 변환, HTTP 에러 자동 throw, 인터셉터, 요청 취소 등 자주 사용하는 기능을 기본으로 제공한다.
기본 사용법
GET 요청
POST 요청
에러 처리
Axios는 2xx 범위 밖의 상태 코드를 자동으로 reject한다.
error.response로 상세 정보에 접근할 수 있다.인터셉터
axios.interceptors로 요청/응답 공통 처리를 간단하게 등록할 수 있다.요청 취소
AbortController를 통해 진행 중인 요청을 취소할 수 있다. 컴포넌트 언마운트 시 요청을 정리할 때 유용하다.장단점
장점
- HTTP 오류 상태 코드에서 자동으로 에러를 throw
- JSON 자동 직렬화/역직렬화
- 요청/응답 인터셉터 지원으로 공통 처리 용이
- 요청 취소, 타임아웃 설정 간편
단점
- 추가 설치 및 번들 크기 증가 (~14kb)
- 캐싱, 로딩/에러 상태 관리는 여전히 직접 구현 필요
3. Tanstack Query
HTTP 클라이언트가 아닌 서버 상태 관리 라이브러리다. 내부적으로 Fetch API나 Axios와 함께 사용한다. 캐싱, 자동 리페치, 로딩/에러 상태, Optimistic Update 등 서버 데이터 동기화에 필요한 기능을 제공한다.
기본 사용법
GET 요청 (useQuery)
POST 요청 (useMutation)
캐싱
queryKey 배열을 기준으로 캐시를 식별한다. 동일한 queryKey로 useQuery를 호출하면 네트워크 요청 없이 캐시를 반환하며, staleTime과 gcTime으로 캐싱 전략을 세밀하게 제어할 수 있다.
: 캐시를 fresh로 유지하는 시간. 이 시간 동안은 리페치가 발생하지 않는다. 기본값은 0(즉시 stale).staleTime
: 사용하지 않는 캐시를 메모리에 보관하는 시간. 기본값은 5분(300,000ms).gcTime
로딩·에러 상태
isPending, isError, isFetching 등의 상태를 자동으로 제공한다. v5에서는 isLoading과 isPending이 구분된다.
: 아직 캐시된 데이터가 없는 상태 (isPending
)status === 'pending'
:isLoading
— 첫 번째 요청이 진행 중인 상태isPending && isFetching
: 백그라운드 리페치 포함, 요청이 진행 중인 모든 상태isFetching
자동 리페치
특정 상황에 데이터를 자동으로 다시 가져온다. 브라우저 탭이 활성화되거나 네트워크가 재연결될 때 오래된 캐시를 갱신하므로, 사용자가 항상 최신 데이터를 볼 수 있다.
Devtools
@tanstack/react-query-devtools 패키지를 추가하면 캐시 상태, 쿼리 목록, 요청 타이밍 등을 시각적으로 확인할 수 있다.장단점
장점
- 서버 상태(캐싱, 동기화, 리페치) 자동 관리
- 로딩, 에러, 성공 상태 자동 제공
- 백그라운드 리페치, 포커스 시 리페치 등 다양한 옵션
- Mutation 후 캐시 무효화로 일관성 유지
- Devtools 지원
단점
- 학습 곡선이 있음 (queryKey 전략, 캐시 무효화 등)
- 단순 요청에는 설정 비용이 높음
- 번들 크기 증가 (~13kb)
4. SWR
Vercel에서 만든 React 데이터 페칭 라이브러리다.
useSWR 훅 하나로 캐싱과 자동 리페치를 간편하게 사용할 수 있다. Tanstack Query보다 API가 단순하고 번들 크기가 작지만, 복잡한 서버 상태 시나리오에는 기능이 부족할 수 있다.기본 사용법
GET 요청 (useSWR)
POST 요청 (useSWRMutation)
캐싱과 자동 리페치
요청 URL(또는 키)을 기준으로 데이터를 캐싱하며, 동일한 키로
useSWR을 호출하면 네트워크 요청 없이 캐시를 반환한다. 브라우저 탭이 포커스되거나 네트워크가 재연결될 때 자동으로 최신 데이터를 가져온다.미들웨어
SWR은 미들웨어를 공식적으로 지원한다.
SWRConfig의 use 옵션에 미들웨어 함수를 등록하면 모든 useSWR 훅 호출을 감싸는 레이어를 추가할 수 있다. 로깅, 요청 지연 측정, 에러 리포팅 등 횡단 관심사를 한곳에서 처리하기에 적합하다.Next.js 통합
SWR은 Next.js와 함께 사용할 때 서버에서 미리 가져온 데이터를 초기값으로 주입하는 패턴이 간단하다.
fallback 옵션에 서버 데이터를 넘기면 클라이언트에서 추가 요청 없이 즉시 렌더링하고, 이후 백그라운드에서 갱신한다.장단점
장점
- 간결한 API로 빠르게 적용 가능
- 기본 캐싱, 자동 리페치 지원
- 미들웨어로 중간 로직 처리 가능
- 번들 크기가 작음 (~5.7kb)
- Vercel/Next.js 환경에 최적화
단점
- 복잡한 서버 상태 시나리오에는 기능이 부족할 수 있음
비교 표
| 항목 | Fetch API | Axios | Tanstack Query | SWR |
|---|---|---|---|---|
| 번들 크기 | 0kb | ~14kb | ~13kb | ~5.7kb |
| 캐싱 | X | X | O | O |
| 자동 리페치 | X | X | O | O |
| 로딩/에러 상태 | 직접 관리 | 직접 관리 | 자동 | 자동 |
| 요청 취소 | O | O | 자동 | 자동 |
| Mutation | X | X | useMutation | useSWRMutation |
| 부가 기능 | - | 인터셉터 | Devtools | 미들웨어 |
| 학습 곡선 | 낮음 | 낮음 | 높음 | 중간 |
선택 기준
1. Fetch API를 선택할 때
- 외부 의존성을 최소화해야 하는 경우
- 간단한 기능으로 충분한 경우
- 번들 크기에 민감한 환경
2. Axios를 선택할 때
- Fetch API보다 확장된 기능이 필요한 경우
- 인터셉터로 중간 로직 처리가 필요한 경우
3. Tanstack Query를 선택할 때
- 서버 상태 및 동기화를 체계적으로 관리해야 하는 경우
- 복잡한 데이터 페칭 시나리오 (무한 스크롤, Optimistic Update 등)
4. SWR을 선택할 때
- 간단한 캐싱과 자동 리페치가 필요하지만 Tanstack Query까지는 과한 경우
- Next.js/Vercel 환경에서 가볍게 사용하고 싶은 경우
- 번들 크기를 줄이면서도 기본적인 서버 상태 기능이 필요한 경우
- 미들웨어로 중간 로직 처리가 필요한 경우
마무리
Fetch API, Axios 같은 HTTP 클라이언트와 Tanstack Query, SWR 같은 서버 상태 관리 라이브러리를 조합해 데이터 페칭 전반을 관리할 수 있다. 예를 들어 간단한 기능만 필요하다면 Fetch API + SWR 조합으로 충분하고, 데이터 관리가 복잡한 프로젝트에서는 Axios + Tanstack Query가 더 나은 선택이다. Next.js 환경에서 서버 사이드 데이터 페칭이 많아 Fetch API 확장 기능을 충분히 활용할 수 있고, 체계적인 클라이언트 상태 관리도 필요하다면 Fetch API + Tanstack Query가 적절하다. 혹은 상태 관리 라이브러리 없이 HTTP 클라이언트만으로 직접 구현할 수도 있다. 결국 각 프로젝트의 요구사항에 맞게 적절한 조합을 선택하는 것이 중요하다.


