리액트에서 페이지가 렌더링 될때 사이클이 두번 돌게 됩니다.
const HomePage = () => {
const [someStates, setSomeStates] = useState([]);
useEffect(() => {
// 데이터를 가져온다고 한다고 가정한다.
setSomeStates(DUMMY_DATA);
}, []);
return <List fetchData={someStates} />;
};
export default HomePage;
위 코드처럼 useEffect
훅을 통해서 데이터를 가져오는 코드가 있습니다. 페이지가 렌더링 될 때 컴포넌트 함수가 먼저 실행이 될것이고 useEffect
가 실행이 되면서 state가 변경될 것입니다. state가 변경이 되면서 페이지는 다시 한번 랜더링이 됩니다.
'someStates'는 처음 초기 state인 '빈 배열'이 되겠죠. 이게 왜 문제일까요?
첫번째로는 초기 state로 Pre-rendering된 페이지에서는 데이터를 fetch하면서 시간이 걸린다는 문제점이 있습니다. 사용자 경험에 있어서는 단점이 되는 부분입니다.
두번째로는 SEO 최적화를 할 수 없습니다.
Static Generation은 APP을 배포하기 위해 빌드할때 페이지를 Pre-rendering 하는 방법입니다. 하지만 자주 데이터의 업데이트가 일어나는 페이지라면 적합하지 않을 수 있습니다.
const HomePage = (props) => {
return <List fetchData={props.someStates} />;
};
export async function getStaticProps() {
// 데이터 가져오는 코드가 들어가는 곳
return {
props: {
someStates: DUMMY_DATA,
}, // 페이지 컴포넌트에 props로 전달이 된다.
};
}
export default HomePage;
Static Generation을 위해서 getStaticProps()
를 사용해야합니다. async
이기 때문에 반드시 promise
가 반환되기를 기다립니다.
APP의 코드 변경점이 없는데 APP을 다시 빌드하는 것은 비용적으로 낭비일 수 있습니다. 때문에 백그라운드에서 새로운 데이터만 가져오기 위해서는 revalidate를 사용하면 됩니다.
https://velog.io/@fkszm3/Next.js-ISR
해당 글을 참고해주시면 감사하겠습니다!
https://nextjs.org/docs/basic-features/data-fetching/get-static-props
Next js 공식 문서