Nextjs 13, 15강 정리

강석우's avatar
Jul 06, 2024
Nextjs 13, 15강 정리

페이지 사전 렌더링 & 데이터 페칭

Page Pre Rendering

React 와 다르게 NextJS는 페이지를 사전에 렌더링해서 전송해주기 때문에 모든 HTML정보가 들어가 있게 되고 SEO에서 좋은 효율을 뽑아낼 수 있다.

사전 렌더링을 하는 방식은 두 가지가 있다.

Static Generation

  • getStaticProps

    • 해당 함수가 작성되어있는 파일은 사전 렌더링 파일로 인식하고 사전 렌더링 해준다.

    • 함수 내의 코드는 서버에서 실행된 것이므로 브라우저에서 확인할 수 없다. 또한 서버에서만 사용될 수 있는 fs, path 등을 사용할 수 있다.

    • 아래와 같이 작성해주며 해당 파일은 props를 받아올 수 있다. ex) props.products

      export async function getStaticProps() {
        const filePath = path.join(process.cwd(), "data", "dummy-backend.json");
        const jsonData = await fs.readFile(filePath);
        const data = JSON.parse(jsonData);
      
        return {
          props: {
            products: data.products,
          },
        };
      }
    • ISR(증분 정적 생성)

      • revalidate를 통해 시간을 설정하여 페이지를 재배포 없이 재 생성 해줄 수 있다.

        return {
            props: {
              products: data.products,
            },
            revalidate : 10 // 10초마다 재생성
          };
    • notFound

      • 404페이지를 렌더링해준다.

        return {
          notFound: true,
        };
    • redirect

      • 데이터를 못 받아온 경우 리디렉션을 통해 다른페이지로 이동시켜줌.

        return {
            redirect : {
              destination: '/no-data'
            }
          };
  • getStaticPaths()

    • 동적 페이지의 경우 NextJS는 페이지를 정적생성하지 않음 ( 정적 페이지를 전부 재생성하는데 동적은 불가능 ) 따라서 getStaticPaths() 함수를 함께 사용하여 해결.

      export async function getStaticPaths() {
        return {
          paths: [
            { params: { pid: "p1" } },
            { params: { pid: "p2" } },
            { params: { pid: "p3" } },
          ],
          fallback: false,
        };
      }
    • paths

      • param을 통해 [pid] 값이 p1,p2,p3인 동적 페이지를 사전 렌더링 한다.

    • fallback

      • false 일 때 사전 렌더링 되지 않은 페이지에 접근 시 에러를 반환한다.

      • true 일 때는 일부 페이지만 사전 렌더링을 하고 나머지 동적 페이지에 대해 서버에서 데이터를 가져온다.
        동적으로 생성하는 데이터에 대해서는 loading 처리를 통해 에러가 나지 않게 처리해줄 수 있다.

        if (!loadedProduct) {
          return <p>loading...</p>;
        }
      • ‘blocking’은 컴포넌트 로딩 처리를 해주지 않아도 에러가 나지 않는다.

Serverside Rendering

  • getServerSideProps()

    • 요청마다 새로운 데이터를 가져온다.

    • 서버 쪽에서 코드가 실행되기 때문에 동적 경로를 미리 설정해줄 필요가 없다.

      export async function getServerSideProps(context) {
        const { params, req, res } = context;
      
        return {
          props: {
            userId: params.uid,
          },
        };
      }

Q) 클라이언트 사이드 렌더링과 getStaticProps()를 app-router에서 함께 사용하는 방법?

NextJS 페이지 라우터 최적화

<Head>

  • title과 meta등의 태그를 이용해 웹 페이지의 head를 수정 및 추가할 수 있다.

  • head를 추가함으로써 검색엔진에 더 많은 정보를 노출 시킬 수 있다.

  • app.js 파일에 head를 추가하여 전체 페이지에 적용 시켜줄 수 있다.

  • NextJS는 가장 최근의 헤더만 적용한다. ( 위와 아래 중 아래 우선 적용 )

document.js

  • Head 뿐만 아니라 HTML문서의 전체에 접근할 수 있는 파일이다.

이미지 최적화

<Image>

  • 품질을 조금 낮추지만 눈에 보이지 않을 정도로 낮추고 웹에 최적화 된 형식(WebP)으로 자동 변경해준다. => 이미지 리소스를 줄여준다.

  • 자동 lazy loading 적용.

  • width 와 height를 필수로 사용해야 하지만 fetching을 위한 너비와 높이로 css를 주면 적용이 된다.

Share article

석우의 개발블로그