FE develop/Supabase
Supabase - (9) 로그아웃 구현하기(Authentication)
hoj0806
2025. 4. 15. 12:54
Supabase - (8) 로그인 구현하기(Authentication)
이번 포스트에서는 Supabase를 이용한 이메일 방식 로그인 구현 방법을 소개하겠습니다. 1. Supabase에서 사용자 추가하기먼저 Supabase 콘솔에서 Authentication 탭으로 이동한 뒤, Add user → Create new user를
hjh0806.tistory.com
지난 포스트에서는 로그인 기능을 구현해보았습니다.
이번 포스트에서는 로그아웃 기능을 구현해보겠습니다.
🚪 Supabase 로그아웃 메서드
Supabase.auth.signOut() 메서드를 사용하면 쉽게 로그아웃 기능을 구현할 수 있습니다.
우선 로그아웃 함수를 하나 만들어봅시다:
export async function logout() {
let { error } = await supabase.auth.signOut();
if (error) {
throw new Error(error.message);
}
}
⚙️ TanStack Query로 커스텀 훅 만들기
TanStack Query를 사용해 로그아웃 전용 커스텀 훅을 만들어 보겠습니다.
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { logout as logoutApi } from "../../services/apiAuth";
import { useNavigate } from "react-router-dom";
export function useLogout() {
const navigate = useNavigate();
const queryClient = useQueryClient();
const { mutate: logout, isLoading } = useMutation({
mutationFn: logoutApi,
onSuccess: () => {
queryClient.removeQueries(); // 모든 캐시 제거
navigate("/login", { replace: true }); // 로그인 페이지로 이동
},
});
return {
logout,
isLoading,
};
}
📌 onSuccess에서 queryClient.removeQueries()를 호출해 모든 캐시 데이터를 삭제하고,
navigate("/login", { replace: true })를 통해 로그인 페이지로 리다이렉트합니다.
🧩 컴포넌트에서 사용하기
이제 이 커스텀 훅을 실제 컴포넌트에서 사용해보겠습니다.
import { HiArrowRightOnRectangle } from "react-icons/hi2";
import ButtonIcon from "../../ui/ButtonIcon";
import { useLogout } from "./useLogout";
import SpinnerMini from "../../ui/SpinnerMini";
function Logout() {
const { logout, isLoading } = useLogout();
return (
<ButtonIcon onClick={logout} disabled={isLoading}>
{!isLoading ? <HiArrowRightOnRectangle /> : <SpinnerMini />}
</ButtonIcon>
);
}
export default Logout;
버튼을 클릭하면 logout() 함수가 실행되고, 로그아웃 처리 중일 때는 로딩 스피너를 보여줍니다.
🧹 로그아웃 시 정리되는 내용
- 캐시된 쿼리 데이터 (TanStack Query) 전부 삭제됨
- Supabase의 auth.signOut() 호출로 인해 로컬스토리지의 인증 정보도 자동 제거됨
- 로그인 페이지(/login)로 리다이렉트
이렇게 해서 Supabase를 활용한 로그아웃 기능을 구현해보았습니다.
다음 포스트에서는 회원가입 기능을 다뤄보겠습니다.