인프런 커뮤니티 질문&답변

chebread님의 프로필 이미지

작성한 질문수

한 입 크기로 잘라먹는 Next.js(15+)

1.2) Next.js 사전렌더링 이해하기

Pre-Rendering 과정에 대해서 질문드립니다!

24.10.04 16:37 작성

·

49

0

현재 Next.js Styling 부분까지 시청하였으나, 기존의 사전 렌더링 부분이 이해가 가지 않아 다시 수강한 후 질문드립니다.


일단, 제가 정리한 사전 렌더링 과정은 이와 같습니다.

  1. 유저가 브라우저를 통해 서버에게 초기 접속 요청을 보낸다.

     

  2. 서버는 서버 측에서 리엑트 앱을 실행시켜서 모든 리엑트 앱의 컴포넌트를 HTML로 변환한다.

  3. 이 변환된 HTML을 브라우저에게 보내준다.

  4. 변환된 HTML을 받은 브라우저는 HTML을 화면에 렌더링한다. 이때 유저는 완성된 화면을 볼 수 있다.

     

  5. 이렇게 유저가 요청후에 1차적으로 화면에 요소를 볼 수 있게 되는 시간을 FCP(First Contentful Paint)라고 한다.

  6. 그러나 지금은 html만 브라우저에게 보내진 상태이며, 페이지 이동, 버튼 클릭 등등의 상호작용을 수행하는 자바스크립트 코드는 아직 html에 담겨지지 않은 상태이다.

  7. 그러므로 유저에게 1차적으로 화면에 렌더링된 이후에 후속으로 서버에서 자바스크립트를 Bundling하여서 브라우저에게 보내준다.

  8. 브라우저는 이 번들링된 자바스크립트 파일을 실행한 후에 기존에 1차적으로 화면에 렌더링된 html과 자바스크립트의 로직을 연결하게 된다. 이러한 과정을 hydration이라고 한다.

  9. 유저가 초기 요청부터 hydration 까지 종료된 시간을 TTI(Time To Interact)라고 한다.

  10. 페이지 이동은 hydration 과정에서 받아온 bundle 자바스크립트 파일을 실행해서 현재 보여지는 컴포넌트를 교체하는 방식으로 CSR과 똑같은 방식으로 처리한다.


결론적으로 제가 궁금한 부분은,

처음에 html로 변환할때 "jsx 부분만" 변환하나요?

아니면 처음에 html로 변환할때 "jsx 부분만" 변환하지 않나요?

 

처음에 html로 변환할때 next.js의 "모든 Jsx 부분"을 변환하여 브라우저에게 전달하나요?

아니면, 처음에 html로 변환할때 next.js의 모든 Jsx 부분이 아니라, "지금 요청한 페이지의 부분의 jsx만" html 변환하여 브라우저에게 전달하나요?

 

hydration이라는 과정에서는 자바스크립트 파일 뿐만 아니라 "스타일 코드나 다양한 이미지 파일, json 파일"도 전달하여 기존에 쏴준 html에 연결시켜 주는 것인가요?

아니면 지금 요청한 페이지에 연관된 "자바스크립트만" 번들링해서 hydration을 해주는 것인가요?

 

저의 질문이 조금 장황할 수도 있을 것 같지만 양해부탁드립니다.

답변 2

0

이정환 Winterlood님의 프로필 이미지
이정환 Winterlood
지식공유자

2024. 10. 04. 20:29

안녕하세요 이정환입니다.

Next.js의 사전 렌더링은 현재 브라우저가 요청한 페이지를 이루는 모든 리액트 컴포넌트를 HTML로 변환하는 과정으로 출발합니다. 이때 주의하실 점은 존재하는 모든 컴포넌트가 아닌 현재 페이지를 구성하는 모든 컴포넌트라는 점 입니다. 더 쉽게 말해 현재 페이지를 Next 서버 측에서 HTML로 생성해 보내준다고 이해하시면 됩니다.

처음에 html로 변환할때 "jsx 부분만" 변환하나요?

아니면 처음에 html로 변환할때 "jsx 부분만" 변환하지 않나요?

위 질문에 대해서는 죄송하지만 잘 이해하지 못했습니다 ㅠㅠ 궁금하신 점이 어떤 점인지 조금 더 구체적으로 말씀 부탁드립니다.

추가로 Hydration이라는 과정은 강의에서 말씀드렸듯이 HTML과 JS를 연결하는 과정입니다. 따라서 HTML과 CSS의 연결은 일반적인 웹사이트와 동일하게 발생하며 Hydration에 포함되는 과정은 아닙니다.

마지막으로 현재 페이지에 필요한 자바스크립트 코드만 Hydration이 이루어지게 됩니다. 그 이유는 간단한데요 단순히 Hydration이라는 과정이 현재 브라우저에 렌더링된 페이지의 HTML과 JS를 연결하는 과정이기 때문입니다.

chebread님의 프로필 이미지
chebread
질문자

2024. 10. 05. 20:17

처음에 html로 변환할때 "jsx 부분만" 변환하나요?

아니면 처음에 html로 변환할때 "jsx 부분만" 변환하지 않나요?

이 질문의 뜻은,

아래의 이러한 코드에서 jsx를 반환하는 부분만 처음 사전 렌더링시에 html로 변환하느냐 입니다. 즉, jsx를 반환하는 부분외의 부분(import style from './index.module.css', .... 같은 것)도 함께 변환되느냐를 질문드린것입니다.

import { GetServerSidePropsContext, InferGetServerSidePropsType } from "next";
import style from "./[id].module.css";
import fetchOneBook from "@/lib/fetch-one-book";

const mockData = {
  id: 1,
  title: "한 입 크기로 잘라 먹는 리액트",
  subTitle: "자바스크립트 기초부터 애플리케이션 배포까지",
  description:
    "자바스크립트 기초부터 애플리케이션 배포까지\n처음 시작하기 딱 좋은 리액트 입문서\n\n이 책은 웹 개발에서 가장 많이 사용하는 프레임워크인 리액트 사용 방법을 소개합니다. 인프런, 유데미에서 5000여 명이 수강한 베스트 강좌를 책으로 엮었습니다. 프런트엔드 개발을 희망하는 사람들을 위해 리액트의 기본을 익히고 다양한 앱을 구현하는 데 부족함이 없도록 만들었습니다. \n\n자바스크립트 기초 지식이 부족해 리액트 공부를 망설이는 분, 프런트엔드 개발을 희망하는 취준생으로 리액트가 처음인 분, 퍼블리셔나 백엔드에서 프런트엔드로 직군 전환을 꾀하거나 업무상 리액트가 필요한 분, 뷰, 스벨트 등 다른 프레임워크를 쓰고 있는데, 실용적인 리액트를 배우고 싶은 분, 신입 개발자이지만 자바스크립트나 리액트 기초가 부족한 분에게 유용할 것입니다.",
  author: "이정환",
  publisher: "프로그래밍인사이트",
  coverImgUrl:
    "https://shopping-phinf.pstatic.net/main_3888828/38888282618.20230913071643.jpg",
};

export const getServerSideProps = async (
  context: GetServerSidePropsContext
) => {
  // SSR으로 동작하는 페이지가 됨.
  const id = context.params!.id;
  const book = await fetchOneBook(Number(id));

  return {
    props: {
      book,
    },
  };
};

export default function Book({
  book,
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
  if (!book) return "문제가 발생했습니다. 다시 시도하세요.";

  const { id, title, subTitle, description, author, publisher, coverImgUrl } =
    book;

  return (
    <div className={style.container}>
      <div
        className={style.coverImgContainer}
        style={{ backgroundImage: `url('${coverImgUrl}')` }}
      >
        <img src={coverImgUrl} />
      </div>
      <div className={style.title}>{title}</div>
      <div className={style.subTitle}>{subTitle}</div>
      <div className={style.author}>
        {author} | {publisher}
      </div>
      <div className={style.description}>{description}</div>
    </div>
  );
}

0

인프런 AI 인턴님의 프로필 이미지

2024. 10. 04. 16:41

안녕하세요, 인프런 AI 인턴입니다.

chebread님께서 Next.js의 사전 렌더링 과정과 관련하여 궁금한 점을 잘 정리해 주셨네요. 이와 관련된 질문에 대한 해답을 찾고자 관련된 기존 답변을 소개해 드립니다.

  1. HTML 변환 시점에서 변환되는 JSX 부분: Next.js에서는 서버에서 사전 렌더링 시 “현재 요청한 페이지의 JSX 부분”만을 변환하여 HTML로 만들어 브라우저에 전달합니다. 즉, 전체 애플리케이션의 모든 JSX를 변환하는 것이 아니라, 사용자가 현재 접속한 페이지와 관련된 부분만 변환합니다. 이 부분은 Next.js 사전 렌더링과 관련된 질문에서 상세하게 설명되어 있습니다.

  2. Hydration 과정에서 로딩되는 콘텐츠: Hydration 과정에서는 주로 “자바스크립트 파일”이 브라우저에 전달되어 이미 렌더링된 HTML 구조와 결합하여 상호작용성을 추가합니다. 스타일링이 필요한 경우 CSS 파일이나 기타 자원(image, JSON 등)이 필요한 경우도 있을 수 있지만, 기본적으로 주된 목적은 자바스크립트를 통한 상호작용성 보장입니다. 이에 대한 추가적인 설명은 Next.js의 사전 렌더링과 상호작용성 관련 답변에서 찾으실 수 있습니다.

이러한 과정을 통해 처음 페이지가 로드될 때 빠른 FCP를 제공하고, 이후 Hydration을 통해 TTI를 낮추는 구조로 운영됩니다. 궁금하신 점이 완벽히 해소되지 않는다면 이러한 링크들을 참고하여 더 많은 인사이트를 얻으시길 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

chebread님의 프로필 이미지

작성한 질문수

질문하기