inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Next.js App router 기반 Chat GPT 만들기

사이드 바 & 대화 페이지 DB 연동

섹션7 사이드바 &대화페이지 연동 3분50초경 질문

해결된 질문

168

이현종

작성한 질문수 2

0

클라이언트 컴포넌트안의 자식컴포넌트들은 자동으로 클라이언트 컴포넌트로 바뀌는데 사용할 자식 컴포넌트를 children으로 처리하면 클라이언트 컴포넌트로 바뀌지 않고 서버컴포넌트로 남기때문에 문제가 발생하지 않는건가요? 그렇다면 그게 가능한 메커니즘은 무엇인지 궁금합니다 ㅠㅠ

react typescript next.js tailwindcss zustand chatgpt

답변 1

1

코딩먹방

안녕하세요! 질문 주신 내용에 답변을 하기 위해서 먼저 next.js 에서 렌더링이 어떤 과정을 통해 이루어지는지를 먼저 설명드려야할 거 같습니다.

nextjs 에선 서버에서 2단계 클라이언트에서 3단계에 걸쳐 렌더링이 일어나게 되는데요. 그 과정은 아래와 같습니다.

서버

  1. 리액트는 서버 컴포넌트를 react server component payload(RSC Payload) 의 형태로 먼저 렌더링하게 됩니다.

    1. RSC Payload 는 압축된 바이너리 표현으로 아래와 같은 정보를 포함하고 있습니다.

      1. 서버 컴포넌트 렌더링 결과물

      2. 클라이언트 컴포넌트가 렌더링될 위치와 해당 자바스크립트 파일에 대한 참조를 위한 placeholder

      3. 서버 컴포넌트에서 클라이언트 컴포넌트로 전달된 모든 소품

  2. 그리고 이 rsc payload 와 javascript instructions 을 사용해 서버에서 초기 html 생성해 클라이언트에 보냅니다.

클라이언트

  1. 클라이언트는 초기 html 를 즉시 표시하고 이 초기 html 은 non-interactive 하고 초기 로드에만 사용됩니다.

  2. 클라이언트에서 rsc payload 를 사용해 클라이언트 컴포넌트를 채워넣고(reconcile) dom을 업데이트 합니다.

  3. 서버에서 받은 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> 
)}

 

참고:

https://nextjs.org/docs/app/building-your-application/rendering/server-components#how-are-server-components-rendered

https://nextjs.org/docs/app/building-your-application/rendering/composition-patterns#unsupported-pattern-importing-server-components-into-client-components

1

이현종

아!! 이미 상위 서버 컴포넌트에서 렌더링이 되어 들어가기 때문이였군요. 정확히 이해됐습니다 감사합니다~

agent model 질문

0

7

1

[MISSION 3] 질문입니다.

0

10

1

강의 완료 시점 문의

0

12

1

🔥[MISSION 7] 프로필 웹 Github 링크 제출하기🔥질문

0

13

1

에이전트 팀 문의

0

20

1

함수를 입력한 후

0

12

1

전자책으로 구매인증 가능할까요?

0

19

1

클로드 코드 설치 후 아이콘

0

16

0

입력란 위치 조정 가능 여부

0

16

1

이제 인프런에서 강의 더 안산다. 후져....

0

18

0

fatal: not in a git directory

0

19

1

AI가 만들어 주는 엑셀 함수를 다 이해하고 넝어가야 할까요?

0

15

0

vercel new project 에 노출되지 않으면 어떻게 해야 할까요?

0

30

1

소스코드 어디서 다운받아요?

0

31

5

동영상 끊김 ( 섹션 2 )

0

25

2

14강은 언제 올라올까요??

0

29

2

supabase 다른 프로젝트 적용 관련 질문드려요.

0

31

1

섹션6 헤더 마크업 - zustand 적용에 오류가 발생합니다

0

129

2

page loading... 이 안보입니다.

0

84

2

Streaming 관련 질문

0

111

2

loading이 동작하지 않습니다.

0

230

2

Runtime Error

0

195

2

Route Handler 에서 Post 코드 작성해봤는데 계속 에러가 납니다 ㅠㅠ

0

261

2

섹션7 사이드바 &대화페이지 연동 9분50초경 질문

0

189

1