Tanstack Query에서 데이터 변경(mutation) 후 UI를 업데이트하는 세 가지 주요 방법과 로더를 사용하는 한 가지 추가 방법을 시연합니다. 🔄
Drizzle ORM과 PostgreSQL을 사용하여 To-do 리스트 예제를 통해 실제 데이터베이스 스키마 생성, 마이그레이션 및 데이터 조작 과정을 보여줍니다. 💾
createServerFunction을 활용하여 서버에서 데이터를 가져오고(getTodos) 새로운 To-do를 추가하는(addTodoFunction) 백엔드 로직을 구현합니다. ⚙️
useQuery를 통해 데이터를 가져오고, Zod를 사용하여 서버 함수 입력에 대한 유효성 검사를 수행하여 견고한 데이터 처리를 보장합니다. ✅
첫 번째 데이터 새로고침 방법은 useQuery에서 반환되는 refetch 함수를 직접 호출하는 것으로, 간단하지만 추가 네트워크 요청으로 인해 약간의 지연이 발생합니다. ⏱️
두 번째 방법은 useQueryClient를 사용하여 queryClient.invalidateQueries({ queryKey: ['todos'] })를 호출하는 것으로, 특정 쿼리 키에 해당하는 데이터를 무효화하여 다시 가져오게 합니다. 이는 컴포넌트 계층 구조가 깊을 때 유용합니다. 🔑
세 번째이자 가장 효율적인 방법은 addTodoFunction이 새로 생성된 To-do 항목을 반환하도록 하고, queryClient.setQueryData를 사용하여 클라이언트 캐시를 직접 업데이트하는 것입니다. 이는 UI를 즉각적으로 업데이트하여 사용자 경험을 향상시킵니다. ✨
setQueryData 사용 시 백엔드에서 반환되는 데이터의 타입이 프론트엔드 캐시 구조와 정확히 일치해야 하며, 그렇지 않으면 문제가 발생할 수 있음을 경고합니다. ⚠️
로더를 사용하는 경우 useRouter의 router.invalidate()를 통해 데이터를 새로고침할 수 있지만, 이는 해당 경로의 모든 로더를 다시 실행하여 불필요한 데이터 재요청을 유발할 수 있으므로 권장하지 않습니다. 🚫
setQueryData 또는 invalidateQueries를 사용하는 것이 router.invalidate()보다 특정 데이터 업데이트에 더 적합하며, 성능과 사용자 경험 측면에서 이점을 제공한다고 강조합니다. 👍