개발자

nextjs 서버사이드 데이터페칭 질문입니다.

2024년 04월 26일조회 185

안녕하세요. 다른분들의 고견을 여쭙고자 합니다. next에서 app라우트 방식을 이용해서 개발을 진행하고 있는데요 좋아요한 게시글을 불러오는데. 속도를 위해서 서버사이드에서 불러와서 클라이언트 사이드에 뿌려주는데요. 클라이언트 사이드에서 좋아요 버튼을 누르면 -> 좋아요 데이터를 파이어베이스 서버에 저장 -> 좋아요 페이지에서 확인 -> 업데이트가 안됩니다. 그도 그럴것이 서버사이드는 업데이트가 되지 않기 때문이고 새로고침을 해야만 하기 때문이라고 생각합니다. 초기값을 서버사이드에서 불러온후에 그 후의 데이터들은 recoil로만 관리한다? 이런것도 아닌것 같구요. 이 문제를 해결할려면 초기데이터를 불러오는것 부터 전부다 클라이언트 사이드에서 해야만 하는 것 일까요? 이 문제를 해결할려면 tanstack-query를 사용해야할까요? 모르는점이 많네요. 아시는 내용이있으시면 답변주시면 너무 감사하겠습니다.

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

답변 3

인기 답변

김헨리님의 프로필 사진

react-query와 recoil같은 전역 상태를 사용하지 않더라도 해결 가능합니다. (좋아요 여부를 isLike: boolean 값으로 구분해서 표시한다고 가정하겠습니다) 질문자님이 말씀하신 것처럼, 초기에 isLike가 false로 표시된 아이템을 좋아요 버튼을 눌러서 서버 데이터의 isLike: true로 업데이트하더라도 현재 화면에는 변화가 반영되지 않아 새로고침을 하거나 데이터를 다시 받아와야 화면에 업데이트 될 것 같습니다. state에 저장해서 update하는 방법도 있지만 저는 좋아요 버튼을 클릭해서 통신에 성공하면 데이터를 다시 받아와서 화면을 업데이트하는 방식을 선호합니다. (서버사이드 단에서 작성한 데이터 받아오는 코드를 클라이언트에도 작성) 예시코드) const handleLikeClick = async (id: number) => { try { await postLike(id); getData(); // 서버에서 데이터를 다시 받아와서 화면을 업데이트 } catch (error) { console.error(error); } } 그러나 이 방법은 좋아요 버튼을 누른 후 통신이 성공하고 데이터를 다시 받아와서 화면에 변화를 반영하기 때문에 UX적으로 단점이 있을 수 있습니다. 이 문제를 해결하기 위해 react-query의 낙관적 업데이트를 고려해보는 것도 좋을 것 같습니다!! * 낙관적 업데이트로 서버 응답을 기다리지 않고 클라이언트 상태를 먼저 업데이트 해서 UX를 향상시킬 수 있을 것 같네요 참고: https://tanstack.com/query/v5/docs/framework/react/guides/optimistic-updates

profile picture

익명

작성자

2024년 04월 30일

답변 감사합니다. 예시코드와 같은 방식으로 저도 기존에 이용을 했었는데요. 아무래도 서버의 response를 받기까지의 시간이 소요되다보니 useMutation을 사용해서 해결을 하였습니다 !

정 훈님의 프로필 사진

1. 서버에서 받아온 데이터를 state에 저장하고 이를 update하여 ui를 보여주는 것도 일반적인 방법이라고 생각합니다. 2. tanstack-query를 사용하여 invalidate query 혹은 setQueryData를 활용한 optimistic update를 구현하는 것도 좋은 방법 같습니다.

profile picture

익명

작성자

2024년 04월 30일

옵티미스틱이 제가 원하던 방식이었습니다. 감사합니다.

김태우님의 프로필 사진

코드를 전부 볼 수 없어 자세한 상황은 모르지만 제가 예상하는 문제점은 2가지가 있네요. 1. 클라이언트 사이드 렌더링을 사용중이시면 상태 관리의 문제 2. 서버 컴포넌트에서의 프리페칭을 사용중이시면 nextjs의 캐싱의 특성 2번같은 경우에는 좋아요 페이지에서 데이터를 요청할 때 cache: no-store 옵션을 주셔야 합니다. nextjs는 기본적으로 캐싱을 이용하기 때문에 좋아요와 같이 실시간으로 변경된 데이터를 바로 보여주지 않습니다. 그래서 캐싱을 사용하지 않도록 옵션을 주면 바로바로 변경된 데이터를 확인하실 수 있습니다. 다음은 관련 공식문서 글입니다. https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating

profile picture

익명

작성자

2024년 04월 30일

현재 옵티미스틱으로 문제를 해결하긴 했습니다만, 이 문제가 캐싱데이터를 사용하기 때문에 페이지 변환이 없었던것이네요? 왜 이생각을 못했을까요,, no-cache를 사용하면 매번 페이지접근할때 마다 새로 값을 불러온다고 해석이되는데요. 그럼 기존의 저의 문제도 해결이 될 것같습니다. 다음엔 no-cache를 활용해보겠습니다. 감사해요 !

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

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

또는

이미 회원이신가요?

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

커리어리 AI 봇

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

2024년 04월 26일

Next.js에서 제공하는 서버 사이드 렌더링(SSR)은 화면을 그리는데 필요한 데이터를 미리 서버에서 가져와서 html로 보내주는 기능입니다. 이 때문에 사용자는 데이터 로딩 시간 없이 바로 페이지를 볼 수 있습니다. 하지만 이 방법의 단점은 업데이트한 정보가 실시간으로 반영되지 않는다는 점입니다. 위의 문제 해결 방법으로 몇 가지를 제안해보겠습니다. 1. SWR 또는 React Query 사용 - Next.js 개발팀에서 만든 SWR 또는 tanstack에서 만든 React Query와 같은 데이터 페칭 라이브러리를 사용하면, 데이터가 변경될 때마다 자동으로 동기화해주어 문제를 해결할 수 있습니다. - 이런 라이브러리들은 컴포넌트가 마운트되거나 데이터가 변화할 때 클라이언트 사이드에서 API를 호출하여 항상 최신 상태의 데이터를 유지합니다. 2. 클라이언트 사이드 데이터 페칭 - 좋아요 버튼을 클릭하면, 파이어베이스 서버에 저장하는 것과 동시에 클라이언트 쪽의 state도 바로 업데이트하여 사용자에게 실시간 반영된 정보를 보여줄 수 있습니다. 3. Next.js의 revalidate 옵션 활용 - Next.js의 ISR(Incremental Static Regeneration) 기능을 활용하면, 좋아요 정보 업데이트 후 일정 시간마다 새로운 데이터를 서버에서 불러와 페이지를 재생성하는 방식으로 최신 정보를 유지할 수 있습니다. 이 중 어떤 방법이 가장 적절한지는 프로젝트의 특성과 요구사항에 따라 다르겠지만, 주어진 상황에서는 SWR 또는 React Query를 사용하는 것이 가장 간단하고 효율적인 해결책일 것 같습니다. 이들 라이브러리는 데이터 동기화 문제를 해결해주고, 매우 강력한 caching과 revalidation 기능을 제공하기 때문입니다.

목록으로

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