Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
📑 이슈 번호
#324
🚧 구현 내용
메인페이지 SSR이 정상적으로 동작하지 않아 개선을 시도중입니다.
발견한 원인 및 이슈
1. Mount 이후 렌더링되는 ThemeProvider
기존의 최상단
layout.tsx
에서Header
를 비롯한 메인화면의 요소들이 다크모드 적용을 위한next-theme
의ThemeProvider
로 감싸져 있었습니다.개발하던 당시 다크모드 상태에서 리렌더링이 발생하거나 새로고침을 하게 될 시 서버에서 다크모드여부를 판별하지 못해 깜빡임 현상이 발생하였고
Providers
가 마운트되었을때 렌더링을 하게 코드를 작성하여 깜빡임 현상을 없애긴 했지만 이로인해Providers
하위의 요소들은 서버사이드에서 렌더링을 할 수가 없게 되었습니다.Providers
에서 컴포넌트 마운트가 되었을시에만ThemeProvider
를 렌더링하던 코드를 다시 이전으로 되돌렸습니다.2.
page.tsx
에서 사용하는useSearchParams
훅useSearchParams
훅을 사용하는 컴포넌트가 포함된 페이지는 클라이언트사이드에서만 렌더링되며 요소들이 서버사이드에서 미리생성되지 않았습니다.useSearchParams를 사용하는 컴포넌트는 따로 모듈로 뺀다음 부모 컴포넌트에서
Suspense
바운더리에 넣어 주었습니다.3. 메인화면 인기링크리스트 prefetching
기존의 클라이언트 사이드에서 데이터를 fetch하던 메인화면의 인기링크리스트를 react-query의
Hydration
을 사용하여 서버사이드에서 prefetch 하여 SSR을 적용하였습니다.React-query
Hydration
의 동작과정은 다음과 같습니다.getQueryClient
를 사용해QueryClient
를 가져온다.QueryClient
의prefetchQuery
메소드를 사용하여 데이터를 프리페치하고 완료될 때까지 기다린다.QueryClient
를dehydrate
메소드를 활용하여 dehydrate 한다.<HydrationBoundary>
로 랩핑하고dehydrate된 상태값
을 props로 넘겨준다.<HydrationBoundary>
컴포넌트가 실행되고 클라이언트의QueryClient
에dehydrate된 상태값
을 다시 넣어 hydrate 한다. 즉 클라이언트에서도 서버에서 prefetching 한 데이터가 QueryClient안에 캐싱되게 된다.🚨 특이 사항