본문 바로가기
WEB/NEXT

[NEXT] 3강 서버사이드 렌더링, 5강 정적 생성(Static Generation)

by 뭉망뭉 2022. 5. 10.

타이틀 링크를 클릭하면 해당 주차 강의 코드가 정리된 깃허브로 연결됩니다.

3강 서버사이드 렌더링 (Server-side Rendering/SSR/Dynamic Rendering)

(5강 설명이랑 합침)

  • Next.js: 모든 페이지 사전 렌더링 (Pre-rendering)
    • 기본적으로 모든 페이지 pre-render
    • 사전에 HTML 파일을 만든다는 의미
    • 퍼포먼스 향상, SEO
    • 안 하는 경우: 아무것도 렌더링 안 되다가 JS 파일 로드되면 보임
    • 하는 경우: 사전에 초기 HTML 요소가 렌더링되고 JS 렌더링됨
    • 효과
      • 더 좋은 퍼포먼스
      • 검색엔진최적화(SEO)
    • 형태
      • 둘의 차이점: html 파일 생성 시기
      1. Static Generation: 정적 생성
        • [정적 생성]은 프로젝트가 빌드하는 시점에 html 파일 생성
        • 모든 요청에 생성한 파일 재사용
        • 퍼포먼스 이유로, Next.js의 권고 사항인 정적 생성
        • 정적 생성된 페이지들은 CDN에 캐시 → 더 빠름
        • 유저 요청 전에 만들어놔도 상관 없는 페이지는 정적 생성 사용
          • 마케팅 페이지, 블로그 게시물, 제품 목록, 도움말, 문서
        • getStaticProps / getStaticPaths
      2. Server Side Rendering (SSR, Dynamic Rendering)
        • [서버사이드 렌더링]은 매 요청마다 html 을 생성. (요청하면 그때 만듦)
        • 서버 통해 프리렌더링된 페이지는 항상 최신 상태 유지
        • CDN에 캐시되지 않아서 조금 느릴 수 있음.
        • 검색 엔진에 걸려야 하는데 API 통신으로 받아오는 페이지, 항상 최신 상태 유지해야 하는 페이지에 사용
          • 관리자 페이지, 분석 차트
        • getServerSideProps
  • getServerSideProps
// [id].js

// context에는 prams, 요청, 응답 쿼리 등이 담겨서 옴.
export async function getServerSideProps(context) {
  const id = context.params.id;
  const apiUrl = `http://makeup-api.herokuapp.com/api/v1/products/${id}.json`;
  // id와 api 호출하고 받아온 응답값을
  const res = await Axios.get(apiUrl);
  const data = res.data;

  return {
    props: {
      // item에 넣어줌
      item: data,
    },
  };
}


// getServerSideProps의 응답값 item을 Post 페이지에 props로 넘겨줄 수 있음.
const Post = ({ item }) => {
  return (
    <>
      {item && (
        <>
          {/* Head에 title이랑 meta 데이터 넣어주면 SEO가 읽을 수 있음. */}
          <Head>
            <title>{item.name}</title>
            <meta name="description" content={item.description}></meta>
          </Head>
          <Item item={item} />
        </>
      )}
    </>
  );
};

export default Post;

Gnb 라우터로 손보기

// Gnb.js
export default function Gnb() {
  const router = useRouter();

  // 현재 있는 페이지에 따라 네브바의 activeItem이 바뀜
  let activeItem;
  if (router.pathname === "/") {
    activeItem = "home";
  } else if (router.pathname === "/about") {
    activeItem = "about";
  }

  // 여기의 data는 semantic-ui-react에서 제공해주는 것.
  // : Menu.Item의 name, active 등.
  function goLink(e, data) {
    if (data.name === "home") {
      router.push("/");
    } else if (data.name === "about") {
      router.push("/about");
    }
  }

  return (
    <Menu inverted>
      <Menu.Item name="home" active={activeItem === "home"} onClick={goLink} />
      <Menu.Item
        name="about"
        active={activeItem === "about"}
        onClick={goLink}
      />
    </Menu>
  );
}

5강 정적 생성(Static Generation) - getStaticProps, getStaticPaths

  • [id].js같이 다이나믹 라우트는 어떤 id가 들어올지 몰라 모든 케이스에 대해 다 생성해줄 순 없음. 그런데 개수가 한정적이고 id list를 미리 알 수 있으면 가능.
    • getStaticPaths()(와 getStaticProps()) 사용
export async function getStaticPaths() {
  return {
    paths: [
      { params: { id: "740" } },
      { params: { id: "730" } },
      { params: { id: "729" } },
    ],
    // fallback: true면 getStaticProps로 전달된 경로들은 빌드 타임에 만들어지는 것.
    // 나머지는 최초 접속 시 빈 화면으로 보여지게 되고 이외 백그라운드에서 정적 파일로 html과 json 생성해줌.
    // next.js는 프리렌더링 목록에 추가함.
    // 두 번째 접속부터는 접속생성된 페이지 사용함.
    fallback: true,
  };
}

export async function getStaticProps(context) {
  // getServerSideProps()에서 함수명만 달라짐
  const id = context.params.id;
  const apiUrl = `http://makeup-api.herokuapp.com/api/v1/products/${id}.json`;
  const res = await Axios.get(apiUrl);
  const data = res.data;

  return {
    props: {
      item: data,
      name: process.env.name,
    },
  };
}
더보기

코딩앙마의 NEXT 강의를 정리한 내용입니다

 

댓글