Resolved
Written on
·
118
0
안녕하세요!
ISR on-demand 활용해서 인덱스 페이지에서 전체 페이지 새로고침 없이
"새로 추천 받기" 버튼을 눌렀을 때 추천 도서(recoBooks)만 새롭게 받아오도록 구현하고 싶습니다.
getStaticProps
를 통해 전달된 recoBooks
가 useState
의 초기값으로 들어갈 때,
해당 데이터도 여전히 빌드 타임에 fetch되어 정적 HTML과 함께 포함되는지 궁금합니다.
개발자 도구를 보면 정적으로 렌더링되는 것 같은데, useState
로 상태를 만들었기 때문에 초기 렌더링이 정적인지 아니면 클라이언트 측에서 동적으로 할당되는건지 헷갈립니다.
// CSS Module
import SearchableLayout from '@/components/searchable-layout';
import style from './index.module.css';
import { ReactNode, useState } from 'react';
import BookItem from '@/components/book-item';
import { InferGetStaticPropsType } from 'next';
import fetchBooks from '@/lib/fetch-books';
import fetchRandomBooks from '@/lib/fetch-random-books';
export const getStaticProps = async () => {
console.log('인덱스 페이지');
const [allBooks, recoBooks] = await Promise.all([
// 병렬로 함수 호출하기
fetchBooks(), //
fetchRandomBooks(),
]);
return {
props: {
allBooks,
recoBooks,
},
};
};
export default function Home({ allBooks, recoBooks }: InferGetStaticPropsType<typeof getStaticProps>) {
const [recommended, setRecommended] = useState(recoBooks);
const revalidate = async () => {
try {
const response = await fetch('/api/revalidate');
const result = await response.json();
// console.log(result);
if (result.revalidate) {
//페이지 갱신이 됐을 때
const rebooks = await fetchRandomBooks();
setRecommended(rebooks);
} else {
//페이지 경신 안됐을 때
}
} catch (err) {
//에러처리
console.error(err);
}
};
// console.log(recoBooks);
return (
<div className={style.container}>
<section>
<h3>지금 추천하는 도서</h3>
<button onClick={revalidate}>새로 추천 받기</button>
{recommended.map((book) => (
<BookItem key={book.id} {...book} />
))}
</section>
<section>
<h3>등록된 모든 도서</h3>
{allBooks.map((book) => (
<BookItem key={book.id} {...book} />
))}
</section>
</div>
);
}
Home.getLayout = (page: ReactNode) => {
return <SearchableLayout>{page}</SearchableLayout>;
};
Answer 2
0
안녕하세요 이정환입니다.
결론부터 말씀드리면 정적으로 랜덤 도서 목록을 렌더링하게 됩니다. 강의에서 말씀드렸듯 useState 등의 React Hooks는 클라이언트 사이드에서만 동작하기에 서버 측의 사전 렌더링 과정에서는 값이 초기값으로 고정되는데요, 이때 초기값을 getStaticProps 함수에서 제공한 recoBooks를 사용하셨으므로 해당 값이 초기값으로 설정되어 정적으로 화면에 잘 렌더링 됩니다.
0
안녕하세요, 인프런 AI 인턴입니다. 김혜빈님.
각각의 질문에 대한 답변과 함께, 관련된 이슈를 어떻게 해결할 수 있는지 설명드리겠습니다.
getStaticProps
와 초기 렌더링getStaticProps
함수는 Next.js의 SSG(Static Site Generation) 기능을 사용하는 경우에 사용됩니다. 질문에서 언급하신 recoBooks
데이터는 빌드 타임에 fetch되어 정적 HTML에 포함됩니다. 따라서 초기 페이지 로드 시에는 정적으로 렌더링됩니다.
클라이언트 측에서 useState
를 사용해 상태를 만들었지만, 그 초기값은 여전히 서버에서 빌드될 때 제공된 값이므로 초기 렌더링은 정적입니다. 하지만 이후 revalidate
함수의 호출을 통해 데이터가 변경되면 그때부터는 클라이언트 사이드에서 동적으로 업데이트 됩니다.
revalidate
API를 호출해서 데이터를 업데이트하는 방식은 맞는 접근법입니다. 이 API는 페이지의 캐시를 적시에 재생성하기 위해 사용되며, 필요에 따라 페이지를 자동으로 재배포합니다.
여기서 fetchRandomBooks
를 다시 호출하여 클라이언트 측에서 setRecommended
를 통해 상태를 갱신함으로써 전체 페이지를 새로고침하지 않고도 최신의 추천 도서 목록을 불러올 수 있습니다.
관련된 유사 질문을 참고하여 보다 자세한 내용을 살펴볼 수 있습니다:
- On-Demand ISR 관련 질문에서는 인덱스 페이지를 자동으로 재생성하는 방법과 서버 부하를 줄이는 최적화 방안에 대해 설명하고 있습니다.
위 설명이 이해에 도움이 되었으면 좋겠습니다! 질문자님이 추가적으로 ISR 처리를 보다 최적화하는 방법이 궁금하시면, 관련된 Next.js의 공식 문서나 강의 자료를 참조하시는 것도 추천드립니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답변 감사합니다!!👍