개발자

Next 서버 컴포넌트와 전역 상태관리

1월 7일조회 96

안녕하세요. Next15에서 서버 컴포넌트를 적극적으로 도입하여 프로덕트를 개발하고 있는데, 고민이 되는 부분이 있어 여러 분들의 도움을 얻고자 질문을 남깁니다. 서버 컴포넌트에서 받아온 데이터와 클라이언트 컴포넌트에서 사용하는 zustand가 적절히 사용되고 있는지 고민이 듭니다. 현재 GET 요청의 경우 각각의 서버 컴포넌트에서 fetch를 통해 진행하고, 해당 데이터를 자식 클라이언트 컴포넌트에서 사용할 경우 props로 내려 사용하고 있는데, 이때, 드릴링이 심해질 경우 zustand와 같은 전역 상태관리 라이브러리를 함께 사용하려고 합니다. 예를 들어, 서버 컴포넌트의 첫 번째 자식인 클라이언트 컴포넌트에서 zustand를 사용하고, 이후 자식 클라이언트 컴포넌트에서는 zustand를 통해 상태관리 할 때 자식인 클라이언트 컴포넌트의 업데이트가 진행되는 부분에서 try/catch를 통해 요청을 보내고, router.refresh()를 통해 서버 컴포넌트에서 데이터를 새로 받아옵니다. 이후 클라이언트 컴포넌트에서는 useEffect로 서버 컴포넌트에서 props로 받아온 데이터가 바뀌는 것을 감지하고, 해당 props를 zustand에서 사용하는 데이터로 업데이트하려고 하는데 문제가 될만한 점이 있을까요? 이와 관련된 링크나 답변이 있으시다면 감사히 받겠습니다!

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 0

답변이 없을 때 보이는 아이콘

첫 답변을 기다리고 있어요.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

1월 7일

Next.js와 Zustand를 함께 사용하는 경우, 주요 고려사항은 서버 렌더링에 의해 데이터가 전역 상태에 저장되지 않는다는 점입니다. 이 때문에 클라이언트 측에서 필요한 데이터를 재요청해야하는 상황이 발생할 수 있습니다. 첫 번째 요소로 getServerSideProps 및 getStaticProps를 사용하여 초기 페이지 로드에 필요한 데이터를 가져오고, 이어서 클라이언트 측에서 나머지 데이터를 가져오도록 조정하는 것이 일반적인 접근법인데, 사용하시는 방식도 비슷해 보입니다. 다만, router.refresh()를 사용하여 서버 컴포넌트의 데이터를 강제로 새로고침하는 것은 매우 비효율적일 수 있습니다. 불필요한 네트워크 요청이 발생하고, 페이지 리렌더링을 초래하기 때문입니다. 대신, Zustand의 비동기 액션 기능을 활용하여 필요한 데이터만 업데이트할 수 있습니다. 다음과 같은 형태로 작성할 수 있습니다: ```javascript // Zustand Store import create from 'zustand' const useStore = create(set => ({ data: [], fetch: async () => { try { const res = await fetch('YOUR_API_ENDPOINT'); const data = await res.json(); set({ data }); } catch (error) { console.error(error); } } })) // Next.js Component import { useEffect } from 'react'; import useStore from '../store'; function MyComponent({ initialData }) { const { data, fetch } = useStore(); useEffect(() => { if (!data.length) fetch(); }, [data, fetch]); return ( // ...render your way... ); } MyComponent.getInitialProps = async () => { // Fetch initial data on server-side. }; ``` 이렇게 하면 필요한 데이터만 업데이트하고 불필요한 네트워크 요청을 줄일 수 있습니다. 가장 중요한 점은 적절하게 동기화하는 것입니다: 서버에서 가져온 데이터와 클라이언트에서 관리하는 상태가 일관적이어야 합니다. 나중에 서버 컴포넌트가 안정화되고 production-ready 해질 때 가능해진다면, Zustand 라이브러리로 전역 상태를 관리하는 대신 서버 컴포넌트를 사용하여 모든 데이터 조작을 처리하는 방법도 고려해 보시길 바랍니다. 이 방식으로 클라이언트-서버 간의 동기화 문제를 많이 완화할 수 있습니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!