โก๏ธ ๋ฌธ์ ์ํฉ !
๋ฉ์ธ ํ๋ฉด์์ ์ ์ ์ email์ ์ ์ ๋ค์์ผ๋ก ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ ์ ์ ๋ณด๊ฐ ํ์ํ ์ํฉ.
1์ฐจ: useState๋ก 1:1 ๊ด๋ฆฌ
2์ฐจ: ์ ์ญ์์ ๊ด๋ฆฌํ๊ธฐ ์ํด store ์์
3์ฐจ: ๋ก๊ทธ์ธ์ด ๋์์ ๋๋ง ์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๋ฆฌํฉํ ๋ง
1์ฐจ ์๋ ->
ํ์ํ ํ์ผ๋ง๋ค useState๋ก ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ (1:1)
const [userData, setUserData] = useState<User | null>(null)
useEffect(() => {
const fetchData = async () => {
const supabase = createClient()
const { data: { user }, error } = await supabase.auth.getUser()
setUserData(user)
}
fetchData()
}, [])
const email = userData ? userData.email : null
์ง๊ธ์ ํ์ด์ง๊ฐ ๋ช๊ฐ ์์ด์ ๊ด์ฐฎ์ง๋ง, ๋ฆฌํฉํ ๋ง ์งํํ๋ฉด ์ ์ ๋ฐ์ดํฐ๊ฐ ์ด๋์ ๋ ํ์ํ ์ง ๋ชฐ๋ผ์ ์ ์ญ์์ ๊ด๋ฆฌํด๋ฒ๋ฆฌ๊ฒ ๋ฃจํธ์ ์๋ store ํด๋์ ์ ์ ์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ํ์ผ์ ๋ง๋ค๊ธฐ๋ก ํ๋ค.
2์ฐจ ์๋ -> (1: N)
๊ตฟ ์ ๋ค์ด์จ๋ค
// @/store/useUserStore.ts
export const useUserStore = create<UserState>((set) => ({
user: null,
fetchUser: async () => {
const supabase = createClient()
const { data: { user }, error } = await supabase.auth.getUser()
/* if (error) ... */
set({ user })
},
}))
// ์ฌ์ฉ
import { useUserStore } from '@/store/useUserStore'
const user = useUserStore(state => state.user)
const fetchUser = useUserStore(state => state.fetchUser)
useEffect(() => {
fetchUser()
}, [fetchUser])
const email = user ? user.email : null
3์ฐจ ์๋ ->
๋ฏธ๋ค์จ์ด์์ ์ธ์ฆ์ํ์ ๋ฐ๋ผ ๊ฒฝ๋ก ์ ๊ทผ ์ฐจ๋จํ๊ณ ๋๋๊น ๋ก๊ทธ์ธ ํ์ง๋ ์์๋๋ฐ ์นํ์ด์ง์ ์ ๊ทผํ๊ธฐ๋ง ํ๋ฉด ๋ฃจํธ์ middleware์์ ์ธ์ ์๋ค๊ณ ๊ณ์ ์๋ฌ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋๊ฒ ๊ฑฐ์ฌ๋ ค์ ์ธ์ ์ ์ฒดํฌํ๊ณ fetchUserํด์ค๋๋ก ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
// @/store/useUserStore.ts
export const useUserStore = create<UserState>((set) => ({
{/* user: null,*/}
isLogin: false,
{/* fetchUser, ๊ฐ์ */}
checkisLogin: async() => {
const supabase = createClient()
const {
data: { session },
error,
} = await supabase.auth.getSession()
if (error) {
console.error('Check isLogin ERROR:', error)
}
if (session) {
set({ isLogin: true })
await useUserStore.getState().fetchUser()
} else {
set({ isLogin: false })
}
},
}))