클라이언트 컴포넌트의 사전 렌더링 질문
안녕하세요, 우선 강의 너무 잘 들었습니다.
사전 렌더링에 대한 부분에서 궁금중이 있어 문의를 남깁니다.
클라이언트 컴포넌트 또한 서버에서 JS 실행을 통해 서버 측에서 사전 렌더링이 된다는 것을 알고 있습니다.
다만, 서버에서 실행되는 사전 사이드 렌더링의 경우 useEffect, useState 등과 같은 훅은 어떤 식으로 실행이 되는지 궁금합니다.
왜냐하면 서버 클라이언트에서는 훅 사용이 불가능한 것으로 알고 있는데, 이는 곧 서버에서 훅을 사용하지 못한다는 뜻으로 이해하고 있어서요.
만약 해당 훅 들이 서버에서 실행되지 않고, 컴포넌트에 마운트 된 이후에 실행 되는 것이라면, 컴포넌트 return 문 안에 있는 State나 로직들은 undefined 인 상태에서 렌더링 되어 Client에 HTML 형태로 전달 되는 것일까요?
또한 비슷한 질문인데, 사전 렌더링에서 local storage, DOM 조작 등과 같이 Client에서만 접근 가능한 API에서는 어떤 식으로 사전 렌더링이 진행되는지, 그리고 초기 HTML을 그릴 때는 해당 값들을 어떻게 처리하는 지 궁금합니다.
좋은 강의 감사합니다!
답변 2
1
안녕하세요 이정환입니다.
결론부터 말씀드리자면, 사전 렌더링 과정 중 클라이언트 컴포넌트는 초기 UI를 렌더링 하는 방향으로만 동작해요 useState를 통해 만든 State는 초기값으로 사용되고, useEffect 등은 마운트 이후에만 동작하니 아예 동작하지 않게 됩니다.
로컬 스토리지나 DOM 조작 등의 브라우저 API를 이용하는 경우에는 오류가 발생해요! 이런 코드는 서버 측에서는 접근 자체가 불가능 하기 때문에 조건문 등을 통해 브라우저 환경에서만 실행되도록 막아두셔야 합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
itjustbong님의 클라이언트 컴포넌트의 사전 렌더링 과정에 대한 질문에 대해 답변을 드리겠습니다. Next.js나 React의 서버 측 렌더링에서 사용되는 훅(useEffect, useState 등)의 동작 원리에 대한 궁금증은 많은 개발자들이 접하는 주제입니다.
훅이 서버에서 어떻게 동작하는가?
서버에서 클라이언트 컴포넌트가 사전 렌더링될 때, React 훅인useEffect는 서버 쪽에서 실행되지 않습니다. 이는useEffect가 주로 브라우저 환경에서 실행되어야 하는 로직(부수 효과)들을 처리하기 때문입니다. 대신,useState의 경우 초기값에 기반하여 서버에서도 초기 상태를 적용할 수 있으며, 이 상태는 사전 렌더링된 HTML의 일부로 포함됩니다. 하지만 초기 상태 이후의 상태 변화는 클라이언트 측에서 초기화됩니다.useEffect와 같은 훅 사용 시 서버에서의 불가능성:
사전 렌더링할 때useEffect와 같은 훅은 서버 환경에서는 처리되지 않습니다. 서버 렌더링은 주로 ‘첫 번째 페인트’에 필요한 최소한의 HTML을 제공하기 때문에, 이후의 클라이언트 상호작용(상태 변경 등)은 클라이언트의 역할로 남겨둡니다.사전 렌더링과 클라이언트 전용 API(Local Storage, DOM 조작 등):
서버에서만 실행되는 사전 렌더링에서는 클라이언트 전용 API(Local Storage, DOM 조작 등)에 접근할 수 없습니다. 이러한 경우, 코드가 클라이언트에서만 실행되도록 조건문(예:typeof window !== "undefined")을 사용하여 브라우저에서만 해당 로직을 실행하도록 분리해야 합니다.
이와 관련된 추가 질문이 있을 경우 “Next.js 사전 렌더링에 대해서 더 궁금한 부분이 있습니다.”를 참고하시면 도움이 될 수 있습니다. 이 질문에서는 사전 렌더링과 Hydration 과정 및 초기 HTML 제공 방식에 대해 더 깊이 있는 설명을 제공합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
풀라우트캐시 동작 원리에서 데이터 캐시 관련 질문
0
23
2
next.js 프로젝트
0
28
1
Next.js + Tanstack Query BFF 구조 질문
0
29
2
Next.js 사전렌더링 이해하기 부분
0
34
2
모달 관련 질문
0
42
3
렌더링 관련 질문
0
80
2
중복으로 하나의 api를 요청할 때 캐싱 옵션 통일화
0
64
2
라우트 세그먼트 옵션 강좌 노트에 사소한 제보 남깁니다.
0
65
2
SSR시 context에 params말고 query를 사용하면 안되나요?
0
75
2
npx prisma db push 시 에러가 뜹니다.
0
94
3
vercel 배포를 실패하였습니다.
0
101
3
Image 컴포넌트 사용시 브라우저 콘솔에 경고는 왜 뜨는걸까요?
0
57
2
getServerSideProps 함수와 SSR의 관계
0
78
6
없는 페이지인데 풀라우트캐시로 저장이 되는 이유가 궁금합니다
0
61
2
실제 프로젝트에서 SSR 사용에 관해서 질문드립니다.
0
117
2
일반적인 nextjs project architecture에 대하여..
0
90
2
2.14 Search에서 작성한건 static이긴하지만 CSR이 아닌가요?
0
74
2
배포 시 오류 발생
0
90
2
백엔드 서버 오류납니다.
0
83
2
취약점 제거시 nestjs 버전 문제가 생길까요?
0
93
1
eslint.config.mjs 내 rules 어떻게 설정 하나요?
0
107
1
[book]/[id]/page.tsx 모달 띄울 때 성능 하락 현상은 ReviewList를 불러오면서 발생하는 문제 같습니다.
0
63
2
빨간줄 설정
0
77
2
익스텐션 질문
0
61
1





