본문 바로가기

React 실습/Nextjs 실습

[Next.js] SSR, ISR 그리고 Link, Image

728x90

SSR을 통한 페이지 구현

 

import React from "react";
import { GetServerSideProps, NextPage } from "next";
import Head from "next/head";

type SSRProps = {
  message: string;
};

const SSR: NextPage<SSRProps> = (props) => {
  const { message } = props;

  return (
    <div>
      <Head>
        <title>Create Next App</title>
        <link rel="icon" href="/favicon.ico"></link>
      </Head>
      <main>
        <p>
          이 페이지는 서버 사이드 랜더링을 통해 접근 시에 서버에서 그려진
          페이지입니다.
        </p>
        <p>{message}</p>
      </main>
    </div>
  );
};

export const getServerSideProps: GetServerSideProps<SSRProps> = async (
  context
) => {
  const timestamp = new Date().toLocaleString();
  const message = `${timestamp}에 이 페이지의 getServerProps가 실행됐습니다.`;
  console.log(message);

  return {
    props: {
      message,
    },
  };
};

export default SSR;

 

SSR에서는 getServerSideProps를 이용하여 정의합니다. SSR에서는 접근할 때마다 서버에서 페이지를 그리고, 그 결과를 클라이언트에서 표시함.

접근할 때마다 표시되는 내용이 변하기 때문에, 매번 서버가 getServerSideProps가 호출되고 페이자가 그려지는 것을 알수 있슴.

 

getServerSideProps 함수는 단일 인자인 context를 받습니다. 이 context 객체는 다양한 정보와 메서드를 포함하고 있으며, 다음과 같은 속성을 가지고 있습니다:

  • context.params: 동적 라우팅에서 사용되는 경로 매개변수의 키-값 쌍을 포함합니다.
  • context.query: 쿼리 문자열의 키-값 쌍을 포함합니다.
  • context.req: HTTP 요청 객체입니다. (서버 측에서만 사용 가능)
  • context.res: HTTP 응답 객체입니다. (서버 측에서만 사용 가능)
  • context.preview: 프리뷰 모드인지 여부를 나타내는 부울 값입니다. (미리보기 모드에 대한 정보가 필요한 경우 사용)

 


 

ISR을 통한 페이지 구현

 

점진적 정적 재생성(ISR)은 SSG의 응용이라고 할 수 있음. 특징으로는 페이지 수명을 설정할 수 있고, 수명을 지난 페이지에 대해서는 최신 정보로 재생성을 시도하고, 정적 페이지를 전송하면서 정보를 업데이트할 수 있습니다.

 

import React from "react";
import { GetStaticPaths, NextPage, GetStaticProps } from "next";
import Head from "next/head";
import { useRouter } from "next/router";

type ISRprops = {
  message: string;
};

const ISR: NextPage<ISRprops> = (props) => {
  const { message } = props;

  const router = useRouter();

  if (router.isFallback) {
    return <div>loading...</div>;
  }
  return (
    <div>
      <Head>
        <title>Create Next App</title>
        <link rel="icon" href="/favicon.ico" />
      </Head>
      <main>
        <p>이 페이지는 ISR을 통해 빌드 시 생성된 페이지입니다.</p>
        <p>{message}</p>
      </main>
    </div>
  );
};

export const getStaticProps: GetStaticProps<ISRprops> = async (context) => {
  const timestamp = new Date().toLocaleString();
  const message = `${timestamp}에 이 페이지의 getStaticProps가 실행됐습니다.`;

  return {
    props: {
      message,
    },
    // 페이지의 유효시간
    revalidate: 60,
  };
};

export default ISR;

 

ISR에서 revalidate를 반환하는 getStaticProps를 사용. getStaticProps에서 revalidate를 반환하면 그 값이 유효 시간이 되며, 우효 기간이 지난 페이지는 재생성된다.

 

그외 에 다른점으로는

 


 

Link 와 image 있다.

 

간단하게 설명하면 a요소와 다르게 파일 등을 얻어 화면에 그리는게아니라, 클라이언트 사이드에서 새로운 페이지를 그린다. 새로운 페이지를 그리기 위해서 필요한 데이터는 미리 비동기 방식으로 얻스비다. 그덕분에 페이지를 재빨리 이동할 수 있습니다.

 

a요소 대신 Link를 사용하면 자식 컴포넌트에 onClik 콜백이 전달되어, 콜백이 호출되면 페이지를 이동한다. 그렇게 되면 router 객체에 push 매서드를 호출해서 페이지를 이동할 수 있게된다.

 

Image를 간단하게 설명하면, 해당 컴포넌트는 각각 사용자의 브라우저에 맞게 최적화를 제공해서, 일반 img 요소로 제공하는 파일의 크기보다 절반의 값으로 최적화 할 수 있습니다.

 

 


후기

 

대충 다시 기억되새기금 상기게가 되게끔 정리를 해봤습니다.

면접때 아는건데 잘 대답을 못해주면 곤란하니가 겸사겸사 정리를 했네요 ㅎㅎ

728x90