섹션7 사이드바 &대화페이지 연동 3분50초경 질문
클라이언트 컴포넌트안의 자식컴포넌트들은 자동으로 클라이언트 컴포넌트로 바뀌는데 사용할 자식 컴포넌트를 children으로 처리하면 클라이언트 컴포넌트로 바뀌지 않고 서버컴포넌트로 남기때문에 문제가 발생하지 않는건가요? 그렇다면 그게 가능한 메커니즘은 무엇인지 궁금합니다 ㅠㅠ
답변 1
1
안녕하세요! 질문 주신 내용에 답변을 하기 위해서 먼저 next.js 에서 렌더링이 어떤 과정을 통해 이루어지는지를 먼저 설명드려야할 거 같습니다.
nextjs 에선 서버에서 2단계 클라이언트에서 3단계에 걸쳐 렌더링이 일어나게 되는데요. 그 과정은 아래와 같습니다.
서버
리액트는 서버 컴포넌트를 react server component payload(RSC Payload) 의 형태로 먼저 렌더링하게 됩니다.
RSC Payload 는 압축된 바이너리 표현으로 아래와 같은 정보를 포함하고 있습니다.
서버 컴포넌트 렌더링 결과물
클라이언트 컴포넌트가 렌더링될 위치와 해당 자바스크립트 파일에 대한 참조를 위한 placeholder
서버 컴포넌트에서 클라이언트 컴포넌트로 전달된 모든 소품
그리고 이 rsc payload 와 javascript instructions 을 사용해 서버에서 초기 html 생성해 클라이언트에 보냅니다.
클라이언트
클라이언트는 초기 html 를 즉시 표시하고 이 초기 html 은 non-interactive 하고 초기 로드에만 사용됩니다.
클라이언트에서 rsc payload 를 사용해 클라이언트 컴포넌트를 채워넣고(reconcile) dom을 업데이트 합니다.
서버에서 받은 javascript instructions 을 사용해 클라이언트 컴포넌트에 hydrate 합니다.
위와 같은 렌더링 과정을 거치는데요. 과정을 보면 클라이언트 컴포넌트는 서버에서 "클라이언트 컴포넌트가 렌더링될 위치와 해당 자바스크립트 파일에 대한 참조를 위한 placeholder" 의 정보만 가지고 있기 때문에 클라이언트 컴포넌트 내부가 어떻게 구현되어 있는지, 어떻게 렌더링이 되는 지 서버에서는 알지 못합니다. 따라서 그 하위에 있는 컴포넌트 역시도 자연스럽게 클라이언트 컴포넌트로 처리하게됩니다. 하지만 props로 받은 서버 컴포넌트는 상위(서버컴포넌트)에서 받기 때문에 이미 렌더링된 결과가 props로 들어오게 되고 rsc payload에는 이 props 정보도 있기 때문에 서버 컴포넌트를 유지하면서 받을 수 있게 됩니다. 아래 코드를 보면 좀 더 이해하시기 쉬울 거 같아요.
export default function ClientComponent({
children,
}: {
children: React.ReactNode
}) {
const [count, setCount] = useState(0)
return (
<>
<button onClick={() => setCount(count + 1)}>{count}</button>
{children}
</>
)}
import ClientComponent from './client-component'
import ServerComponent from './server-component'
// Pages in Next.js are Server Components by default
export default function Page() {
return (
<ClientComponent>
// 이렇게 children 으로 들어오는 컴포넌트는 상위 서버 컴포넌트에서 렌더링을 마친 후
// props 로 들어오기 때문에 서버 컴포넌트로 유지할 수 있습니다.
<ServerComponent />
</ClientComponent>
)}
참고:
output-styles은 Claude Code의 공식 기능이 아니라고 하는데 혹시 변경된걸까요?
0
3
1
클로드 변경
0
10
1
/config 에서 output-style 을 변경
0
9
0
한국어 문제
0
11
1
part2강의 문의사항입니다.
0
11
2
Node.js 관련 질문드립니다.
0
20
3
클로드 버전업 설치
0
19
2
쿠폰 문의 드립니다.
0
12
2
현재 진행중인 강의에 마케팅 요소를 녹이는 방법
0
31
1
데브옵스에 관련된 지식
1
39
0
케이테스트 서버 운영 방법
2
35
0
13강 프로젝트 생성 Next.js 설치이슈
0
13
2
Shell Command: Install 'cursor' command 진행에서 막혔습니다
0
14
2
74. 데이터 캐시 - 1 (이론) 강의 영상 누락
0
18
1
Agent team / subagent 생성시 재사용 가능 여부
0
23
2
shirimp task manager는 프로젝트 처음 시작 단계에서도 쓴는 것 과 관련해서 질문
0
14
2
MCP 서버 내용 변경
0
22
2
섹션6 헤더 마크업 - zustand 적용에 오류가 발생합니다
0
116
2
page loading... 이 안보입니다.
0
70
2
Streaming 관련 질문
0
103
2
loading이 동작하지 않습니다.
0
221
2
Runtime Error
0
182
2
Route Handler 에서 Post 코드 작성해봤는데 계속 에러가 납니다 ㅠㅠ
0
250
2
섹션7 사이드바 &대화페이지 연동 9분50초경 질문
0
178
1





