๐ Task TODOLIST
- [x] user ๋ฐ์ดํฐ ์ ์ญ๊ด๋ฆฌ
โจ ๊ฐ๋ฐ ๋ด์ฉ
1. user ๋ฐ์ดํฐ ์ ์ญ๊ด๋ฆฌ
Why(์ด์ ) ?
user ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์, ์ ์ญ์ ์ผ๋ก ๊ด๋ฆฌํ ํ์๊ฐ ์์๋ค.
How(๊ณผ์ ) ?
(1) RootLayout.tsx์์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์ ๊ฐ์ฅ ์๋จ์ InitUser.tsx ์ปดํฌ๋ํธ ์์ฑ
(2) useEffect ๋ด์ userData๋ฅผ ๋ฐ์์ค๋ ๋น๋๊ธฐ๋ก์ง + ๊ทธ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ๋ก๊ทธ์ธ ์ํ๊น์ง
(3) userData์ isLoggedIn ์ํ ๋ชจ๋ Zustand๋ก ์ ์ญ๊ด๋ฆฌ
what(๊ฒฐ๊ณผ) ?
const InitUser = () => {
const { isLoggedIn, setIsLoggedIn, setUser } = userStore((state) => state);
useEffect(() => {
// isLoggedIn ์ํ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋, ์๋ก๊ณ ์นจ ํ์๋ ์์
์ ์ง ์ค์ธ์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์คํ๋๋ ํจ์
// (์ฐธ๊ณ : isLoggedIn ์ํ๋ ๋ก๊ทธ์ธ/๋ก๊ทธ์์ ์์๋ง ๋ณ๊ฒฝ๋จ = ๋ก๊ทธ์ธ/๋ก๊ทธ์์์ ๋ชจ๋ ํธ์ถ์ด ์ข
์๋๋๋ก)
const fetchUserData = async () => {
const {
data: { user }
} = await clientSupabase.auth.getUser();
// ์์
์ ์ง์ค์ด๋ฉด
if (user) {
setIsLoggedIn(true); // ์๋ก๊ณ ์นจํด๋ isLoggedIn ์ํ true๋ก ์ ์ง
// ์์
์ ์ง์ค์ผ ๋๋ง supabase DB์ ์์ฒญํ๋๋ก(์ฑ๋ฅ์ ํจ์จ์ฑ)
const { data: userData } = await clientSupabase.from('users').select('*').eq('user_id', String(user?.id));
if (userData && userData[0]) {
setUser(userData[0]);
}
} else {
// ์ด ๋๋ ์๋ก๊ณ ์นจ ์๋ฅผ ๊ณ ๋ คํ์ฌ isLoggedIn์ false๋ก ํ์ง ์์๋ ๋จ
// -> isLoggedIn์ ์ด๊ธฐ๊ฐ ์์ฒด๊ฐ false์ด๊ธฐ ๋๋ฌธ์ ์๋ก๊ณ ์นจํ๋ฉด ์๋์ผ๋ก false
// ๋ก๊ทธ์์ํ๋ฉด(= ์์
์ ์ง ์ค์ด ์๋๋ฉด) ์ ์ ๋ฐ์ดํฐ null๋ก ๋ณ๊ฒฝ
setUser(null);
}
};
fetchUserData();
}, [isLoggedIn, setIsLoggedIn]);
return <></>;
};
export default InitUser;
๐จ TroubleShotting
์ด๋๋ก ํ๋๋..
๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ 2๊ฐ์ง ๋จ์ ์ด ์๊ฒผ๋ค.
1. ๋ถํ์ํ ์๋ฒ์์ฒญ
2. ๋ฐ์ดํฐ ์ด์ค๊ด๋ฆฌ
Why(์ด์ )?
๋ฐ์ดํฐ ๋ณ๊ฒฝ ์
๋ณ๊ฒฝ ์๋ฒ์์ฒญ(1ํ ์์ฒญ) -> Zustand๋ก - setUserData, setIsLoggedIn -> ๋ฆฌ๋ ๋๋ง ๋ฐ์ -> ๋ค์ ์ต์์ ์ปดํฌ๋ํธ์ useEffect ๋ด ์๋ฒ์์ฒญ ๋ก์ง์คํ(2ํ ์์ฒญ)
๋ผ๋ ๊ณผ์ ์ผ๋ก ํ ๋ฒ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์,
1) 2๋ฒ์ ์๋ฒ์์ฒญ
2) ์ธ๋ถ ์๋ฒ์ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ + ๋ด๋ถ Zustand store ๋ฐ์ดํฐ๋ ์ ๋ฐ์ดํธ(setState) = ๋ฐ์ดํฐ ์ด์ค๊ด๋ฆฌ
๋ผ๋ ์์ 2๊ฐ์ง ๋จ์ ์ด ๋ฐ์ํ๋ค.
How(๊ณผ์ ) ?
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฐ๋ฆฌ ํ์ useEffect + Zustand ์กฐํฉ์ ๊ณผ๊ฐํ ๋ฒ๋ฆฌ๊ณ ,
- ํ๋์ ์ฟผ๋ฆฌ ํค๋ก ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ ์ญ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ณ
- ํ ์ปดํฌ๋ํธ์์ ์ด๋ฏธ ๋ฐ์ดํฐ ์์ฒญ์ ํด์ ์บ์๋ฐ์ดํฐ๊ฐ ์๊ธฐ๋ฉด ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ๋์ผํ ๋ฐ์ดํฐ์ ๋ํด ์๋ฒ์์ฒญํ ํ์๊ฐ ์๋ = ์ฆ, ๋ถํ์ํ ์๋ฒ์์ฒญ์ ๊ฐ์์ํค๋
Tanstack-Query๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
what(๊ฒฐ๊ณผ) ?
+) ์ถ๊ฐ์ ์ผ๋ก userData๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ์ปดํฌ๋ํธ๋ค์ด ์๋ ๋ง์์ userData ๋ํ prefetch + dyfydration ํ์ฌ RootLayout.tsx ์์ ํ์ ์ปดํฌ๋ํธ๋ค์ ๋๊ฒจ์ฃผ๊ธฐ๋ก ํ๋ค.
export default async function RootLayout({
children
}: Readonly<{
children: React.ReactNode;
}>) {
const setUser = async () => {
const supabase = serverSupabase();
// ์ ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
const {
data: { user },
error
} = await supabase.auth.getUser();
if (!user || error) throw error;
const { data: userData, error: userDataErr } = await supabase
.from('users')
.select('*')
.eq('user_id', String((user as User).id))
.single();
if (userDataErr || !userData) {
console.error(userDataErr.message);
} else {
return userData;
}
};
const queryClient = new QueryClient();
await queryClient.prefetchQuery({ ----> prefetch
queryKey: [USER_DATA_QUERY_KEY],
queryFn: setUser
});
return (
<html lang="ko">
<body className={inter.className}>
<NextProvider>
<QueryProvider>
<HydrationBoundary state={dehydrate(queryClient)}> ---> dehydration
<Suspense>
<ToastContainer position="top-right" limit={1} closeButton={false} autoClose={4000} />
<ValidationModal />
<NavBar />
{children}
<ReactQueryDevtools initialIsOpen={false} />
</Suspense>
<Footer />
</HydrationBoundary>
</QueryProvider>
</NextProvider>
</body>
</html>
);
}
ํ์ ์ปดํฌ๋ํธ๋ค์์์ ์ฌ์ฉ: userData์ isLoggedIn ์ํ๋ฅผ ๋ฐํํ๋ ์ปค์คํ ํ ์์ฑ ๋ฐ ์ฌ์ฉ
export const useGetUserDataQuery = () => {
const { data, isSuccess } = useSuspenseQuery({
queryKey: [USER_DATA_QUERY_KEY],
queryFn: () => fetchUserData()
});
const isLoggedIn = data ? true : false;
return { data, isSuccess, isLoggedIn };
};
// ํ์ ์ปดํฌ๋ํธ
const NavBarContents = () => {
const { data: user, isLoggedIn } = useGetUserDataQuery();
... ์ดํ ์๋ต
๐ธ ์คํฌ๋ฆฐ์ท
๐ ๋ ํผ๋ฐ์ค
https://tanstack.com/query/latest/docs/framework/react/guides/ssr
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
2024.04.12 TIL #์ฑํ ๋ด์ฉ_๊ฒ์ (1) | 2024.05.07 |
---|---|
2024.04.10 TIL #์ฑํ #์ฐธ์ฌ์ค_๋ฉค๋ฒ_์กฐํ #Realtime_presence #์ค์๊ฐ (0) | 2024.05.07 |
2024.04.05 TIL #Tanstack_Query #prefetch #dehydration (0) | 2024.05.03 |
2024.04.04 TIL #์ฑํ #์ด์ ๋ฉ์ธ์ง _๋๋ณด๊ธฐ (0) | 2024.05.03 |
2024.04.03 TIL #์ฑํ ์ญ์ #Supabase_realtime #RLS #Delete (0) | 2024.05.02 |