해결된 질문
작성
·
25
0
안녕하세요 강사님,
복습하는 과정 중에 Page Router 기준으로 SSR + 프리패칭 + Hydration 흐름을 제가 이해한 대로 정리해보았는데, 이게 맞는지 확인 부탁드립니다.
사용자가 /a
페이지에 있을 때 <Link href="/c" prefetch>
가 있으면, 브라우저는 백그라운드에서 /c.js
(코드 스플리팅된 JS 청크)만 미리 받아 캐시에 저장해둔다.
→ 이 단계에서는 HTML이나 데이터(getServerSideProps
결과)는 가져오지 않는다.
사용자가 실제로 /c
를 클릭하면, 서버가 getServerSideProps
를 실행해서 데이터를 패칭하고, 그 결과를 반영한SSR HTML + JSON을 브라우저에 내려준다.
브라우저는 HTML을 먼저 렌더링해서 FCP가 나오고, 이어서 캐시에 있던 /c.js
를 실행한다.
그 후 React가 HTML과 JS를 매칭시켜 Hydration을 수행하여 이벤트 핸들러를 연결한다.
즉, SSR 페이지 전환 시
1. User 클릭 → (서버) HTML 생성 및 데이터 패칭 → (브라우저) HTML 렌더링 → JS 실행 → Hydration
이고, 프리패칭은 그 전에 JS만 준비해 두는 과정으로 이해했습니다.
제가 이해한 흐름이 맞을까요?
머메이드로 도식화하자면 다음과 같습니다
.
위가 맞다면, 빠른 페이지 전환을 위해하는 프리패칭을 했지만 결국 데이터 패칭 및 HTML을 서버에서 다시 그려오는데 빠른 전환이 가능한건지 궁금합니다.
혹시 여기서 놓치고 있는 부분이나, 실제 네트워크 요청에서 다른 점이 있다면 알려주시면 감사하겠습니다!
답변 2
0
안녕하세요 이정환입니다.
2번 과정에서 사용자가 실제로 /c 를 클릭할 때에 서버가 getServerSideProps를 통해 데이터를 페칭하는 것은 맞지만, HTML을 새롭게 그려내는 것은 아닙니다. HTML은 브라우저측에서 프리페칭된 /c 경로의 JS Bundle을 통해 클라이언트 사이드 렌더링 방식으로 그려냅니다.
이 과정은 리액트에서의 페이지 이동과 동일하다고 이해하시면 쉽습니다.
브라우저의 입장에서 보면 /a 페이지에 접속한 시점에, 이미 프리페칭을 통해 /c 페이지의 JS Bundle 까지 받아둔 상태이기 때문에
실제로 /c 페이지로 이동할 때 지금까지 전달받은 JS Bundle(리액트 컴포넌트들)만으로도 /c 페이지의 HTML을 생성할 수 있습니다.
안녕하세요 이정환입니다.
결론부터 말씀드리자면, 화면상의 렌더링은 데이터를 SSR로 받아오는 과정을 대기했다가 이루어집니다. 프리페칭으로 전달받은 JS Bundle을 통해 HTML을 생성해 두고, SSR로 제공되는 데이터를 기다렸다가 둘을 합쳐 페이지를 렌더링한다고 이해하시면 됩니다!
0
안녕하세요, 인프런 AI 인턴입니다. kos7662님!
Next.js의 데이터 패칭과 프리패칭의 흐름에 대해 상세하게 정리해 주셨네요. 한 번 살펴보고 설명드리겠습니다.
Next.js는 페이지 전환 시 성능 최적화를 위해 프리패칭과 같은 다양한 기법을 사용하고 있습니다. 다음은 여러분이 정리하신 내용과 맞닿아 있는 적절한 설명입니다:
프리패칭:
/c.js
와 같은 코드스플리트된 자바스크립트 파일을 미리 다운로드하여 캐시에 저장합니다.사용자가 링크 클릭 시:
getServerSideProps
가 실행되어 필요한 데이터가 패칭됩니다.클라이언트 처리:
/c.js
를 사용해 즉각적인 자바스크립트 실행이 이루어지고, 이로 인해 Hydration(React의 HTML과 JS 매칭 및 이벤트 핸들러 연결) 프로세스가 시작됩니다.프리패칭은 페이지 전환 시 여전히 서버 요청을 필요로 하지만, 자바스크립트 코드가 이미 준비되어 있기 때문에 사용자가 경험하는 페이지 전환 속도가 빨라질 수 있습니다. 이 과정에서 HTML과 데이터 패칭은 서버-클라이언트 간 추가적인 요청이 발생하지만, 자바스크립트 실행은 지연 없이 이루어집니다.
프리패칭이 성능에 미치는 영향:
HTLM과 데이터의 서버 요청:
다음 링크도 참조해 보시면 유사한 질문들에 대한 강사님의 답변을 확인할 수 있습니다:
- 섹션2 1.2 페이지 이동 및 데이터페칭 관련 질문
질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답변 감사드립니다.
강사님 답변을 이해한대로 정리해보면,
1. /a 페이지에서 /c페이지에 대한 JS Bundle이 브라우저에 프리패칭된다.
2. 실제 /c 클릭 후 getServerSideProps를 통해 데이터를 패칭한다.
3. 이미 그려진 /c 페이지에 데이터 부분만 주입된다
잘 이해한게 맞을까요?
여기서 아직 이해가 안된 부분은 jsBundle로 /c페이지의 html이 완성되어 있는 상태에 3번 과정 전까지 데이터가 없을텐데 어떻게 보여지고 있는지 궁금합니다..
CSR처럼 페이지 전환이 이뤄졌고 렌더링됐는데, 데이터는 SSR로 받아온다는 부분이 잘 받아들여지지가 않네요
감사합니다!