๋ธ๋ผ์ฐ์ ์์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๋ํ์ ์ธ ๊ณต๊ฐ์ธ ๋ก์ปฌ ์คํ ๋ฆฌ์ง, ์ธ์
์คํ ๋ฆฌ์ง, ์ฟ ํค๊ฐ ์๋ค.
๊ฐ๋ฐ์๋๊ตฌ > Application์ผ๋ก ๊ฐ๋ฉด ํ์ธ ๊ฐ๋ฅํ๋ค.
๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ธ์
์คํ ๋ฆฌ์ง๋ Key์ Value ํํ๋ก ์ ์ฅ๋๋ค.
localStorage.Key์ด๋ฆ ํ๋ฉด Value๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋ก์ปฌ์คํ ๋ฆฌ์ง๋ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ์ด ๋์ง๋ง ์ธ์
์คํ ๋ฆฌ์ง๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋๋ฉด ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋ค. ๊ทธ๋์ ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ๋ฉด ๋นํ์ ์ฅ๋ฐ๊ตฌ๋๋ฅผ ๊ตฌํํ ์ ์๋ค.
์ฟ ํค๋ ๋ฐฑ์๋ API๋ฅผ ๋ณด๋ผ ๋ ๊ฐ์ด ๋๊ฒจ ์ค ์ ์์ด์ ๋ฐฑ์๋์ ํต์ ์ด ๊ฐ๋ฅํ๋ค๋ ํน์ง์ด ์๋ค. ๋ํ ๋ง๋ฃ์๊ฐ๋ ๊ฐ์ด ์ ์ฅํ ์ ์๋ค. ํน์ ๋ง๋ฃ์๊ฐ์ด ์ง๋๋ฉด ์ ์ฅ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋ค.
์ด ์ค์์ ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ฅผ ์ด์ฉํ๋ฉด ๋ก๊ทธ์ธํ ๋ ๋ฐ์ accessToken์ ์ ์ฅํด์ ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ป๋ค ํค๊ฑฐ๋ ์๋ก๊ณ ์นจํด๋ ๋ด์ฉ์ด ์ฌ๋ผ์ง์ง ์๊ณ accessToken์ด ์ ์ง๋๊ฒ๋ ๊ตฌํํ ์ ์๋ค.
(ํ์ง๋ง ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ๋ณด์์ ์ข์ง ๋ชปํ๋ค. ๊ทธ๋์ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๋ ๊ฒ ๋์ ์ refreshToken์ ์ด์ฉํด์ ๋ก๊ทธ์ธ์ ๊ตฌํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข๋ค.)
๋ก์ปฌ์คํ ๋ฆฌ์ง์์ accessToken์ setํด์ ๋ฃ์ด์ฃผ๊ณ getํด์ ๊ฐ์ ธ์ค๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ localStorage is not defined
๋ผ๋ ์๋ฌ๋ฅผ ๋ณผ ์ ์๋ค.
์ด ์๋ฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ Next.js์ ๋ ๋๋ง ์๋ฆฌ๋ฅผ ์์์ผ ํ๋ค.
์ฐ์ ๋ธ๋ผ์ฐ์ ์์ ์ฃผ์๋ฅผ ์
๋ ฅํ๊ฒ ๋๋ฉด ํ๋ก ํธ์๋ ์๋ฒ์ ์ ์ํด์ HTML, CSS, JS ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ์์ ๋ธ๋ผ์ฐ์ ์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๊ฒ ๋๋ค. ๊ทธ ๋ค์์ useQuery ๊ฐ์ api๊ฐ ๋ฐฑ์๋๋ก ์คํ์ด ๋์ ๋ฐ์ดํฐ๋ฅผ DB๋ก๋ถํฐ ๊บผ๋ด์์ 2์ฐจ์ ์ผ๋ก ํ๋ฉด์ ๊ทธ๋ ค์ฃผ๊ฒ ๋๋ค. ์ฌ๊ธฐ์๋ ์จ๊ฒจ์ง๊ฒ ํ๋ ์๋ค. ํ๋ก ํธ์๋(yarn dev ํ๋ก๊ทธ๋จ)์์ HTML, CSS, JS ํ์ผ์ ๋ธ๋ผ์ฐ์ ๋ก ๋๊ฒจ์ฃผ๊ธฐ ์ ์ ํ๋ฒ ์์ค์ฝ๋๋ฅผ ๋๋ ค์ ๊ทธ๋ฆผ์ ๊ทธ๋ ค๋ณธ๋ค. ์ด ๊ณผ์ ์ ํ๋ฆฌ๋๋๋ง pre-rendering
์ด๋ผ๊ณ ํ๋ค. (์ด ๋ ๋ชจ๋ ๊ฒ์ ๊ทธ๋ฆฌ๋ ๊ฒ์ ์๋๋ค. useEffect ๊ฐ์ด componentDidMount ๋, ์ฆ ์ปดํฌ๋ํธ๊ฐ ๋ค ๊ทธ๋ ค์ง๊ณ ๋์ ์ฌ์คํ๋๋ ๊ฒ๋ค์ ๋นผ๊ณ ๋ง์ดํธ๋๊ธฐ ์ง์ ์ต์ด 1ํ๋ง ์คํ์ด ๋๋ค. ๋ํ onClick๊ณผ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ ๋ค ๋น ์ ธ์๊ณ ๊ตฌ์กฐ๋ง ๊ทธ๋ฆผ์ ๊ทธ๋ฆฐ๋ค. ) ๊ทธํ์ HTML, CSS, JS๋ฅผ ๋์ ธ์ฃผ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ๊ทธ๋ฆผ์ ์ ๋๋ก ๊ทธ๋ฆฌ๋ฉด ๊ทธ ๊ทธ๋ฆผ๊ณผ ํ๋ฆฌ๋ ๋๋งํ ๊ทธ๋ฆผ์ ๋น๊ต๋ฅผ ํ๊ณ ์ต์ข
์ ์ธ ์์ฑํ์ ์
๋ฐ์ดํธ ํ๋ ๊ฒ์ด๋ค. ์ด๋ ํ๋ฆฌ๋ ๋๋งํ ๊ทธ๋ฆผ๊ณผ ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ์์ ์ ๋๋ก ๊ทธ๋ฆฐ ๊ทธ๋ฆผ์ ๋น๊ตํ๋ ์์
์ Diffing(๋ํ) ์ด๋ผ๊ณ ํ๋ค. ์ด๋ ์ต์ข
์์ฑํ์ด ์
๋ฐ์ดํธ๋ ๋ onClick์ด๋ onChange๊ฐ์ ๊ธฐ๋ฅ๋ค์ด ์๋ ๊ฐ๋ฅํ๊ฒ ๋๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ๋ํ ์ดํ์ ์ต์ข
์์ฑํ์ผ๋ก ์
๋ฐ์ดํธ ํด์ฃผ๋ ์์
์ Hydration(ํ์ด๋๋ ์ด์
) ์ด๋ผ๊ณ ํ๋ค. (๋ง๋ผ์๋ ๊ฒ์ ๋ฌผ๊ธฐ๋ฅผ ์ค๋ค๋ ์๋ฏธ - ์ ์ ์ธ ๋ฐ์ดํฐ์ ๋ฌผ๊ธฐ๋ฅผ ์ค์ ์์ง์ผ ์ ์๊ฒ ํด์ค)
์ฌ๊ธฐ์ ์ค์ํ๊ฑด ํ๋ฆฌ๋ ๋๋ง ํ ๋๋ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ๊ธฐ๋ฅ์ด ์๋ค. ์๋ํ๋ฉด ๋ก์ปฌ์คํ ๋ฆฌ์ง ๊ธฐ๋ฅ์ ๋ธ๋ผ์ฐ์ ์ ์๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ฌธ์ ๋ก์ปฌ์คํ ๋ฆฌ์ง ๊ด๋ จ ์ฝ๋๋ฅผ ์ฝ์ ์ ์๋ค๋ ์๋ฌ๊ฐ ๋๋ ๊ฒ์ด๋ค.
์ด์ ์ด ์๋ฌ๋ฅผ ํด๊ฒฐํด๋ณด์.
Next.js ์์๋ ํ์ด์ง๊ฐ ๋ ๋๋ง๋๊ธฐ ์ ์ ํ๋ก ํธ์๋ ์๋ฒ์์ ํ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๋๋ฐ ์ด ๋๋ฌธ์ ๋ก์ปฌ์คํ ๋ฆฌ์ง์์ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์๋ฌ๊ฐ ๋๋ค.
๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ ์ด ์๋ฌ๋ฅผ ํด๊ฒฐํด๋ณด์.
// 1. ์ฒซ๋ฒ์งธ!! - ๋ก์ปฌ ์คํ ๋ฆฌ์ง ์ฝ๋๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๊ฒ ํ๋ ๋ฐฉ๋ฒ
// window๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ฏธํจ
// ๋ธ๋ผ์ฐ์ ์์ ์คํ์ด ๋์ ๋ window๊ฐ ์๋ค. ex) window.alert()
if (typeof window !== "undefined") {
// ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ด๋ผ๋ฉด
console.log("์ฌ๊ธฐ๋ ๋ธ๋ผ์ฐ์ ๋ค!!!!!");
const mylocalstorageAccessToken = localStorage.getItem("accessToken")
setAccessToken(mylocalstorageAccessToken || "") // ์์ผ๋ฉด accessToken ๋ฃ์ด์ฃผ๊ณ ์์ผ๋ฉด ์ด๊ธฐ๊ฐ์ธ ๋น๋ฌธ์์ด ๋ฃ์ด์ค
} else {
// ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ํ๋ก ํธ์๋ ์๋ฒ๋ผ๋ฉด
// ๋ก์ปฌ์คํ ๋ฆฌ์ง getItem ํ๋ฉด ์๋๋ค.
console.log("์ฌ๊ธฐ๋ ํ๋ก ํธ์๋ ์๋ฒ yarn dev๋ค!!!!!");
}
// 2. ๋๋ฒ์งธ !! - ํ๋ฆฌ๋ ๋๋ง์ด ๋๊ณ ๋์ ์ค์ ๋ ๋๋ง ๋ ๋ ์คํ๋๊ฒ ํ๋ ๋ฐฉ๋ฒ(useEffect ์ฌ์ฉ)
useEffect(() => {
// 2-1. ๊ธฐ์กด ๋ฐฉ์(refreshToken ์ด์ )
console.log("์ง๊ธ์ ๋ธ๋ผ์ฐ์ ๋ค!!!");
const accessToken = localStorage.getItem("accessToken");
const userInfo = JSON.parse(localStorage.getItem("userInfo") || "{}");
setAccessToken(accessToken || "");
setUserInfo(userInfo || "");
// 2-2. ์๋ก์ด ๋ฐฉ์(refreshToken ์ดํ)
// getAccessToken().then((newAccessToken) => {
// setAccessToken(newAccessToken);
// });
}, []);
ํ๋์ ์๋น์ค์์ ์ฌ์ฉ์์ ๊ถํ์ ๋๋ ์ฃผ๋ ์์ ์ ๊ถํ๋ถ๊ธฐ๋ผ๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด ํ๋์ ํ์ด์ง์์ ๋ก๊ทธ์ธํ ์ฌ๋๊ณผ ๋ก๊ทธ์ธ ํ์ง ์์ ์ฌ๋์ ๋๋๊ฒ๋ ๊ถํ๋ถ๊ธฐ๋ผ๊ณ ํ ์ ์๊ณ ๊ด๋ฆฌ์์ธ์ง ์ผ๋ฐ ์ฌ์ฉ์์ธ์ง ํน์ ์ฌ์ฅ๋์ธ์ง ๋ฑ์ ๋๋ ์ฃผ๋ ๊ฒ๋ ๊ถํ๋ถ๊ธฐ๋ผ๊ณ ํ ์ ์๋ค.
๋ก๊ทธ์ธ ํ ์ฌ๋์ธ์ง ์์๋ณด๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ด ๊ถํ๋ถ๊ธฐ ๋ก์ง์ ์งค ์ ์๋ค.
ํ์ง๋ง ์ด๋ ๋ก๊ทธ์ธ์ด ํ์ํ ๋ชจ๋ ํ์ด์ง์ ์ด๊ฑธ ๋ค ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ ํด์ฃผ์ด์ผ ํ๋ค๋ ๋ฌธ์ ์ ์ด ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ์ง ๋ณด์ํ๋๋ฐ๋ ์ด๋ ค์์ด ์๋ค. ์ด๋ฅผ ๋ฐ๋ก ๋ผ์ ์๋๊ฐ ๋จผ์ ์คํ๋๊ณ ๋ค์ ๋ก์ง์ด ์คํ๋๋๋ก ํ ์ ์๋ค.
์ด๋ ๊ฒ ๊ถํ๋ถ๊ธฐ ๋ก์ง์ ๋ฐ๋ก ๋ ์ ์๋๋ก ๋ฆฌ์กํธ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ด ์๋๋ฐ ๊ทธ ์ค ๋ํ์ ์ธ ๊ฒ์ด HOC ์ด๋ค.
HOC๋ Closure(ํด๋ก์ )๋ผ๋ ๊ฐ๋
์ ๋ฐํ์ผ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ ํด๋ก์ ๋ฅผ ๋จผ์ ์์๋ณด๋๋ก ํ์.
์ค์ฝํ์ฒด์ธ์ ์ํด์ ๋ด๋ถํจ์์์ ์ธ๋ถํจ์์ ์๋ ์ง์ญ๋ณ์์ ์ ๊ทผํ ์ ์๋ค. ์ด ๋ ์ด ์ง์ญ๋ณ์๊ฐ ๋ค์ด๊ฐ ์๋ ์์ญ์ ํด๋ก์ ๋ผ๊ณ ํ๋ค.
์ด๋ ๋ค์๊ณผ ๋์ผํ๊ฒ ์คํ๋๋ค.
HOC๋ Higher-Order Component
์ ์ฝ์๋ก ์ปดํฌ๋ํธ๋ฅผ ์ธ์๋ก ๋ฐ์ ์๋ก์ด ์ปดํฌ๋ํธ๋ก ๋ณํํด ๋ฐํํ๋ ์ปดํฌ๋ํธ๋ก ์ธ์ ๋ ์ง ๋จผ์ ํน์ ํจ๊ป ์คํํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
๋ก๊ทธ์ธ์ด ํ์ํ ๋ชจ๋ ํ์ด์ง์ ๊ฐ์ ๋ก์ง์ ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ ํ๋ ๋์ HOC ์ปดํฌ๋ํธ๋ฅผ ํ๋ ๋ง๋ค์ด์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋งค์ฐ ํจ์จ์ ์ผ๋ก ๊ถํ๋ถ๊ธฐ๋ฅผ ํด์ค ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ด bbb๋ผ๋ ํจ์๋ฅผ ๋ฆฌํดํ๋ aaa๋ผ๋ ํจ์๊ฐ ์์ ๋ aaa()()
๋ผ๊ณ ์คํํ๊ฒ ๋๋ฉด bbb๋ฅผ ์คํ ํ ์ ์๋ค.
์ฌ๊ธฐ์ bbb๋ผ๋ ์ด๋ฆ์ ์ฌ์ค ์ค์ํ์ง๊ฐ ์๋ค. bbb๋ฅผ ์ง์ ์ฌ์ฉํ ์ผ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฅผ ์ด์ฉํด์ ๊ถํ๋ถ๊ธฐ ์ํ HOC๋ฅผ ๊ตฌํํด๋ณด์.
aaa()๋ฅผ ํ๋ฉด bbb๊ฐ ์คํ๋๊ธฐ ๋๋ฌธ์ Hoc()๋ฅผ ํ๋ฉด Hoc ์ปดํฌ๋ํธ ์คํ ํ์ bbb ์ปดํฌ๋ํธ๋ฅผ ์คํ ํ ์ ์๋ค.
๊ฒฐ๊ตญ์๋ ์ด Hoc์ปดํฌ๋ํธ๋ฅผ Bbb๋ฅผ ์คํ์ํค๊ธฐ ์ ์ Hoc(Bbb)
์ด๋ ๊ฒ ๊ฐ์ธ์ ํ๋ฒ์ export ํด์ฃผ๊ณ Aaa์์๋ ์ด๊ฒ์ ํต์งธ๋ก import ํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ํ ํจ์ ์ ์ธ์ ๋์ ์ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ฌ ๊ฐํธํ๊ฒ HOC๋ฅผ ๊ตฌํํ ์ ์๋ค. return๊ณผ {์ค๊ดํธ} ์ฌ์ด์ ๋ก์ง์ด ์์ผ๋ฉด ์๋ต์ด ๊ฐ๋ฅํ๋ฏ๋ก
const Hoc = (Component) => (props) => {
// useEffect๋ฅผ ์ฌ์ฉํ ๋ก๊ทธ์ธ ๊ฒ์ฆ ๋ก์ง
const router = useRouter();
const { data } = useQuery(FETCH_USER_LOGGED_IN);
useEffect(() => {
if (!localStorage.getItem("accessToken")) {
alert("๋ก๊ทธ์ธ ํ ์ด์ฉ ๊ฐ๋ฅํฉ๋๋ค.");
router.push("/23-04-login-check");
}
}, []);
}
๋ก ํํํ ์ ์๋ค.
์ฌ๊ธฐ์ Component
๋ ๋ฆฌํดํ ์ปดํฌ๋ํธ<Component/>
๋ฅผ ์๋ฏธ(์ด๋ฆ์ด ๊ฐ์์ผ ํจ)ํ๊ณ props
๋ aaa์ปดํฌ๋ํธ์์ ๋ฐ์ {...props}
(๋ชจ๋ props๋ผ๋ ์๋ฏธ)๋ผ๊ณ ํ ์ ์๋ค.
์ด Hoc๋ค์ bbb์ ํจ๊ป ์คํ๋๋ค๋ ์๋ฏธ๋ก ์์ with๋ฅผ ๋ถ์ด๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. ๊ทธ๋์ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ ๊ฒ ๋ก๊ทธ์ธ ์ธ์ฆ ์ฌ๋ถ๋ฅผ ๊ฒ์ฆํ๋ ์ปดํฌ๋ํธ๋ผ๋ ์๋ฏธ๋ก withAuth
๋ผ๊ณ ํ๋ค. withAuth(Bbb)
HOF๋ Higher-Order Function
์ ์ฝ์๋ก ๋จผ์ ํน์ ํจ๊ป ์คํํ๋ ํจ์๋ฅผ ์๋ฏธํ๊ณ HOC์ ์ฌ์ฉ๋ฐฉ๋ฒ์ ๊ฐ๋ค. ํจ์ ์์์ 2๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ ์ ์๋ค.
์๋๋ onClickChild
๋ผ๊ณ ๋ง ์์ฑํด๋onClickChild(event)
์ด๋ ๊ฒ ์คํ์ด ๋๋๋ฐ ์ฌ๊ธฐ์์ el๋ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ๋ค์์ฒ๋ผ ๋งค๊ฐ๋ณ์๋ก (el) => (event)
๋ ๋ฐ์ ์ค ์ ์๋ค.