Replies: 4 comments 3 replies
-
|
Beta Was this translation helpful? Give feedback.
-
간단한 의견을 남겨보자면.. 저는 data Fetching과 관련된 작업을 각 컴포넌트에서 data fetching을 수행 할 때 중복 요청 문제는
|
Beta Was this translation helpful? Give feedback.
-
저는 data fetching이 컴포넌트에서 이루어져야한다고 생각합니다. 기존에는 ssr을 위해 페이지에서만 data fetching이 가능했습니다. 그러다보니 html을 다운받고, js를 다운로드받아 전체 페이지에 대한 hydration이 이루어지게됩니다. 결국 페이지를 그리기 위해서는 getServerSideProps에 있는 모든 data fetching이 이루어야하고, 페이지 내의 모든 컴포넌트를 다운받고, 하이드레이션 과정이 선행되어야 하는거죠. 하지만 서버 컴포넌트를 사용할 경우 컴포넌트에서 data fetching이 가능합니다. 이를 통해 페이지에 존재 하는 컴포넌트들을 여러개의 chunk들로 쪼갤 수 있고, streaming을 통해 서버에서 클라이언트로 전달할 수 있습니다. 우선순위가 높은 영역만 먼저 hydration이 가능하고, 중요도가 떨어지는 부분은 별도의 hydration을 통해 그릴 수 있게됩니다. TTFB나 FCP 등 성능 측면에서도 더 유리한 방향이기도 하구요. 결국 data fetching을 컴포넌트에서 하는게 가능해지면서 전체 페이지를 hydration해야만 했던 기존과는 다르게 selective hydration이 가능해진 상황에서 이를 활용하지 않을 이유는 없다고 생각합니다. 물론 경우에 따라서는 페이지 단위에서 호출하는게 더 나을 수도 있겠지만요. 말씀하신 단점의 경우는 fetch를 사용한다면 request memoization을 통해 중복 호출을 막아줄 수 있는걸로 알고 있는데요. prisma 같은걸 사용한다면 cache function의 사용을 고려해볼 수 밖에 없을것같아요. cookie()나 headers()의 경우 request에 따라 달라질 수 있는 정보라서 ssg가 불가능한게 어찌보면 당연한 동작이라는 생각이 듭니다. |
Beta Was this translation helpful? Give feedback.
-
SEO 컨텐츠에 대한 관리 포인트를 어떻게 다루느냐. 이 문제에 대한 화두는 여러가지가 있다고 보이네요. app router에서 page 컨벤션을 활용해서 fetching 하는 효과는 관리 포인트를 프레임워크 동작 방식에 맞춘다는 것에 있습니다. 데이터의 목적? 또는 렌더링의 목적. 관리 포인트. 화면 제어... 이런 화제에 대한 스탠스가 코드의 형태도 결정하지 않을까 싶네요. |
Beta Was this translation helpful? Give feedback.
-
React 18에서 React Server Component가 등장하면서 Async Component를 통하여 직접 데이터를 가져올 수 있게 되었는데요, 이로 인해서 Data Fetching은 어디서 이루어져야 하는가에 대한 고민이 생겼습니다.
1. Data Fetching은 Page 단에서 이루어져야 한다
Page 단에서 Data를 가져오는 이 접근은 Next.js의 역사적 구조와도 어느 정도 일관성이 있다고 생각합니다. Next.js에서는 Server Side Rendering을 지원하기 위해서 Pages Router를 만들어 냈고, 그 과정에서
getServerSideProps
와 같은 Page 단계의 컴포넌트에서만 Data Fetching을 할 수 밖에 없었다고 생각합니다.장점
해당 방법에 대한 장점은 이후 (2)번 선택지인 Component 단에서 Data Fetching을 수행할 때 발생하는 단점이 나타나지 않는다는 것이 장점이라고 생각합니다.
단점
새로운 데이터가 내부 컴포턴트에서 필요한 경우 해당 페이지의
getServerSideProps
의 데이터를 수정해 주어야 한다는 단점이 있습니다. 이로 인해서 캡슐화가 일어나기 어려운 것 같아요. 가장 최선의 방법은 Component를 만들 때getData
함수를 병렬적으로 정의해 주면 되기도 하겠지만, 이 경우 방법 (2)의 단점 (1)의 문제를 다시 불러 일으킵니다.2. Data Fetching은 Component에서 이루어져야 한다.
장점
Component를 React Server Component로 작성하면 (1)에서 작성하여야 하였던
getData
함수와 같은 fetcher를 별도로 작성하지 않아도 되며, 사용할 때 데이터 흐름에 대하여 고민하지 않아도 됩니다.단점
동일한 서버 쿼리가 발생하기 쉽고, N + 1 문제가 발생하기 쉽습니다.
아래와 같은 Component를 생각해 볼 수 있을 것 같습니다.
만약 Component에
cookies()
또는headers()
와 같은 함수가 있다면 해당 Route는 Static Generation이 불가능하게 됩니다.다른 개발자분들의 의견이 궁금합니다.
59 votes ·
Beta Was this translation helpful? Give feedback.
All reactions