React 10주년 기념 Delba de Oliveira(Vercel)가 React 코어 팀의 Andrew Clark, Sebastian Markbåge의 React, 서버 컴포넌트에 대한 탁상 토론이 있었다. 아래는 토론 내용을 정리한 것이다.
React를 단순한 어떤 패키지라거나 특정한 것에 대한 구현, 특정한 API에 국한된 것으로 생각하지 말자
React는 UI, 사용자 경험, 애플리케이션을 작성하는 방법에 관한 것이다.
React가 관심있는 것은 Component
와 Composability
이다.
Component Model
Component Model & Data Fetching Model
아래와 같은 고민들이 있었다.
GraphQL, Relay에서 영감을 받았다.
지금까지의 SSR과는 다른 개념
위의 문제들을 하나하나 해결하려고 서버 컴포넌트가 등장한 것은 아니고, 만들고 나니 저 모든 문제들을 싹 다 해결하더라!
Server Streaming
Suspense
Be Fresh
To Be Simple
React
서버 컴포넌트위 토론에서 알 수 있듯, React는 서버와 클라이언트를 활용하는 하이브리드 애플리케이션을 구축하기 위한 새로운 모델을 도입했다.
이제 용도에 따라 컴포넌트를 렌더링할 위치(클라이언트 or 서버)를 선택한다.
클라이언트 사이드 앱의 풍부한 상호작용 + 기존 서버 렌더링의 향상된 성능의 결합
프론트엔드 개발자가 서버 인프라를 더 잘 활용할 수 있다.
Next.js App directory
Next.js에서 route가 로드되면 초기 HTML이 서버에서 렌더링된다.
App Router에 있는 모든 컴포넌트는 기본적으로 서버 컴포넌트이다.
use client
를 사용해 클라이언트 컴포넌트를 선택적으로 사용할 수 있다.애플리케이션에 클라이언트 측 인터랙션을 추가할 수 있다.
use client
서버 컴포넌트 모듈 그래프
클라이언트 컴포넌트 모듈 그래프
언제 사용할까? | 서버 컴포넌트 | 클라이언트 컴포넌트 |
---|---|---|
데이터 패칭 백엔드 직접 접근 서버에 민감한 정보 유지 서버에 대규모 종속성 유지 / 클라이언트 자바스크립트 줄이기 | O | X |
상호작용 및 이벤트 리스너 추가 State나 생명주기 Effect 사용 browser-only API 사용 State, effect, brower-only API 기반의 커스텀 hook 사용 React Class component 사용 | X | O |
클라이언트 컴포넌트를 잎(Leaves)으로 이동하기
클라이언트와 서버 컴포넌트를 동일한 컴포넌트 트리에서 결합하기
클라이언트 컴포넌트 내에 중첩된 서버 컴포넌트
children
props을 사용하기children
prop이 아니라 어떤 JSX든 상관 없다.// app/client-component.tsx
'use client';
import { useState } from 'react';
export default function ClientComponent({ children }
: { children: React.ReactNode; }) {
const [count, setCount] = useState(0);
return (
<>
<button onClick={() => setCount(count + 1)}>{count}</button>
{children}
</>
);
}
// app/page.tsx
import ClientComponent from './client-component';
import ServerComponent from './server-component';
export default function Page() {
return (
<ClientComponent>
<ServerComponent />
</ClientComponent>
);
}
서버에서 클라이언트로 props 전달하기 (Serialization)
서버 전용 코드를 클라이언트 컴포넌트에서 제외하기 (Poisoning)
server-only
패키지
client-only
패키지도 있다.데이터 패칭
서드파티 패키지
use client
지시어가 없다.대부분의 React 애플리케이션을 직간접적으로 context에 의존해 컴포넌트 간에 데이터를 공유한다.
서드 파티 context provider를 서버 컴포넌트에서 렌더링하기
use client
를 포함해 서버 컴포넌트 내부에서 직접 렌더링할 수 있도록 하자서버 컴포넌트 간에 데이터 공유하기
global singleton
패턴서버 컴포넌트 간에 fetch request 공유하기
Getting Started: React Essentials
React Roundtable: Server Components, Suspense, and Actions
굳!