개발자
안녕하세요. 다른분들의 고견을 여쭙고자 합니다. next에서 app라우트 방식을 이용해서 개발을 진행하고 있는데요 좋아요한 게시글을 불러오는데. 속도를 위해서 서버사이드에서 불러와서 클라이언트 사이드에 뿌려주는데요. 클라이언트 사이드에서 좋아요 버튼을 누르면 -> 좋아요 데이터를 파이어베이스 서버에 저장 -> 좋아요 페이지에서 확인 -> 업데이트가 안됩니다. 그도 그럴것이 서버사이드는 업데이트가 되지 않기 때문이고 새로고침을 해야만 하기 때문이라고 생각합니다. 초기값을 서버사이드에서 불러온후에 그 후의 데이터들은 recoil로만 관리한다? 이런것도 아닌것 같구요. 이 문제를 해결할려면 초기데이터를 불러오는것 부터 전부다 클라이언트 사이드에서 해야만 하는 것 일까요? 이 문제를 해결할려면 tanstack-query를 사용해야할까요? 모르는점이 많네요. 아시는 내용이있으시면 답변주시면 너무 감사하겠습니다.
답변 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
익명
작성자
2024년 04월 30일
답변 감사합니다. 예시코드와 같은 방식으로 저도 기존에 이용을 했었는데요. 아무래도 서버의 response를 받기까지의 시간이 소요되다보니 useMutation을 사용해서 해결을 하였습니다 !
1. 서버에서 받아온 데이터를 state에 저장하고 이를 update하여 ui를 보여주는 것도 일반적인 방법이라고 생각합니다. 2. tanstack-query를 사용하여 invalidate query 혹은 setQueryData를 활용한 optimistic update를 구현하는 것도 좋은 방법 같습니다.
익명
작성자
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
익명
작성자
2024년 04월 30일
현재 옵티미스틱으로 문제를 해결하긴 했습니다만, 이 문제가 캐싱데이터를 사용하기 때문에 페이지 변환이 없었던것이네요? 왜 이생각을 못했을까요,, no-cache를 사용하면 매번 페이지접근할때 마다 새로 값을 불러온다고 해석이되는데요. 그럼 기존의 저의 문제도 해결이 될 것같습니다. 다음엔 no-cache를 활용해보겠습니다. 감사해요 !
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 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 기능을 제공하기 때문입니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!