fetch
요청의 fetch
함수는 브라우저와 거의 동일하게 사용되지만, 서버 컴포넌트에서 사용하면 서버 환경의 특성을 살릴 수 있습니다. 예를 들어, 요청에 const res = await fetch('https://api.example.com/data', {
headers: {
'Authorization': 'Bearer my-token',
},
});
cookies()
를 사용하여 클라이언트 쿠키에 접근할 수 있습니다. 예를 들어, 로그인한 사용자의 정보를 쿠키에서 가져와 요청에 함께 전송할 수 있습니다.import { cookies } from 'next/headers';
const cookieStore = cookies();
const token = cookieStore.get('token');
const res = await fetch('https://api.example.com/user', {
headers: {
Authorization: `Bearer ${token?.value}`,
},
});
fetch
요청에 await fetch('https://api.example.com/data', {
next: {
tags: ['data'],
},
});
revalidateTag('data')
를 호출하여 해당 캐시를 무효화할 수 있습니다.'use server';
import { revalidateTag } from 'next/cache';
export async function updateSomething() {
// 데이터 수정 로직
await revalidateTag('data'); // 'data' 태그에 해당하는 fetch 캐시 무효화
}
app/api/
디렉토리 안에 // app/api/user/route.ts
import { NextResponse } from 'next/server';
export async function GET() {
const res = await fetch('https://jsonplaceholder.typicode.com/users/1');
const user = await res.json();
return NextResponse.json(user);
}
/api/user
로 요청하면 JSON 데이터를 응답하는 API가 작동하게 됩니다.
라우트 핸들러는 GET
, POST
, PUT
, DELETE
등의 메서드를 각각 함수로 구현할 수 있으며, 서버 액션과 결합하여 유용하게 사용할 수 있습니다.fetch
요청을 커스터마이징하고, 캐시 무효화 기능을 사용하여 데이터를 유연하게 관리하는 방법을 배웠습니다. 또한, 라우트 핸들러를 통해 프론트엔드와 백엔드가 하나로 통합된 API 구조를 구현할 수 있음을 확인했습니다.
다음 파트에서는 전체 내용을 정리하며, 어떤 전략이 어떤 상황에서 유리한지