-
Next.jsFrontEnd/React 2023. 12. 7. 05:00반응형
Next.js
React의 SSR(Server Side Rendering)을 쉽게 구현할 수 있게 도와주는 프레임워크입니다. React는 SPA(Single Page Application)로 CSR(Client Side Rendering)을 하기 때문에 검색 엔진 최적화(SEO) 부분에 단점이 존재합니다. Client Side Rendering을 하면 첫페이지에서 빈 html을 가져와 JS 파일을 해석하여 화면을 구성하기 때문에 포털 검색에 노출될 일이 거의 없습니다.
Next.js에서는 Pre-Rendering을 통해 페이지를 미리 렌더링하며 완성된 HTML을 가져오기 때문에 사용자와 검색 엔진 크롤러에게 바로 렌더링 된 페이지를 전달할 수 있습니다.
SSR (Server Side Rendering)
- 클라이언트 대신 서버에서 페이지를 준비하는 원리입니다.
- React에서는 클라이언트 사이드 렌더링하기 때문에 서버에 영향을 미치지 않고, 서버에서 클라이언트로 응답해서 보낸 html도 거의 비어있습니다. 그러므로 서버에서 데이터를 가져올 때 지연 시간 발생으로 UX 측면에서 좋지 않을 수 있고, 검색 엔진 최적화에 문제가 됩니다.
- Next.js에서는 서버 사이드 렌더링을 이용합니다.
설치 방법
npx create-next-app@latest # or yarn create next-app
Next.js 파일 구조
Data Fetching
Next.js 에서 데이터를 가져오는 방법은 여러가지가 있습니다. 애플리케이션 사용 용도에 따라 다른 방법을 사용하면 됩니다.
- getStaticProps: Static Generation으로 빌드(build)할 때 데이터를 불러옵니다(미리 만듭니다).
- getStaticPaths: Static Generation으로 데이터에 기반하여 pre-render 시 특정한 동적 라우팅을 구현합니다(pages/post/[id].js).
- getServerSideProps: Server Side Rendering으로 요청이 있을 때 데이터를 불러옵니다.
getStaticProps
getStaticProps 함수를 async로 export 하면, getStaticProps에서 리턴되는 props를 가지고 페이지를 pre-render 합니다. build time에 페이지를 렌더링 합니다.
- 사용자의 요청보다 먼저 build time에 필요한 데이터를 가져올 때 사용합니다.
- Headless CMS에서 데이터를 가져올 때 사용합니다.
- 공개적으로 캐시할 수 있을 때 사용합니다.
- SEO의 경우 사용합니다(getStaticProps는 성능을 위해 CDN에서 캐시할 수 있는 HTML 및 JSON 파일을 생성합니다).
function Blog({ posts }) { return ( <ul> {post.map((post) => ( <li>{post.title}</li> ))} </ul> ) } export async function getStaticProps() { const res = await fetch('https://.../posts') const posts = await res.json() return { props: { // will be passed to the page component as props posts, }, } }
getStaticPaths
동적 라우팅이 필요할 때 getStaticPaths로 경로 리스트를 정의합니다. build time에 렌더링 됩니다.
return { paths: [ { params: { id: '1' } }, { params: { id: '2' } } ], fallback: ... }
- paths: pre-render 될 경로를 지정합니다(pages/posts/[id].js). 빌드하는 동안 /posts/1과 /posts/2를 생성합니다.
- fallback: false라면 getStaticPaths로 리턴되지 않는 것은 모두 404 페이지가 뜹니다. true라면 getStaticPaths로 리턴되지 않는 것은 404로 뜨지 않고, fallback 페이지가 뜹니다.
function Post ({ post }) { // Render post... } export async function getStaticPaths() { const res = await fetch('https://.../posts') const posts = await res.json() const paths = posts.map((post) => ({ params: {id: post.id }, })) return { paths, fallback: false } } export async function getStaticProps({ params }) { const res = await fetch(`https://.../posts/${params.id}`) const post = await res.json() return { props: { post } } } export default Post
getServerSideProps
getServerSideProps 함수를 async로 export 하면, Next는 각 요청마다 리턴되는 데이터를 pre-render 합니다.
function Page({ data }) { // Render data... } export async function getServerSideProps() { const res = await fetch('https://.../data`) const data = await res.json() return { props: { data } } } export default Page
[참고 정보]
반응형'FrontEnd > React' 카테고리의 다른 글
React TDD (0) 2023.12.06 Custom Hooks (useDebounce, useRef) (1) 2023.12.06 React Router DOM (0) 2023.12.01 Todo App 최적화 (0) 2023.11.23 react-beautiful-dnd (0) 2023.11.22