

local-storage에 저장하여 사용
local-storage에 저장하면 사용자가 페이지를 새로고침해도 로그아웃되지 않음
인증 훅을 사용하여 리액트 쿼리와 인증 시스템에 대한 실습 진행
useLoginData
AuthContext 값 반환useAuthActions
useUser

위 이미지를 보면 사용자 ID와 Token은 인증 컨텍스트와 쿼리 캐시에 모두 저장된다.
이는 로그인하거나 로그아웃할 때 두 곳 모두에서 업데이트해야 함을 의미한다.
이는 코드를 혼란스럽고 이해하기 어렵게 만드는 순환적인 요소
클라이언트에서 로그인한 사용자와 Token을 별도로 저장하는 것이 더 합리적
staleTime을 설정하여 캐시에서 데이터가 만료되지 않는 한 일반적인 새로고침 트리거가 데이터를 다시 가져오지 않도록 함setQueryData를 사용하여 서버에서 받은 데이터를 바탕으로 로그인할 때 정보를 설정함removeQueries를 사용하여 사용자가 로그아웃했을 때 캐시에서 해당 쿼리를 지워 사용자 정보가 남지 않게 함userId와 userToken이 필요했고 이는 useLoginData를 통해 얻었음useLoginData는 클라이언트 state 즉, 클라이언트에 로그인한 사용자의 상태를 유지useQuery의 enabled옵션을 사용xport function useUser() {
const queryClient = useQueryClient();
// get details on the userId
const { userId, userToken } = useLoginData();
// TODO: call useQuery to update user data from server
const { data: user } = useQuery({
// enabled 조건이 충족하지 않으면 해당 쿼리 함수는 실행되지 않는다.
// userId가 null 즉, 사용자가 로그인하거나 로그아웃할 때 useQuery는 쿼리가 활성화되었는지를 확인한다.
// 활성화된 상태라면 데이터를 가져오고
// 활성화되지 않았다면 데이터를 가져오는 것에 신경 쓰지 않는다.
enabled: !!userId,
queryKey: generateUserKey(userId, userToken),
queryFn: () => getUser(userId, userToken),
staleTime: Infinity,
// 이 데이터는 사용자가 스스로 업데이트할 경우에만 변경
});
// meant to be called from useAuth
function updateUser(newUser: User): void {
queryClient.setQueryData(
generateUserKey(newUser.id, newUser.token),
newUser
);
}
// meant to be called from useAuth
function clearUser() {
queryClient.removeQueries({ queryKey: [queryKeys.user] });
}
return { user, updateUser, clearUser };
}