검색 리스트 컴포넌트가 ssr이 되어야 할 것이 전적으로 csr이 되고 있다. 초기 렌더링시엔 ssr, 후엔 csr이 되게 해야한다.
시도1) ssr렌더링이 필요한 컴포넌트만 layout.tsx
로 옮겨본다.
시도2 ✅)
ssr렌더링이 필요한 서버 컴포넌트지만 상태업데이트가 필요한 컴포넌트들은 page.tsx
에서 구성하고,
// app/search/page.tsx
... 모듈 가져오기 로직 => 생략
export default async function SearchPage({
_,
searchParams,
}: {
_;
searchParams: {[key: string]: string };
}) {
const accessToken = getAccessToken();
const {productsList, totalSize} = await makeProductsListPerType(
searchParams,
accessToken,
);
return (
<>
<SearchHeader totalSize={totalSize} />
<SearchList productList={productsList} />
</>
);
}
리렌더링될 필요가 없는 컴포넌트들은 layout.tsx
에 구성을 해주었다.
// app/search/layout.tsx
... 모듈 가져오기 로직 => 생략
export default function SearchLayout({children}: {children: ReactNode}) {
return (
<>
<SearchForm />
<SearchFilters />
{children}
</>
);
}
ssr렌더링을 위해 searchParams
값을 활용해야했는데, 아무 값도 들어오지 않았다. 그래서 아래와 같은 형식으로 uri가 완성될 수 있도록 useChangeInputField
로직을 아래와 같이 수정해주었다. 그 외 utils.ts
파일에 쿼리스트링을 만들기 위한 searchParamList
를 만드는 로직과 쿼리스트링을 가지고 데이터 요청을 하여 데이터를 받아오는 로직을 각각 분리해주었다. (추후 utils
함수에서도 이 로직들을 분리해주는 것이 좋겠다.)
// hooks/useChangeInputField.ts
// ... 가져오기 모듈 생략
export default function useChangeInputField() {
const router = useRouter();
const searchParams = useSearchParams();
const searchTerm = searchParams.get('searchTerm');
// ... 그 외 훅 생략
const handleConfirmSearch = (event: any) => {
if ((event.type === 'keyup' && event.keyCode === 13) || event.type === 'click') {
// ... 생략
// 라우터 푸시
const searchParamList = makeSearchParamList({
searchTerm,
});
const queryString = [...searchParamList, 'nowPage=1'].join('&');
router.push('search' + '?' + queryString);
}
};
return {
handleConfirmSearch,
};
}
next13.4.19
버전에선 이 문제가 해결되었다고 하여 버전 업그레이드를 함으로써 해결할 수 있었다.위 이미지에서 미리보기로 보이듯이 pre-rendering이 되기 때문에 이후 재검색하면 re-rendering(깜빡임)없이 csr되는 것을 확인할 수 있었다.