Next.js에서 리퀘스트 메모이제이션은 한 번의 서버 렌더링 사이클 동안 발생하는 동일한 API 요청을 최적화하는 기술. 서버 컴포넌트 구조에서 여러 컴포넌트가 동일한 데이터를 필요로 할 때, 네트워크 중복 호출을 방지하고 성능을 향상시키는 것이 핵심
fetch 요청이 들어오면, 첫 번째 요청의 결과를 메모리에 저장하고 이후 요청에는 저장된 값을 반환서버 컴포넌트 도입 이후, 부모 컴포넌트에서 데이터를 fetch하여 자식들에게 Props로 전달하는 방식(Prop Drilling)이 비효율적으로 변모. 각 컴포넌트가 필요한 데이터를 직접 요청하는 구조가 권장됨
getUser() 함수를 호출할 때 사용Next.js의 확장된 fetch API를 사용하면 별도 설정 없이 자동 적용. fetch가 아닌 데이터베이스 호출이나 외부 라이브러리(Axios 등)를 사용할 경우 React의 cache 함수를 별도로 활용해야 함
// 1. fetch를 이용한 자동 메모이제이션
async function getItem(id) {
const res = await fetch(`https://api.example.com/item/${id}`)
return res.json()
}
// 2. React cache를 이용한 수동 메모이제이션 (DB 호출 등)
import { cache } from 'react'
import db from './database'
export const getItemFromDB = cache(async (id) => {
const item = await db.item.findUnique({ id })
return item
})
GET 요청에만 적용되며, POST, DELETE 등 서버 상태를 변경하는 요청은 메모이제이션 대상에서 제외됨fetch 확장을 공유하지 않으므로 수동으로 cache 처리를 하지 않으면 중복 요청이 발생함핵심 요약
- 렌더링 사이클 내 동일한 GET 요청의 중복 네트워크 비용 절감
- Props 전달 없이 각 컴포넌트에서 독립적인 데이터 페칭 환경 제공
- 렌더링 종료 시 즉시 소멸하며 영구 보관되는 데이터 캐시와 구별 필요
출처: 한 입 크기로 잘라먹는 Next.js(v15)