7.31 (일)
page router
방식에는 api폴더
가 있는데, 나는 여기서 api를 호출해서 처리해야 하는 줄 알았다. 그런데 찾아보니, NextJS는 풀스택을 개발할 수 있는 React 프레임워크로서 api폴더는 API를 구축할 수 있게 해주는 것이었다.page router
방식에는 page
레벨에서 api
를 호출하는 방법이 3가지가 있다.getStaticProps
getStaticPaths
getServerSideProps
NextJS는 fetch를 사용할 때 caching과 revalidating을 제공하며, Server Component에서 async/await으로 사용가능하다.
사용법은 되게 간단하다.
// Data Fetching 함수
async function getData() {
const res = await fetch('https://api.example.com/...')
// The return value is *not* serialized
// You can return Date, Map, Set, etc.
if (!res.ok) {
// This will activate the closest `error.js` Error Boundary
throw new Error('Failed to fetch data')
}
return res.json()
}
// 서버 컴포넌트
export default async function Page() {
const data = await getData()
return <main></main>
}
Caching은 말그대로 데이터를 저장해서 매 요청마다 re-fetch
하지 않아도 되도록 해준다.
기본적으로 NextJS는 자동으로 Caching을 수행한다. 이는 데이터가 build time
또는 request time
에서 fetch되고 caching되며 매 요청마다 재사용 될 수 있음을 의미한다.
// 'force-cache' is the default, and can be omitted
fetch('https://...', { cache: 'force-cache' })
Revalidation(재확인, 재검증)은 데이터 캐시를 삭제하고 최신 데이터를 다시 가져오는 기능이다. 데이터가 변경되고 최신 정보를 표시해야 할 때 사용하면 유용하다.
Revalidation에도 2가지 방식이 있다.
Time-based revalidation
: 특정 시간이 지나면 자동으로 수행하는 방식이다. 데이터가 자주 변하지 않고 꼭 데이터의 '최신성'이 엄청 중요하지 않은 경우에 사용하면 좋다.On-demand revalidation
: 말 그대로 요구가 있을 때 수행하는 방식이다. 이는 특정한 이벤트(event)에 따라 재검증된다. (e.g. <form>
submission)fetch에 next.revalidate
옵션을 전달해서 사용할 수 있다.(=cache의 생명주기를 설정할 수 있다.)
이때, 단위는 초이다.
// 3600초 = 1시간 뒤에 revalidate
fetch('https://...', { next: { revalidate: 3600 } })
데이터는 Route Handler 또는 Server Action 내에서 path(revalidatePath
) 또는 cache tag(revalidateTag
)를 사용해서 재검증 될 수 있다고 한다.
자세한 설명은 공식 문서를 참고하자.
cache tag 사용
// collection이라는 태그 사용
export default async function Page() {
const res = await fetch('https://...', { next: { tags: ['collection'] } })
const data = await res.json()
// ...
}
path 사용
// URL
https://<your-site.com>/api/revalidate?tag=collection&secret=<token>
// path 사용
import { NextRequest, NextResponse } from 'next/server'
import { revalidateTag } from 'next/cache'
// e.g a webhook to `your-website.com/api/revalidate?tag=collection&secret=<token>`
export async function GET(request: NextRequest) {
// Check for secret to confirm this is a valid request
if (
request.nextUrl.searchParams.get('secret') !== process.env.MY_SECRET_TOKEN
) {
return res.status(401).json({ message: 'Invalid token' })
}
const tag = request.nextUrl.searchParams.get('tag')
revalidateTag(tag)
return NextResponse.json({ revalidated: true, now: Date.now() })
}
Data Fetching에 관한 자세한 설명은 공식 문서로..