๐Ÿช

1. Hook

ย 
ย 

1.1 Hook์ด๋ž€?

1.1.1 Hook์˜ ์ •์˜

๐Ÿ’ก
Hook์€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ธฐ๋Šฅ(lifecycle features)์„ ์—ฐ๋™(hook into)ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
ย 
Hook์€ React ๋ฒ„์ „ 16.8๋ถ€ํ„ฐ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. Hook์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ชจ๋“  React ํŒจํ‚ค์ง€(ex. React DOM)๊ฐ€ 16.8.0 ์ด์ƒ์ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์œผ๋ฉด Hook์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Hook์ด ๋“ฑ์žฅํ•˜๊ณ  ๊ฐ€์žฅ ๋‹ฌ๋ผ์ง„ ์ ์€, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋˜ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ๋“ค์„ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ย 
ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๊ณ , ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ์กด์—๋Š” ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ๊ณผ ๋‚ฎ์€ ์žฌ์‚ฌ์šฉ์„ฑ ๋“ฑ์˜ ์—ฌ๋Ÿฌ ๋ฌธ์ œ์ ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Hook์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•ด ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ย 

1.1.2 Hook์˜ ์ข…๋ฅ˜

React๋Š”ย ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์žฅ Hook์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 1-1 React์— ๋‚ด์žฅ๋œ Hook API
๊ทธ๋ฆผ 1-1 React์— ๋‚ด์žฅ๋œ Hook API
ย 
  • ๊ธฐ๋ณธ Hook์€ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€ Hook์€ ๊ธฐ๋ณธ Hook์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํŠน์ •ํ•œ ๊ฒฝ์šฐ์— ํ•„์š”์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Hook ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด Custom Hook์„ ๋งŒ๋“ค๊ธฐ ์ „์— ์‚ดํŽด๋ณด๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.
ย 
์ด ์™ธ์—๋„ Custom Hook์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ž์‹ ๋งŒ์˜ Hook์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Custom Hook์„ ๋งŒ๋“ค๋ฉด ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง์„ ํ•จ์ˆ˜๋กœ ๋ฝ‘์•„๋‚ด์–ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์บก์Šํ™”(capsulization)๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.
ย 
Hook์˜ ์ข…๋ฅ˜๋Š” ์ด์ฒ˜๋Ÿผ ๋‹ค์–‘ํ•˜๊ณ , ์ด ์ฑ…์—์„œ ํ•˜๋‚˜์”ฉ ์ฒœ์ฒœํžˆ ๋‹ค๋ค„๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
ย 

1.2 Hook์˜ ํŠน์ง•

1.2.1 ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ

Hook์˜ ์‚ฌ์šฉ์€ ์ด์ „ ๋ฒ„์ „์˜ ์ฝ”๋“œ์™€ ์ถฉ๋Œ์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Hook์€ React ์ด์ „ ๋ฒ„์ „๊ณผ 100% ํ˜ธํ™˜์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ์ฝ”๋“œ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ํ•ด์น˜์ง€ ์•Š๊ณ ๋„ ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 

1.2.2 ์„ ํƒ์  ์‚ฌ์šฉ

Hook์€ ๊ธฐ์กด์˜ ์ฝ”๋“œ ๋‚ด์—์„œ ํ•„์š”์— ๋”ฐ๋ผ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ผ๋ถ€ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ Hook์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์ž‘์„ฑํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ Hook์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋ž˜์˜ โ€˜Class์™€ ํ˜ธํ™˜์„ฑโ€™๊ณผ๋„ ์ด์–ด์ง‘๋‹ˆ๋‹ค.
ย 

1.2.3 Class์™€ ํ˜ธํ™˜์„ฑ

Hook์ด ๊ธฐ์กด ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ โ€˜์—ฐ๋™โ€™ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ Class๋Š” React์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ถˆ์•ˆํ•จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ž์œผ๋กœ๋„ React๋Š” Class๋ฅผ ์ง€์›ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ React ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๋ฐœ์ทŒํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
Hook์€ ์กด์žฌํ•˜๋Š” ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋‚˜๋ž€ํžˆ ์ž‘๋™ํ•จ์œผ๋กœ์จ ์ ์ง„์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ค‘๋žต) React์˜ ๊ฐœ๋ฐœ์ž๋“ค์€ ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ Class ์‚ฌ๋ก€๋ฅผ Hook์œผ๋กœ ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์„ ์—ผ๋‘์— ๋‘๊ณ ๋Š” ์žˆ์ง€๋งŒ,ย ๋ฏธ๋ž˜์—๋„ ๊ณ„์† ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ง€์›ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธย ๋‚ด๋ถ€์—์„œ Hook์„ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ผ ํŠธ๋ฆฌ์—์„œ Hook๊ณผ ์„ž์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์ธ์ง€ Hook์„ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์ธ์ง€ ์—ฌ๋ถ€๋Š” ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.
ย 

1.3 Hook์˜ ์‚ฌ์šฉ ๊ทœ์น™

1.3.1 ์˜ค์ง React ํ•จ์ˆ˜ ๋‚ด์—์„œ Hook์„ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Hook์€ ์ผ๋ฐ˜ JavaScript ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์œผ๋ฉฐ React ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ, Custom Hook์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 

1.3.2 ์ตœ์ƒ์œ„(at the top level)์—์„œ๋งŒ Hook์„ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๊ณ  ํ›…์„ ํ˜ธ์ถœํ•˜๋Š” ์ˆœ์„œ๋Š” ํ•ญ์ƒ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ๋Š” ๊ฐ™์€ ํ›…์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋•Œ React๋Š” Hook์ด ํ˜ธ์ถœ๋œ ์ˆœ์„œ์— ์˜์กดํ•˜์—ฌ ์ƒํƒœ ๊ฐ’์„ ๊ตฌ๋ถ„ํ•˜๊ณ  ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์— ๋”ฐ๋ผ Hook์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‹คํ–‰ ํšŸ์ˆ˜๊ฐ€ ๋ณ€ํ•œ๋‹ค๋ฉด Hook์˜ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ณ  ๊ทธ๋กœ ์ธํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ, ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ๋‚ด์—์„œ๋Š” Hook์˜ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ƒ์œ„์—์„œ Hook์ด ํ˜ธ์ถœ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค Hook์˜ ์ˆœ์„œ๋Š” ํ•ญ์ƒ ๋™์ผํ•˜๊ฒŒ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
ย 
// ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์ œ useEffect(function Form() { if (name !== '') { console.log("๐Ÿ˜€"); } });
// ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ์˜ˆ์ œ (์กฐ๊ฑด๋ฌธ ๋‚ด์— Hook์ด ์œ„์น˜ํ•จ) if (name !== '') { useEffect(function Form() { console.log("๐Ÿ˜€"); }); }
ย 
์ฐธ๊ณ ) ์›ํ™œํ•œ Hook์˜ ์‚ฌ์šฉ์„ ์œ„ํ•ด React๋Š” ์œ„์˜ ๊ทœ์น™์„ ๊ฐ•์ œํ•ด์ฃผ๋Š” eslint-plugin-react-hooks๋ผ๋Š” ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Create React App์„ ํ†ตํ•ด React ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
npm install eslint-plugin-react-hooks --save-dev
// ESLint ์„ค์ • ํŒŒ์ผ { "plugins": [ // ... "react-hooks" ], "rules": { // ... "react-hooks/rules-of-hooks": "error", // Checks rules of Hooks "react-hooks/exhaustive-deps": "warn" // Checks effect dependencies } }
ย 

1.4 Hook์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์•ž์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ƒํƒœ๊ด€๋ฆฌ์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ง์˜ ์žฌ์‚ฌ์šฉ ๋ฐ ๊ตฌ์กฐ ํŒŒ์•…์ด ์–ด๋ ต๊ณ  ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ดํ•ด๋ฅผ ๋•๊ธฐ์œ„ํ•ด ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ„๋‹จํžˆ ๋น„๊ตํ•˜์ž๋ฉด, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” render()๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. render() ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—๋Š” ๋ Œ๋”๋ง ํ•˜๊ณ  ์‹ถ์€ JSX ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ props๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด this ํ‚ค์›Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ this.props, this.setState๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ this์˜ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์—†๋‹ค๋ฉด ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ํ™œ์šฉ์— ์–ด๋ ค์›€์„ ๊ฒช์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ถ€๋ถ„์€ 1.4.3์ ˆ์—์„œ ์ž์„ธํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Hook์ด ๋“ฑ์žฅํ•œ ์ดํ›„ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๊ด€๋ฆฌ์™€ ์ƒ๋ช…์ฃผ๊ธฐ ์ด๋ฒคํŠธ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์ ธ ์œ„์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
// ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ์˜ˆ์‹œ class Example extends React.Component { constructor() { super(); this.state = {title: "example"}; } render() { return <p>hello, {this.state.title}</p> } }
ย 
// ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์˜ˆ์‹œ function Example () { let [title, setTitle] = useState("example") return <p>hello, {title}</p> }
ย 
ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์˜ ์‚ฌ์šฉ์„ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“  Hook์€ 3๊ฐ€์ง€ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  1. Hook์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํƒœ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. Hook์€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  1. Hook์€ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ์—†์ด React๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
ย 
React์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ์žฅ์ ์„ ์ด์œ ๋กœ Hook์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋ฉฐ ์ง€๊ธˆ๋ถ€ํ„ฐ ๊ณต์‹๋ฌธ์„œ์— ์ •์˜๋œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ Hook์˜ ์‚ฌ์šฉ ๋™๊ธฐ๋ฅผ ์ด์•ผ๊ธฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 

1.4.1 Hook์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํƒœ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์ค‘๋ณต๋œ ์ฝ”๋“œ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ค„์ด๊ณ ์ž ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ React์—์„œ๋„ ์ค‘๋ณต ์ปดํฌ๋„ŒํŠธ ๋กœ์ง๋“ค์„ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š”๋ฐ, React์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ค‘๋ณต ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” Render props, ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(HOC, Higher Order Component)์™€ ๊ฐ™์€ ์žฌ์‚ฌ์šฉ ํŒจํ„ด์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜ ์˜ˆ์‹œ โ‘  ๋ถ€๋ถ„์ฒ˜๋Ÿผ ์žฌ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ์ค˜์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋กœ์ง์ด ๊ณ„์† ๊ฒน์ณ์ง€๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ž˜ํผ ์ง€์˜ฅ(wrapper hell)์„ ๋งŒ๋‚  ํ™•๋ฅ ์ด ๋†’์•„์กŒ๊ณ , ์ฝ”๋“œ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์šด ์ƒํ™ฉ๋“ค์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
ย 
// ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ๋กœ ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ // ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ function withLogin(WrapperComponent) { return class extends React.Component { // ์ƒ์„ฑ์ž ๋ฐ ๊ณตํ†ต ์ƒํƒœ ๋กœ์ง constructor() { state = { user: [] } } componentDidMount() { // ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ(๋ฐ์ดํ„ฐ ๋ฐ›์•„์˜ค๊ธฐ) } // ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง render() { return <WrapperComponent {...this.state} {...this.props} />; } }; }; // ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ function LoginPage ({ user }) { // ๋‚ด๋ ค๋ฐ›์€ user ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ } export default withLogin(LoginPage); // --- โ‘  ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ์ฃผ๊ธฐ
ย 
์ด๋Ÿฐ ๋ฌธ์ œ์ ๋“ค์„ Hook์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Hook์ด ๋‚˜์˜จ ์ดํ›„ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง์„ ์ถ”์ƒํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด์„œ, Custom Hook์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ œ๋Š” ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ์™€ ๊ฐ™์€ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ Hook์œผ๋กœ ์†์‰ฝ๊ฒŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
// Custom Hook์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ // Custom Hook function useLogin() { const [user, setUser] = useState([]); useEffect(() => { // ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ(๋ฐ์ดํ„ฐ ๋ฐ›์•„์˜ค๊ธฐ) }, []); return [user]; } // ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ function LoginPage() { const [user] = useLogin(); return ( <> {user.map(({ no, email, name }, idx) => { <div key={no}> <p>{email}</p> <strong>{name}</strong> </div> })} </> ) }
ย 

1.4.2 Hook์€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•  ๊ฒฝ์šฐ, ์ƒ๋ช…์ฃผ๊ธฐ(Lifecycle) ๋˜ํ•œ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ๋˜ํ•œ React๋Š” ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง์„ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๊ณ ์ž ์ปดํฌ๋„ŒํŠธ๋กœ ์ž‘๊ฒŒ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณ„๋„์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, Hook์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ์กฐ์˜ ๋ณ€ํ™” ์—†์ด ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— React์— ์ข€ ๋” ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
๐Ÿ’ก
์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ
๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ โ€˜์ƒ๋ช…์ฃผ๊ธฐโ€™๋ฅผ ๊ฐ€์ง€๋ฉฐ, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” โ€˜์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œโ€™๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ํŠน์ • ์‹œ์ ์— ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ƒ๋ช…์ฃผ๊ธฐ๋Š” ๋ณดํ†ตย ํŽ˜์ด์ง€์˜ ๋ Œ๋”๋ง ์ค€๋น„ ๊ณผ์ •์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ํŽ˜์ด์ง€์—์„œ ์‚ฌ๋ผ์งˆ ๋•Œ ๋๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ดˆ๊ธฐํ™”(Initialize) - ์ƒ์„ฑ(Mounting) - ์—…๋ฐ์ดํŠธ(Props change, State Change) - ์†Œ๋ฉธ(Unmounting)์˜ 4๋‹จ๊ณ„๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์—…๋ฐ์ดํŠธ๋œ ํ›„ ์†Œ๋ฉธ๋˜๋Š” ๊ณผ์ •์—์„œ ์ƒ๋ช…์ฃผ๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ํ•ด๋‹น ์ƒ๋ช…์ฃผ๊ธฐ ๋‹จ๊ณ„์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ํ™”๋ฉด์— ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜ ์›น ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋“ฑ์˜ ์—…๋ฌด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
โ†’ Hook์„ ์ด์šฉํ•˜๋ฉด ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์ƒํƒœ ๊ด€๋ฆฌ(state)์™€ React์˜ ๊ธฐ๋Šฅ(์ƒ๋ช…์ฃผ๊ธฐ ์ด๋ฒคํŠธ ๋“ฑ)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 1-2 React ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ
๊ทธ๋ฆผ 1-2 React ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ
ย 
ย 

1.4.3 Hook์€ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ์—†์ด React๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ๋ณด๋‹ค ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ๊ธธ๊ณ  ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” this ํ‚ค์›Œ๋“œ์˜ ์ž‘๋™๋ฐฉ์‹์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚ฉ๋‹ˆ๋‹ค. this๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ์กฐ์ž‘ ๋ฐ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ๋„ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ๋‹ฌ๋ฆฌ ๊ธธ๊ณ  ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ํŽ˜์ด์ง€ ์ƒ์„ฑ ์†๋„๊ฐ€ ๋Š๋ฆฝ๋‹ˆ๋‹ค. React ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๋ฐœ์ทŒํ•ด์˜จ ์ž๋ฃŒ์—๋Š” Prepack ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ™œ์šฉํ•ด ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•œ ๊ฒฐ๊ณผ, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ปดํŒŒ์ผ ์†๋„์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์ณค์Šต๋‹ˆ๋‹ค.
ย 
์ด์™€ ๊ฐ™์€ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Hook์€ React์—์„œ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณดํŽธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Hook์ด ๋‚˜์˜ค๊ธฐ ์ „์—๋Š” state์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ด์œ ๋กœ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŽ์ด ์“ฐ์ด์ง€ ๋ชปํ–ˆ์ง€๋งŒ Hook์˜ ๋“ฑ์žฅ ์ดํ›„ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์„ ํ†ตํ•ด Props Drilling๊ณผ state๋ฅผ ์ด์šฉํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋น„๊ตํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Props Drilling์€ ์ตœํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ props๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ๋ฐ˜๋ฉด state๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 1-3
๊ทธ๋ฆผ 1-3
ย 
๋˜ํ•œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š์•„ ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐํ•จ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ  ๊นŠ์€ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ค‘์ฒฉ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐœ๋…์  ์˜๋ฏธ์—์„œ React ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ์ง€ํ–ฅํ•˜๋Š” React ์ •์‹ ์„ ์ž‡๊ธฐ ์œ„ํ•ด์„œ๋„ Hook์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
ย