๐จ ๋ฐ์ํ ๋ฌธ์ ์ ์ํฉ
header.tsx ์ปดํฌ๋ํธ์์ ์ ์ ์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ํ์ ํด ์ ์ ์ ๋ณด๋ฅผ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๊ณ , ํด๋น ๊ฐ์ JSON.parse()๋ก ๊ฐ์ ธ์ค๋ ๋์ค ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๋ถ๋ถ์ด๋ค.
// header.tsx
const userCheck = () => {
onAuthStateChanged(auth, async (user) => {
if (user) {
const uid = user.uid
const q = query(collection(db, 'user'), where('uid', '==', uid))
const querySnapshot = await getDocs(q)
const data = querySnapshot.docs.map((doc) => doc.data())[0]
if (!localStorage.getItem('currentUser')) {
localStorage.setItem('currentUser', JSON.stringify(data))
}
} else {
// User is signed out
localStorage.removeItem('currentUser')
router.push('/login')
}
})
}
const currentUser = localStorage.getItem('currentUser')
const currentData: UserInfo | null = currentUser // ์ฌ๊ธฐ์์ ์๋ฌ!
? JSON.parse(currentUser)
: null
๐ค ๋ฌธ์ ์ ์์ธ ํ์ ํ๊ธฐ
์ฒ์์๋ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์ดํดํ ์ ์์๋ค. header ์ปดํฌ๋ํธ๋ use client๋ฅผ ์ฌ์ฉํ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์๊ณ , currentUser๊ฐ null์ผ ๊ฒฝ์ฐ์๋ ์๊ฐํด์ ์กฐ๊ฑด๋ฌธ์ ํ ๋นํด ์ฃผ์์ผ๋๊น. ์ฌ์ง์ด ํ์ด์ง์์ ๋์ํ๋๋ฐ์ ๋ฌธ์ ๋ ์์๋ค. ํ์ง๋ง ์ฝ์์๋ ์๋ฌ๊ฐ ์ฐํ์์๋ค.
๊ทธ๋๋ ๋ฌธ์ ๋ฅผ ์ฃผ์๊น์ด ์๊ฐํด๋ณด๊ณ ์ฐพ์๋ณธ ๊ฒฐ๊ณผ ๋ฌธ์ ๋ Next.js์ ๋ ๋๋ง ์์ ๋๋ฌธ์ด๋ผ๋ ์ฌ์ค์ ์๊ฒ ๋์๋ค.
Next.js๋ client side๋ฅผ ๋ ๋๋ง ํ๊ธฐ ์ server side๋ฅผ ๋ ๋๋งํ๊ณ Next.js์์ ์ ๊ณตํ๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR)์์๋ window๋ document ๊ฐ์ ๋ธ๋ผ์ฐ์ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ window ๊ฐ์ฒด๋ client side์๋ง ์กด์ฌํ๋ค.
์ฆ, ํ์ด์ง๊ฐ client์ ๋ก๋ ๋๊ณ window ๊ฐ์ฒด๊ฐ ์ ์๋ ๋๊น์ง localstorage์ ์ ๊ทผํ ์ ์๊ธฐ๋๋ฌธ์ ๋ก์ปฌ์คํ ๋ฆฌ์ง๊ฐ ์ ์๋์ง ์์๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋๊ฒ์ด๋ค.
๐โ๏ธ ์๋ํด๋ณธ ๋ฐฉ๋ฒ
typeof window !== 'undefined'
์กฐ๊ฑด๋ฌธ์ ํตํด window๊ฐ ์ ์๋์์๋๋ฅผ ํ๋จํ๊ณ , ์กฐ๊ฑด์ด ์ผ์นํ ๋ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ ๊ทผํ๋ค.
if (typeof window !== 'undefined') {
// Perform localStorage action
const item = localStorage.getItem('key');
}
useEffect
useEffect๋ ๋ ๋๋ง์์ ์คํ๋๊ธฐ๋๋ฌธ์ ์๋ฒ์์ ๋ ๋๋ง ๋ ๋๋ ๋ด๋ถ์ ์ฝ๋๊ฐ ์คํ๋์ง ์๋๋ค. ์ฆ, useEffect๋ก ๊ฐ์ธ์ฃผ๋ฉด ํด๋น ๋ด์ฉ์ ํด๋ผ์ด์ธํธ ๋ ๋๋ง ์คํ์์ ์ฌ์ฉ๋๊ธฐ๋๋ฌธ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์์ ํ๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
import { useEffect } from "react";
useEffect(() => {
// Perform localStorage action
const item = localStorage.getItem('key')
}, [])
โ ๊ฒฐ๋ก
let currentData: UserInfo | null = null // let์ผ๋ก ๋ฐ๊นฅ์์ ๋ณ์ ์ ์ธํด์ฃผ๊ณ
// window๊ฐ ์ฐธ์กฐ๋์์๋ ๋ก์ปฌ์คํ ๋ฆฌ์ง์์ ๊ฐ ๊ฐ์ ธ์์ ๋ณ์์ ์ฌํ ๋นํด์ค์ผ๋ก ํด๊ฒฐ!
if (typeof window !== 'undefined') {
const currentUser = localStorage.getItem('currentUser')
currentData = currentUser ? JSON.parse(currentUser) : null
}
๋ ํผ๋ฐ์ค
https://github.com/vercel/next.js/discussions/19911
https://velog.io/@qhflrnfl4324/%EB%82%91%EA%B9%A1%ED%8C%9C08-js-cookie