[React 23] - Login 2, pre-rendering, Closure, HOC, HOF

yiwoojungยท2022๋…„ 9์›” 6์ผ
0

{C} Codecamp FE 06

๋ชฉ๋ก ๋ณด๊ธฐ
20/21

๐Ÿ‘พ ์˜ค๋Š˜์˜ ๋ชฉํ‘œ

  1. ๋ธŒ๋ผ์šฐ์ € ์ €์žฅ์†Œ์— ๋กœ๊ทธ์ธ ์ •๋ณด ์ €์žฅํ•˜๊ธฐ
  2. Next.js ๋ Œ๋”๋ง ์›๋ฆฌ Diffing / Hydration
  3. ๊ถŒํ•œ๋ถ„๊ธฐ
  4. Closure
  5. HOC / HOF

0. ๋ธŒ๋ผ์šฐ์ € ์ €์žฅ์†Œ ์ข…๋ฅ˜์™€ ๋กœ๊ทธ์ธ ์ •๋ณด ์ €์žฅํ•˜๊ธฐ (์ž„์‹œ ๋ฐฉ๋ฒ•)

๋ธŒ๋ผ์šฐ์ € ์ž์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ณต๊ฐ„์ธ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€, ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€, ์ฟ ํ‚ค๊ฐ€ ์žˆ๋‹ค.
๊ฐœ๋ฐœ์ž๋„๊ตฌ > Application์œผ๋กœ ๊ฐ€๋ฉด ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์™€ ์„ธ์…˜์Šคํ† ๋ฆฌ์ง€๋Š” Key์™€ Value ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ๋‹ค.

localStorage.Key์ด๋ฆ„ ํ•˜๋ฉด Value๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€๋Š” ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅ์ด ๋˜์ง€๋งŒ ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋„๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค. ๊ทธ๋ž˜์„œ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„ํšŒ์› ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฟ ํ‚ค๋Š” ๋ฐฑ์—”๋“œ API๋ฅผ ๋ณด๋‚ผ ๋•Œ ๊ฐ™์ด ๋„˜๊ฒจ ์ค„ ์ˆ˜ ์žˆ์–ด์„œ ๋ฐฑ์—”๋“œ์™€ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ๋˜ํ•œ ๋งŒ๋ฃŒ์‹œ๊ฐ„๋„ ๊ฐ™์ด ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠน์ • ๋งŒ๋ฃŒ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.


์ด ์ค‘์—์„œ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ด์šฉํ•˜๋ฉด ๋กœ๊ทธ์ธํ•  ๋•Œ ๋ฐ›์€ accessToken์„ ์ €์žฅํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ป๋‹ค ํ‚ค๊ฑฐ๋‚˜ ์ƒˆ๋กœ๊ณ ์นจํ•ด๋„ ๋‚ด์šฉ์ด ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ณ  accessToken์ด ์œ ์ง€๋˜๊ฒŒ๋” ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
(ํ•˜์ง€๋งŒ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ์ƒ ์ข‹์ง€ ๋ชปํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๋Š” ๊ฒƒ ๋Œ€์‹ ์— refreshToken์„ ์ด์šฉํ•ด์„œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค.)


์ด๋ฅผ ํ•œ๋ฒˆ ๊ตฌํ˜„ํ•ด๋ณด์ž.

๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์—์„œ accessToken์„ setํ•ด์„œ ๋„ฃ์–ด์ฃผ๊ณ  getํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์ด๋•Œ localStorage is not defined๋ผ๋Š” ์—๋Ÿฌ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Next.js์˜ ๋ Œ๋”๋ง ์›๋ฆฌ๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.




1. Next.js ๋ Œ๋”๋ง ์›๋ฆฌ Diffing / Hydration

์šฐ์„  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋ฒ„์— ์ ‘์†ํ•ด์„œ 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์˜ ํ”„๋ฆฌ๋ Œ๋”๋ง์œผ๋กœ ์ธํ•œ localStorage is not defined ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ

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);
    // });
  }, []);

2. ๊ถŒํ•œ๋ถ„๊ธฐ

ํ•˜๋‚˜์˜ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ๋‚˜๋ˆ ์ฃผ๋Š” ์ž‘์—…์„ ๊ถŒํ•œ๋ถ„๊ธฐ๋ผ๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€์—์„œ ๋กœ๊ทธ์ธํ•œ ์‚ฌ๋žŒ๊ณผ ๋กœ๊ทธ์ธ ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ์„ ๋‚˜๋ˆ„๊ฒƒ๋„ ๊ถŒํ•œ๋ถ„๊ธฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ด€๋ฆฌ์ž์ธ์ง€ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์ธ์ง€ ํ˜น์€ ์‚ฌ์žฅ๋‹˜์ธ์ง€ ๋“ฑ์„ ๋‚˜๋ˆ ์ฃผ๋Š” ๊ฒƒ๋„ ๊ถŒํ•œ๋ถ„๊ธฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋กœ๊ทธ์ธ ํ•œ ์‚ฌ๋žŒ์ธ์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ถŒํ•œ๋ถ„๊ธฐ ๋กœ์ง์„ ์งค ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Š” ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ๋ชจ๋“  ํŽ˜์ด์ง€์— ์ด๊ฑธ ๋‹ค ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๋Š”๋ฐ๋„ ์–ด๋ ค์›€์ด ์žˆ๋‹ค. ์ด๋ฅผ ๋”ฐ๋กœ ๋–ผ์„œ ์•„๋ž˜๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ  ๋‹ค์Œ ๋กœ์ง์ด ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ถŒํ•œ๋ถ„๊ธฐ ๋กœ์ง์„ ๋”ฐ๋กœ ๋—„ ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌ์•กํŠธ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์ด ์žˆ๋Š”๋ฐ ๊ทธ ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด HOC ์ด๋‹ค.
HOC๋Š” Closure(ํด๋กœ์ €)๋ผ๋Š” ๊ฐœ๋…์„ ๋ฐ”ํƒ•์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ํด๋กœ์ €๋ฅผ ๋จผ์ € ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.


3. Closure


์Šค์ฝ”ํ”„์ฒด์ธ์— ์˜ํ•ด์„œ ๋‚ด๋ถ€ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€ํ•จ์ˆ˜์— ์žˆ๋Š” ์ง€์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ์ด ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ์˜์—ญ์„ ํด๋กœ์ €๋ผ๊ณ  ํ•œ๋‹ค.

์ด๋Š” ๋‹ค์Œ๊ณผ ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰๋œ๋‹ค.

4. HOC / HOF

HOC

HOC๋ž€ Higher-Order Component์˜ ์•ฝ์ž๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณ€ํ™˜ํ•ด ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ ์–ธ์ œ๋“ ์ง€ ๋จผ์ € ํ˜น์€ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๊ฐ™์€ ๋กœ์ง์„ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•˜๋Š” ๋Œ€์‹  HOC ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋งค์šฐ ํšจ์œจ์ ์œผ๋กœ ๊ถŒํ•œ๋ถ„๊ธฐ๋ฅผ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

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

HOF๋ž€ Higher-Order Function์˜ ์•ฝ์ž๋กœ ๋จผ์ € ํ˜น์€ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๊ณ  HOC์™€ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ๊ฐ™๋‹ค. ํ•จ์ˆ˜ ์•ˆ์—์„œ 2๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์›๋ž˜๋Š” onClickChild ๋ผ๊ณ ๋งŒ ์ž‘์„ฑํ•ด๋„onClickChild(event) ์ด๋ ‡๊ฒŒ ์‹คํ–‰์ด ๋˜๋Š”๋ฐ ์—ฌ๊ธฐ์—์„œ el๋„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ (el) => (event) ๋„ ๋ฐ›์•„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€