-
[Next.js] useSWR + axios로 비동기로 데이터 가져오기개발공부/Next.js 2024. 5. 26. 16:19
본 글은 Next.js에서 useSWR와 axios를 사용해 서버에 비동기로 데이터를 가져오는 방법을 다룬 내용입니다.
목차
useSWR
데이터 페칭을 위한 Hook으로 데이터 요청과 캐싱을 쉽게 관리할 수 있도록 해준다.
이전 데이터를 유지하면서 백그라운드에서 새로운 데이터를 가져와 업데이트 하는 방식이다.
기본 형태는 아래와 같다.
// 0. 설치 yarn add swr // 1. import import useSWR from 'swr'; // 2. 선언 (key: '/api/user', 데이터 가져오는 함수: fetcher) const { data, error, isLoading } = useSWR('/api/user', fetcher);
(필수 값은 색깔로 표시)
파라미터
- key
- 데이터를 식별하는 고유한 문자열 또는 함수
- 일반적으로 API 엔드포인트 URL
- fetcher
- 데이터를 가져오는 함수
- key를 인자로 받아 데이터를 페칭
- 주로 Axios, Fetch API 등을 사용
- options
- refreshInterval: 데이터 갱신 주기 설정, 밀리초 단위로 설정하여 지정한 간격으로 데이터를 자동으로 갱신
- refreshOnFocus: 브라우저 창이 포커스를 받을 때 데이터를 재검증 (기본 값: true)
- revaliddateOnReconnect: 네트워크가 재연결될 때 데이터를 재검증 (기본 값: true)
- dedupingInterval: 동일 키로 중복된 요청을 방지하기 위한 간격 설정 (기본 값: 2000ms)
- focusThrottleInterval: 포커스가 여러 번 변경될 때 재검증 간격 설정 (기본 값: 5000ms)
- initialData: 초기 데이터 설정, 서버 사이드 렌더링 또는 정적 사이트 생성 시 사용
- onSuccess: 데이터 페칭이 성공했을 때 호출되는 콜백 함수
- onError: 데이터 페칭이 실패했을 때 호출되는 콜백 함수
- revalidateIfStale: 데이터가 오래된 경우 컴포넌트가 마운트될 때 데이터를 재검증 (기본 값: true)
- revalidateOnMount: 컴포넌트가 마운트될 때 무조건 데이터 재검증 (기본 값: true)
- fallbackData: initialData와 유사, 컴포넌트가 처음 마운트될 때만 사용, 이후에는 캐시된 데이터가 우선 사용
장점
- 자동 재검증
- 설정한 간격으로 데이터를 자동 갱신
- 로컬 캐싱
- 데이터가 캐시에 저장되어 다음 요청 시 자동으로 갱신
- 고유한 키로 데이터 요청을 식별
- 브라우저 메모리에 저장
- 휘발성 캐시라서 빠른 접근 속도를 가지지만, 페이지를 떠나거나 리프레시할 때 초기화 됨
- 데이터가 캐시에 저장되어 다음 요청 시 자동으로 갱신
- 포커스 리밸리데이션
- 브라우저 창에 다시 포커스가 돌아오면 자동으로 데이터를 갱신
- 오프라인 지원
- 네트워크 미연결 시에도 캐시된 데이터 사용, 재연결 시 데이터를 갱신
단점
- 초기 로딩 시간
- 캐시 관리
- 캐싱이 자동으로 이루어지지만, 캐시 정책을 세밀하게 어려운 경우 데이터 갱신 주기나 캐시 무효화 로직 등의 추가 설정 필요
자세한 내용은 공식 문서를 참고하면 좋을 거 같다.
axios
axios는 예전에 짧게 다뤄본 적이 있는 내용인데 이번 기회에 한번 더 공부해봤다.
이전 글: https://hani-develop-history.tistory.com/82
[React] fetch와 axios
본 글은 리액트에서 네트워크 통신을 가능하게 해주는 fetch와 axios에 대해 다룬 내용입니다 목차 fetch axios fetch JS 내장 라이브러리 Promise 기반의 인터페이스를 사용해 비동기적으로 요청을 처리 t
hani-develop-history.tistory.com
axios는 브라우저와 Node.js 환경에서 모두 동작하는 HTTP 클라이언트이다.
주로 API 요청을 보내기위 위해 사용된다.
axios는 여러가지 장점이 있는데 그 중 내가 좋다고 느꼈던 점은 아래와 같다.- 간단한 API
- .get(), post(), put() 등 간편한 메서드 제공해 HTTP 요청을 쉽게 보낼 수 있음
- Promise 기반
- 비동기 작업을 간편하게 처리할 수 있음
- 인터셉터
- 요청과 응답을 가로채어 인증 토큰 추가 등 여러 가지 작업 수행 가능 (예: 리프레시 토큰)
- 자동 변환
- 자동 변환을 지원 (JSON)
사용해보기
자, 이제 axios와 useSWR을 사용해 비동기로 데이터를 가져오는 코드를 작성해봤다.
import useSWR from 'swr'; const fetchFn = async (userType: string) => { try { const res = await instance.get(`/${userType}/user`); return res.data.data; } catch (error) { throw error; } }; // 특정 데이터가 있어야 할 때 const { data } = useSWR(() => userType ? `/${userType}/user` : null, () => fetchFn(userType)); // 상관 없을 때 const { data } = useSWR('/user` : null', () => fetchFn()); return ( <div> {data} </div> );
마무리
원래는 axios + react-query를 사용해 비동기 방식으로 데이터를 가져왔었는데, 이번 프로젝트에서 처음으로 useSWR을 사용해봤다! ㅎㅎ
내가 useSWR을 사용한 이유는 3가지가 있다.
- Next.js를 사용하고 있어 vercel에서 관리하는 useSWR이 프로젝트에 조금 더 적합하다고 판단
- 초기 설정이 간단
- 간단한 데이처 페칭과 캐싱이 필요했음
아래 내용을 확인해보고 각자 상황에 맞는 것을 사용하면 될 거 같다! :)
useSWR은 간단한 데이터 페칭과 캐싱이 필요한 경우 적합,
React Query는 복잡한 데이터 페칭 및 상태 관리가 필요한 경우 적합728x90'개발공부 > Next.js' 카테고리의 다른 글
[Next.js] 커서 기반 무한 스크롤 구현 (useSWRInfinite) (0) 2024.05.18 [Next.js] Zod + React Hook Form 사용해 회원가입 페이지 만들기 (2) 2024.04.03 [Next.js, Node.js] 토큰 암호화 (crypto-js) (0) 2024.02.22 [Next.js] NextAuth 사용해 카카오톡 로그인 구현 (0) 2024.02.21 [Next.js] Hydration failed 에러 해결 (Unhandled Runtime Error) (0) 2024.02.17 - key