원본 영상 : React Query tips from the maintainer @tkDodo
useEffect가 나쁜 건 아니지만, useEffect를 제거한다면 코드의 복잡성과 불필요한 렌더링을 줄일 수 있다.
useQuery는 쿼리 캐시에 있는 데이터에 대한 구독을 생성하는 훅이므로, 명령적으로 쿼리 클라이언트를 선언해 데이터를 가져오면 불필요한 렌더링을 줄일 수 있다.
로컬 상태를 변경하기 위해 useMutation에서 리턴한 데이터를 사용하지 않는 게 좋다. useMutation은 필요에 따라 요청을 보내고 유용한 상태나 콜백과 함께 받을 수 있는 모음이며, 데이터를 가져오고 그 데이터를 이용하기 위해 설계된 것이 아니다. useMutation을 이용하여 DB에 있는 데이터가 변경되면, 반환된 데이터를 이용하기보다 변경된 데이터를 반영하기 위해 쿼리 캐시를 업데이트를 하는 편이 더 좋다. (useMutation은 업데이트를 위한 훅이고, 상태 관리를 위한 훅은 useQuery이다.) 이에는 두가지 방법이 있다.
useMutation에서 반환된 데이터를 useQuery 캐시에 수동으로 업데이트 하기
useMutation이 이뤄지면, useQuery 캐시를 무효화(invalidate)함으로써 다시 페치하도록 하기
useMutation 훅의 옵션으로 onSuccess, onError, onSettled 등의 콜백 함수를 전달할 수 있으며, onSettled 콜백으로 쿼리 클라이언트의 invalidateQueries() 메소드를 실행하는 함수를 전달하면 useMutation의 성공 여부와 관계 없이 데이터를 최신화할 수 있다.
쿼리 클라이언트를 사용할 때에는 인스턴스를 직접 임포트하는 것보다 useQueryClient 훅을 사용하는 게 더 좋다. 그 이유는 다음과 같다.
UI를 제대로 보여줄 수 있는 최소한의 상태만을 useState에 저장하고 나머지를 쿼리 캐시에서 가져오는 게 좋다.