Nextjs 에서 fetch 사용하여 데이터 가져오기
팀 프로젝트 작업 중 기본적인 UI 구성이 완료되었으므로, 이제 API 연동을 시작하려고 합니다. 이전에는 axios와 같은 라이브러리를 사용했지만, 이번 프로젝트에서는 Next.js를 사용하고 있기 때문에, 공식 문서에서 권장하는 fetch를 사용하여 데이터를 가져오는 방법을 알아보겠습니다.
이 글은 2024-06-23 에 업데이트 되었습니다.
이 글은 HTML, CSS , JavaScript, TypeScript, React, Next.js에 대한 기본적인 지식을 알고 있어야 합니다.
Next.js에서의 fetch
Next.js
에서의 fetch
는 기존에 웹에서 제공하는 fetch
를 확장한 라이브러리로 웹에서 제공하는 fetch
와 동일한 방식으로 사용할 수 있지만 Next.js
에서는 추가적인 옵션들로 api
요청을 캐시하여 사용할 수 있습니다.
cache란 무엇인가요??
cache는 브라우저나 서버가 자원을 저장하고 재사용하는 방법을 의미합니다. 이를 통해 동일한 데이터를 여러 번 요청할 때, 매번 서버에서 새로 가져오는 대신 저장된 데이터를 사용하여 네트워크 트래픽을 줄이고 응답 속도를 높일 수 있습니다.
cheche 옵션
cheche 옵션으로는 force-cache
, no-store
두 가지 옵션이 있습니다. 아래는 옵션의 사용법과 간단한 설명입니다.
1
fetch(`https://...`, { cache: "force-cache" | "no-store" });
force-cache
(default)- 일치하는 리소스가 있으면 캐시에서 재사용 합니다.
- 일치하는 리소스가 없거나 오래된 리소스일 경우 원격 서버에서 리소르를 가져와 캐시를 업데이트 합니다.
no-store
- 캐시를 사용하지 않고 요청할 때마다 서버에서 리소스를 가져옵니다.
next.revalidate 옵션
revalidate는 리소스의 캐시 수명(초)을 설정합니다
1
fetch(`https://...`, { next: { revalidate: false | 0 | number } });
false
- 리소스를 무기한 캐시합니다. HTTP 캐시는 시간이 지남에 따라 오래된 리소스를 제거시킬 수 있습니다.
0
- 리소스가 캐시되지 않습니다.
number
- 리소스의 캐시 수명을
number
초 단위로 설정합니다.
- 리소스의 캐시 수명을
next.tags 옵션
리소스의 캐시 태그를 설정합니다. 그 다음 사용자가 원할 때 태그를 사용하여 데이터를 재 검증할 수 있습니다.
태그의 길이는 최대 256자이고 최대 태그 항목은 64개 입니다.
재검증 요청 시 revalidateTag(태그명)
함수를 사용하면 됩니다.
1
2
3
4
fetch(`https://...`, { next: { tags: ["collection"] } });
// 재검증 요청 시
revalidateTag(`collection`);
프로젝트에 적용하기
제가 사용하고 있던 프로젝트에서는 사용자가 포스트를 생성할 때 서버에서 데이터를 가져오고 있었습니다. 이를 위해서는 서버에서 데이터를 가져오는 요청을 하고, 캐시를 업데이트 해야 합니다. 따라서 아래의 코드를 추가하여 사용하였습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// api
export const getPostList = async () => {
const response = await fetch(`요청 경로`, {
cache: "no-store",
next: {
tags: ["post"],
},
});
return response.json();
};
export const createPost = async (postData) => {
const response = await fetch(`요청 경로`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(postData),
});
revalidateTag("post");
return response.json();
};
export const deleteQuestion = async (id: number) => {
await fetch(`요청 경로`, {
method: "DELETE",
});
revalidateTag("post");
};
결론
Next.js
를 사용하면서 느끼는 가장 큰 매력 중 하나는 프로젝트 구성을 매우 쉽게 할 수 있도록 다양한 기능을 제공한다는 점입니다. 오늘은 그 중에서도 데이터를 손쉽게 불러오고 캐싱할 수 있는 fetch
를 사용하는 방법을 알아보았습니다.
fetch
는 기본 자바스크립트 문법이기 때문에 누구나 쉽게 사용할 수 있으며, Next.js
에서도 이를 확장한 버전으로 제공하기 때문에 별다른 학습곡선 없이 사용할 수 있었습니다.