Project: ๐ฉcodefolio - recoil, supabase Auth
Supabase Auth - ๋ก๊ทธ์์, ๋ก๊ทธ์ธ ์ํ(recoil)
1. recoil + supabase getSession()โ
import { atom } from "recoil";
const userLoginCheck = atom<boolean>({
key: "userLoginCheck",
default: false,
});
export default userLoginCheck;
์ ์ญ ์ํ๊ด๋ฆฌ๋ฅผ ์ํด ํ๋ก์ ํธ์์ recoil์ ๋์ ํ๋ค. ์ฌ์ฉ๋ฒ์ ๋ค๋ฅธ ์ ์ญ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋นํด ๋๋ฌด ๊ฐ๋จํ๋ค.
atom์ importํด์ค ํ useState์ฒ๋ผ ์ฌ์ฉํ๋ฉด ๋๋ค.
ํ์
์คํฌ๋ฆฝํธ๋ก ์ธํด default์ ํ์
์ ์ง์ ํด์ฃผ๊ณ , atom์ ์ ๋ฌ๋๋ object๋ key์ value๋ก ๊ตฌ์ฑ๋๋ฉฐ key์ ์ ์ธํ text์ default์๋ ๊ธฐ๋ณธ๊ฐ ์ฆ, ์ด๋์
๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ฉด ๋๋ค.
import { useSetRecoilState } from "recoil";
import { userLoginCheck } from "@/lib/recoil";
const setUserLogin = useSetRecoilState(userLoginCheck);
const onLogoutButtonClick = async () => {
const res = await supabase.auth.signOut();
setUserLogin(false);
if (res.error) {
console.log("๋ก๊ทธ์์ ์๋ฌ", res.error);
return;
throw new Error(res.error.message);
}
router.push("/");
return router.push("/");
};
์ ์ฝ๋์์๋ ์ฒซ๋ฒ์งธ๋ก recoil ๋ฉ์๋๋ฅผ importํด ์ฃผ๊ณ ์๊น ๋ง๋ค์ด๋์ atom์ ์ธ ํจ์๋ importํด ์ค๋ค.
+ useState์ ๋ค๋ฅธ์ ์ ๋ณด์
[state, setState] = useState(); ๋ผ๊ณ ์ ์ธํ์ง๋ง
์ ์ญ์ ์๋ recoil์ ์ฌ์ฉํ ๋๋ ์ฌ๋ฌ ๋ฉ์๋๊ฐ ์๋ค
- ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ์ค๋ช
ํ
useState์ฒ๋ผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉดuseRecoilState๋ฅผ ์ฌ์ฉํ๊ณ , - state (value) ์๋ง ์ ๊ทผ(๋ถ๋ฌ์ค๊ธฐ) ํ๊ณ ์ถ์ ๋๋
useRecoilValue๋ฅผ ์ฌ์ฉํ๋ค, - SetState (setter) ํจ ์๋ก state๋ฅผ ์
๋ฐ์ดํธ ํ๊ธฐ ์ํด์๋
useSetRecoilState๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๊ทธ๋์ ๋๋ ๋ก๊ทธ์์ ํ ๋ก๊ทธ์์ ์ํ๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ ์ํด useSetRecoilState๋ฅผ ์ฌ์ฉํ๋ค. ์ดํ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ฌ์ฉํด ๋ณด์
import { userLoginCheck as recoilUserLoginCheck } from "@/lib/recoil";
import { useRecoilState } from "recoil";
const [userCheck, setUserCheck] = useRecoilState(recoilUserLoginCheck);
const getSessionUser = async () => {
const { data, error } = await supabase.auth.getSession();
if (error) {
throw new Error(error.message);
}
if (data.session) {
setUserCheck(true);
} else {
setUserCheck(false);
}
};
<ButtonWrapper
onClick={() =>
router.push(userCheck ? "/create-post" : "/auth/login")
}
>
์ ๊ณผ ๋์ผํ๊ฒ ์ฌ์ฉํ recoil์ธ userLoginCheck ํจ์๋ฅผ import ํด ์ค๊ณ useRecoilState๋ก useState์ฒ๋ผ ๊ฐ์ ธ์๋ค.
getSessionUser๋ผ๋ ํจ์์์๋ ๋น๋๊ธฐ๋ก supabase์ auth(์ธ์ฆ) ์ ์ ๊ทผํ์ฌ ์ธ์
์ ๊ฐ์ ธ์ค๊ณ ์๋ค.
๋ง์ฝ ์๋ฌ๊ฐ ๋๋ค๋ฉด ๋จผ์ Error๋ฅผ throw ํด ์ฃผ๊ณ , data.session์ด ์๋ค๋ฉด, recoil๋ก ๊ฐ์ ธ์จ setUserCheck๋ฅผ true๋ก ๋ณํ, ์๋๋ผ๋ฉด ๋ฐ๋. ์ฆ ์ ์ ๊ฐ ์๋์ง ์๋์ง true / false ๋ก ๋ถ๋ฅ ํ๋ค.
๊ธ์ฐ๊ธฐ ์์ด์ฝ ๋ฒํผ์ ํด๋ฆญํ์ ๋ ์ ์ํ๋ฅผ ๊ฐ์งํ๊ณ , userCheck ๊ฐ ์์ผ๋ฉด ๋ก๊ทธ์ธ์ํ์ด๋ฏ๋ก ๊ธ์ฐ๊ธฐ ํ์ด์ง๋ก, ์๋๋ผ๋ฉด ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ ์์ผฐ๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ์ค๋ช
ํ
useState์ฒ๋ผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉดuseRecoilState๋ฅผ ์ฌ์ฉ. - state (value) ์๋ง ์ ๊ทผ(๋ถ๋ฌ์ค๊ธฐ) ํ๊ณ ์ถ์ ๋๋
useRecoilValue๋ฅผ ์ฌ์ฉ. - SetState (setter) ํจ์๋ก state๋ฅผ ์
๋ฐ์ดํธ ํ๊ธฐ ์ํด์๋
useSetRecoilState๋ฅผ ์ฌ์ฉ. const { data, error } = await supabase.auth.getSession();์ผ๋ก ์ ์ ์ธ์ ์ ์ ๊ทผ ๊ฐ๋ฅ.
