[React] Hooks - Hook์ด๋ž€?, useEffect

eonisalยท2023๋…„ 8์›” 5์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
6/10
post-thumbnail

๐ŸŽ€ Hook์ด๋ž€?

๋ฆฌ์•กํŠธ Hook์€ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌ(State)ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ƒํ˜ธ์ž‘์šฉ(Effect)์„ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ, ๊ธฐ์กด์—๋Š” ํ•จ์ˆ˜ํ˜•์€ ์ƒํƒœ ๊ด€๋ฆฌ์กฐ์ฐจ ํ•  ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฐ„๋‹จํ•œ ์ปดํฌ๋„ŒํŠธ์— ๋ถˆ๊ณผํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๋•Œ๋ฌธ์— ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋“ฑ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ€์ง„ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ด ๊ธฐ๋Šฅ๋“ค์„ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก React 16.8 ๋ฒ„์ „์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์ด Hook์ด๋‹ค.

์ด์ „์— ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ state ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ์œ„ํ•ด ์‚ฌ์šฉํ•œ useState๊ฐ€ ๋ฐ”๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ํ›…, State Hook์ด๋‹ค.

โš ๏ธ Hook ์‚ฌ์šฉ์‹œ ์œ ์˜์‚ฌํ•ญ

Hook์€ ๋ฆฌ์•กํŠธ์˜ ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์• ์ดˆ์— Hook์ด๋ผ๋Š” ๊ธฐ๋Šฅ์ด ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ํ•˜์ง€๋ชปํ–ˆ๋˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๋„์ž…๋œ ๊ฒƒ์ด๋‹ˆ ๋‹น์—ฐํ•˜๋‹ค.

Hook์˜ ํ˜ธ์ถœ์€ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค

Hook์€ ํ•จ์ˆ˜์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ, ํ•จ์ˆ˜์˜ '์ „์—ญ'์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•จ์ˆ˜ ๋‚ด์˜ if๋ฌธ, for๋ฌธ, ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋“ฑ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ!

๊ทธ๋ฆฌ๊ณ  ์œ ์˜์‚ฌํ•ญ์ด๋ผ๊ธฐ์—” ๋ญํ•˜์ง€๋งŒ ๋ฆฌ์•กํŠธ์˜ Hook์€ ์ด๋ฆ„์•ž์— ๋‹ค use๊ฐ€ ๋ถ™๋Š”๋‹ค. useState, useEffect, useRef ๋“ฑ๋“ฑ.. ์•ž์œผ๋กœ ์‚ดํŽด๋ณผ ํ›…๋“ค์€ ๋ชจ๋‘ ์ด๋ ‡๊ฒŒ ๋„ค์ด๋ฐ ๋˜์–ด์žˆ๋‹ค๊ณ  ์•Œ์•„๋‘์ž!

๐Ÿ“ข useEffect

useEffect๋Š” side effect์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Hook์ด๋‹ค.

useEffect๋ฅผ ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด side effect ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ด์•ผ ํ•˜๋‹ˆ ์ข€ ์‚ดํŽด๋ณด์ž.

Side-Effect

์ง์—ญํ•˜์ž๋ฉด '๋ถ€์ž‘์šฉ'์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•„๋Š” ๊ทธ ๋ถ€์ž‘์šฉ์ด ๋– ์˜ค๋ฅด๋Š”๋ฐ ์ปดํ“จํ„ฐ ๊ณตํ•™์—์„œ๋Š” ๊ทธ๋Ÿฐ ์˜๋ฏธ๋Š” ์•„๋‹ˆ๊ณ , ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋กœ '๋ถ€์ˆ˜ ํšจ๊ณผ'๋ผ๋Š” ์˜๋ฏธ๋ผ๊ณ  ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋ถ€์ˆ˜ ํšจ๊ณผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์™ธ๋ถ€์— ์กด์žฌํ•˜๋Š” ๊ฐ’ ๋˜๋Š” ์–ด๋–ค ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ํšจ๊ณผ, ์ฆ‰ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋™์ž‘์ด ํ•ด๋‹น ํ•จ์ˆ˜ ๋ฐ–์˜ ์„ธ๊ณ„์™€๋„ ๋ญ”๊ฐ€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

side effect์˜ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๋“ฑ์ด ์žˆ๋‹ค.

  • ๋ฐฑ์—”๋“œ API ์„œ๋ฒ„์™€ ํ†ต์‹ 
  • ์ปดํฌ๋„ŒํŠธ ๋ฐ–์˜ ๋‹ค๋ฅธ ํƒœ๊ทธ๋ฅผ js๋กœ ๊ฐ€์ ธ์™€ ๋ณ€๊ฒฝ
  • ๋ธŒ๋ผ์šฐ์ € API(document, window)๋ฅผ ์ง์ ‘ ์‚ฌ์šฉ
  • setTimeout, setInterval ๋“ฑ ํ˜ธ์ถœ ์Šค์ผ€์ค„๋ง ํ•จ์ˆ˜ ์‚ฌ์šฉ

Props์™€ State ํฌ์ŠคํŒ…์—์„œ ์ž ๊น ์–ธ๊ธ‰ํ•œ ๊ฒƒ ์ค‘์— '์ˆœ์ˆ˜ ํ•จ์ˆ˜(Pure function)' ๋ผ๋Š” ๊ฒƒ์ด ์žˆ์—ˆ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ React์˜ ์ฒ ํ•™์„ ์†Œ๊ฐœํ•˜์˜€๋‹ค.

๋ชจ๋“  React ์ปดํฌ๋„ŒํŠธ๋Š” props์™€ ๊ด€๋ จํ•œ ๋™์ž‘์„ ํ•  ๋•Œ ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด์•ผํ•œ๋‹ค.

๋‚˜๊ฐ™์€ ๋‰ด๋น„๋“ค์€ ๋ณดํ†ต ์ˆœ์ˆ˜ ํ•จ์ˆ˜(Pure function)๋ฅผ '๋™์ผํ•œ ์ž…๋ ฅ์— ๋Œ€ํ•œ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์ด ํ•ญ์ƒ ๋™์ผํ•œ ํ•จ์ˆ˜' ์ •๋„๋กœ ์•Œ๊ณ ์žˆ๋‹ค.

๋งž๋Š” ๋ง์ด์ง€๋งŒ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์€ ํ•œ๊ฐ€์ง€ ๋” ์žˆ๋‹ค.

ํ•จ์ˆ˜์— side effect๊ฐ€ ์—†๋‹ค

'์–ด๋– ํ•œ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€ ๋™์ž‘์ด ํ•ด๋‹น ํ•จ์ˆ˜ ๋ฐ–์—๋„ ๋ฌด์–ธ๊ฐ€ ์˜ํ–ฅ์„ ์ค€๋‹ค๋ฉด, ํ˜น์€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•œ๋‹ค๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” side effect๊ฐ€ ์žˆ๋‹ค' ๋ผ๊ณ  ๋งํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์ด๋Ÿฌํ•œ side effect๊ฐ€ ์—†๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜์˜ ํ˜•ํƒœ๋ฅผ ์ง€ํ–ฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ?

์ปดํฌ๋„ŒํŠธ์—์„œ setInterval์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ๋ฅผ ํ•œ๊ฐ€์ง€ ๋“ค์–ด๋ณด๊ฒ ๋‹ค.

function App() {
  const [count, setCount] = useState(0);

  setInterval(() => {
    setCount(count+1);
  }, 1000);

  return (
    <div className="App">
      {count}
    </div>
  );
}

์‹คํ–‰ํ•˜๋ฉด ํ™”๋ฉด์— 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ 1์ดˆ์— 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ๋ชจ์Šต์ด ๋‚˜์˜ค๋Š” ๊ฐ„๋‹จํ•œ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ 10์ด ๋์„๋•Œ์ฏค๋ถ€ํ„ฐ ๋ญ”๊ฐ€ ์ด์ƒํ•œ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ˆ˜๊ฐ€ ๋”ฑ๋”ฑ ์˜ฌ๋ผ๊ฐ€๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์ˆซ์ž๋“ค์ด ์ˆœ๊ฐ„์ ์œผ๋กœ ๊ฒน์ณ์„œ ๋ณด์ด๋Š”๋“ฏํ•œ ๋ชจ์Šต์ด ๋ณด์ธ๋‹ค.

์ˆซ์ž๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ด ํ˜„์ƒ์€ ์ ์  ๋” ์‹ฌํ•ด์ ธ 30์ •๋„๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์นด์šดํŠธ๊ฐ€ ์ •์‹ ์„ ๋ชป์ฐจ๋ฆฐ๋‹ค.

์ด ํ˜„์ƒ์˜ ์›์ธ์€ setInterval์ด๋‹ค.

setInterval์€ ์ •ํ•ด์ง„ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ๋งˆ๋‹ค ์ •ํ•ด์ค€ ๋™์ž‘์„ ๋ฐ˜๋ณต ์‹คํ–‰ํ•˜๋Š” ์™ธ๋ถ€ ๋ฉ”์„œ๋“œ. ์ฆ‰ ์™ธ๋ถ€์˜ ์›น api๋กœ, ์ด ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ํƒœ์ƒ์ธ ๋‹ค๋ฅธ ์• ๋“ค๊ณผ๋Š” ๊ทผ๋ณธ๋ถ€ํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ๋†ˆ์ด๋‹ค. ์ด๋Ÿฐ ์™ธ๋ถ€ api๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š”๊ฒƒ์ฒ˜๋Ÿผ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋กœ์ง๊ณผ ๋ณ„๊ฐœ๋กœ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์˜ํ–ฅ์„ ๋ฐ›๊ฑฐ๋‚˜ ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ์ฃผ๊ฑฐ๋‚˜ ํ•˜๋Š” ์• ๋“ค์ด side effect์ด๋‹ค.

์œ„์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ count๊ฐ€ ์ฆ๊ฐ€ํ•˜์—ฌ App ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜์–ด๋„ setInterval์€ ์ด ์ปดํฌ๋„ŒํŠธ ๋กœ์ง๊ณผ๋Š” ๋ณ„๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ setInterval์˜ ๋™์ž‘์ด ๊ณ„์† ์œ ์ง€๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜์–ด ๋กœ์ง์ด ๋‹ค์‹œ ์‹คํ–‰๋˜๋ฉด ๊ฑฐ๊ธฐ์— ์ƒˆ๋กœ์šด setInterval์ด ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ณผ์ •์ด ๋ฐ˜๋ณต๋˜์–ด ์ ์  ๋ˆ„์ ๋˜๋‹ค๋ณด๋‹ˆ ๋™์ž‘ํ•˜๋Š” setInterval์ด ๋งŽ์•„์ ธ์„œ ์นด์šดํŠธ๊ฐ€ ์ ์  ๋ง›์ด ๊ฐ€๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋จ์— ๋”ฐ๋ผ side effect๊ฐ€ ์ค‘์ฒฉ๋˜์–ด ๋‚˜ํƒ€๋‚˜๋Š” ์ด์ƒ ํ˜„์ƒ์ธ ๊ฒƒ์ด๋‹ค.

์ด ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋งํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ ์ด๋Ÿฌํ•œ side effect๋Š” ์„ค๊ณ„์ž๊ฐ€ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ํ˜„์ƒ์„ ๋ฐœ์ƒ์‹œํ‚ฌ ํ™•๋ฅ ์ด ๋†’๋‹ค๋ผ๋Š”๊ฒƒ. ์ฆ‰ ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

side effect๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค

์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์žˆ๋Š” side effect๊ฐ€ ์•„๋‹Œ ์• ๋“ค์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ธ์ œ๋‚˜ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ํ•œ๋‹ค. ๊ทผ๋ฐ side effect๋Š” ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ์ฃผ๊ณ , ์™ธ๋ถ€์˜ ๊ฒƒ์„ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๋“ฑ '์™ธ๋ถ€ ์„ธ๊ณ„'์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ• ์ง€ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ side effect๊ฐ€ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํ•œ๊ฒฐ๊ฐ™์„ ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

(์ด๋Ÿฐ ๊ด€์ ์—์„œ๋ณด๋ฉด side effect๋ฅผ ๊ทธ๋ƒฅ '๋ถ€์ž‘์šฉ'์ด๋ผ๊ณ  ๋ด๋„ ์ƒ๊ด€์—†์„๊ฑฐ ๊ฐ™๊ธฐ๋„ ํ•˜๋‹ค.. ๐Ÿซ )

๋ชจ๋“  React ์ปดํฌ๋„ŒํŠธ๋Š” props์™€ ๊ด€๋ จํ•œ ๋™์ž‘์„ ํ•  ๋•Œ ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด์•ผํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ๋Š” ์ด๋Ÿฐ ์ฒ ํ•™์„ ๋‚ด์„ธ์šฐ๋Š”๊ฒŒ ์•„๋‹๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด์•ผ ๊น”-๋”ํ•˜๋‹ˆ๊นŒ..!

side effect ์ฒ˜๋ฆฌ

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— side effect๋ฅผ ์“ฐ์ง€ ์•Š์„ ์ˆ˜๋Š” ์—†์„๊ฒƒ์ด๋‹ค. ์˜คํžˆ๋ ค side effect๋ฅผ ์จ์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ํ›จ์”ฌ ๋งŽ์„๊ฒƒ์ด๋‹ค.

์‹ค์ œ๋กœ ์•„์ฃผ ๋‹จ์ˆœํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ์™ธํ•œ ์‚ฌ์‹ค์ƒ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  side effect์— ์˜์กดํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ์—์„œ side effect๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ณ„๋„์˜ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ Hook์ด ๋ฐ”๋กœ useEffect์ธ ๊ฒƒ์ด๋‹ค.

๋ฆฌ์•กํŠธ์—์„œ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ณดํ†ต ์ˆ˜์‹œ๋กœ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ„์—์„œ์ฒ˜๋Ÿผ side effect๋ฅผ ๋‹ค๋ฅธ์• ๋“ค์ฒ˜๋Ÿผ ํ‰๋ฒ”ํ•˜๊ฒŒ ๋ฐ•์•„๋’€๋‹ค๊ฐ„ ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ• ์ง€ ๋ชจ๋ฅธ๋‹ค. useEffect๋Š” side effect๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํƒ€์ด๋ฐ์—๋งŒ ์•Œ์ž˜๋”ฑํ•˜๊ฒŒ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ค€๋‹ค.

useEffect์˜ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ์ด๋ ‡๋‹ค.

import { useEffect } from 'react';

useEffect(Callback, Deps?)

(์ผ๋‹จ ๋‹น์—ฐํžˆ useState์™€ ๋˜‘๊ฐ™์ด react์—์„œ ์ž„ํฌํŠธ๋ฅผ ํ•ด์ค€๋‹ค)

  • Deps : ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•  ๋ณ€์ˆ˜๋“ค์˜ ๋ฐฐ์—ด
  • Callback : Deps๋กœ ์ง€์ •๋œ ๋ณ€์ˆ˜๊ฐ€ ๋ณ€ํ• ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜

Callback ๋ถ€๋ถ„์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์— ์›ํ•˜๋Š” ์‹œ์ ๋งˆ๋‹ค ์‹คํ–‰์‹œํ‚ฌ ๋กœ์ง, ์ฆ‰ side effect๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

Deps๋Š” Callback์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ธฐ์ค€์ด ๋˜๋Š” ๋ณ€์ˆ˜๋“ค์„ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์ด๋‹ค. ๋’ค์— ?๊ฐ€ ๋ถ™์€๊ฑด ์ด ์ธ์ž๋Š” ํ•„์ˆ˜๊ฐ’์€ ์•„๋‹ˆ๋ผ๋Š” ํ‘œ๊ธฐ๋ฒ•์ด๋‹ค. ์ƒ๋žตํ•˜์—ฌ Callback๋งŒ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์›ํ•˜๋Š” state ๋ณ€์ˆ˜๋“ค์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๋นˆ ๋ฐฐ์—ด๋กœ ํ•˜์—ฌ ์ธ์ž๋กœ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Deps๊ฐ€ ์žˆ๋Š๋ƒ ์—†๋Š๋ƒ, ์žˆ๋‹ค๋ฉด Deps ๋ฐฐ์—ด์ด ๋นˆ ๋ฐฐ์—ด์ด๋ƒ ์•„๋‹ˆ๋ƒ์— ๋”ฐ๋ผ Callback์ด ์–ด๋–ค ํƒ€์ด๋ฐ์— ์‹คํ–‰๋˜๋Š”์ง€๊ฐ€ ์ •ํ•ด์ง„๋‹ค. ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉฐ ์•Œ์•„๋ณด์ž.

๋ Œ๋”๋ง์‹œ ์‹คํ–‰๋˜๋Š” Effect (Deps X)

Deps ์ธ์ž๋ฅผ ์•„์˜ˆ ์•ˆ๋„ฃ์–ด์ฃผ๋ฉด useEffect์˜ Callback์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

function App() {
  const [render, setRender] = useState(true);

  console.log(render);

  useEffect(() => {
    console.log("์นด์šดํŠธ ์‹œ์ž‘!");
  })

  const handleClick = () => {
    setRender(curr => !curr);
  }
  
  return (
    <div className="App">
      <button onClick={handleClick}>๋ฆฌ๋ Œ๋”๋ง</button>
    </div>
  );
}

๋ฆฌ๋ Œ๋”๋ง ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ render ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜์ „์‹œ์ผœ์ค„๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๊ณ  ๊ทธ๋•Œ๋งˆ๋‹ค useEffect์˜ Callback์ด ์‹คํ–‰๋˜์–ด ์ฝ˜์†”์ฐฝ์— "์นด์šดํŠธ ์‹œ์ž‘!"์ด ๋œจ๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


์ตœ์ดˆ ํ•œ๋ฒˆ ์‹คํ–‰๋˜๋Š” Effect

Deps์— ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์œผ๋ฉด useEffect์˜ Callback์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง ๋  ๋•Œ๋งŒ ๋”ฑ 1๋ฒˆ ์‹คํ–‰๋œ๋‹ค.

์•„๊นŒ์˜ setInterval์„ useEffect๋ฅผ ์‚ฌ์šฉํ•ด ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

function App() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    setInterval(() => {
      setCount(curr => curr+1);
    }, 1000);
  }, [])
  
  return (
    <div className="App">
      {count}
    </div>
  );
}

Deps๊ฐ€ ๋นˆ ๋ฐฐ์—ด์ด๋‹ˆ ์ปดํฌ๋„ŒํŠธ ์ตœ์ดˆ ๋ Œ๋”๋ง์‹œ์—๋งŒ ๋”ฑ ํ•œ๋ฒˆ setInterval์ด ์‹คํ–‰๋˜๋ฏ€๋กœ count๊ฐ€ ๋ณ€ํ•จ์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜์–ด๋„ setInterval์ด ์ค‘์ฒฉ๋˜๋Š”์ผ ์—†์ด ์ •์ƒ์ ์œผ๋กœ ์นด์šดํŠธ๊ฐ€ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋œ๋‹ค.

๊ทผ๋ฐ ์นด์šดํŠธ๊ฐ€ 2์”ฉ ์˜ฌ๋ผ๊ฐ. ๋‚˜๋„ ์™œ์ด๋Ÿฐ๊ฑด์ง€ ๋ชฐ๋ผ์„œ ๋‹ต๋‹ตํ–ˆ๋Š”๋ฐ.. ์ฐพ์•„๋ณด๋‹ˆ index.js์˜ React.StrictMode ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ•œ๋‹ค..! ์–˜๋ฅผ ์—†์• ๋ฉด ์ •์ƒ์ ์œผ๋กœ 1์”ฉ ์ฆ๊ฐ€ํ•จ

์ด๊ฒƒ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด์ค€ ๊ณ ๋งˆ์šด ๊ณ ์ธ๋ฌผ๋ถ„๋“ค์ด ๋งŽ์ด ๊ณ„์…”์„œ ๋‹คํ–‰ํžˆ ์›์ธ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๐Ÿ™‡โ€โ™‚๏ธ

useEffect๊ฐ€ ๋‘๋ฒˆ ์‹คํ–‰๋œ๋‹ค๊ณ 

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•ด์ฃผ์‹ญ์…ฉ

โ€ป ๐Ÿง state๋ณ€์ˆ˜ ๊ฐฑ์‹  ๋ฌธ์ œ(ํด๋กœ์ €)

์œ„ ์ฝ”๋“œ์—์„œ setInterval์˜ setCount๋ฅผ ์œ„์—์„œ์ฒ˜๋Ÿผ setCount(count+1)๋กœ ํ•œ๋‹ค๋ฉด ์ตœ์ดˆ ๋ Œ๋”๋ง ์‹œ 0์ด ๋‚˜์˜ค๊ณ  1์ดˆ๋’ค 1์ด ๋˜์—ˆ๋‹ค๊ฐ€ ๊ทธ์ƒํƒœ์—์„œ ๋ฉˆ์ถ˜๋‹ค.

์ด๋Š” ์‹ค์ œ๋กœ setInterval์ด ๋ฉˆ์ถ˜๊ฒŒ ์•„๋‹ˆ๊ณ  count๊ฐ€ 1๊นŒ์ง€๋งŒ ์ฆ๊ฐ€ํ•˜๊ณ  ๊ณ„์† ๋‹ค์‹œ 1์ด ๋˜๊ธฐ๋•Œ๋ฌธ์ธ๋ฐ ์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํด๋กœ์ € ๊ฐœ๋…์„ ์ฐพ์•„๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ฒฐ๋ก ๋งŒ ๋งํ•˜์ž๋ฉด useEffect์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์‹œ์ ์˜ count๊ฐ’์ด 0์ด์—ˆ์œผ๋ฏ€๋กœ ๊ทธ ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋‚ด์˜ setInterval์€ count๊ฐ€ 0์ธ ์ƒํƒœ์—์„œ +1์„ ๊ณ„์† ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ๋งค ์ˆœ๊ฐ„์ˆœ๊ฐ„ ๊ฐฑ์‹ ๋œ count๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ 1์ด ์ฆ๊ฐ€ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ state ๊ฐ’์„ ๊ณ ๋ คํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ setCount(curr => curr+1); ๋ผ๊ณ  ํ•ด์ค˜์•ผ ์นด์šดํŠธ๊ฐ€ ๊ณ„์† ์ฆ๊ฐ€๋œ๋‹ค.

์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ Effect

const App = () => {
  const [num, setNum] = useState(0);
  const [count, setCount] = useState(0);

  const handleClick = () => {
    setNum(curr => curr + 1);
  }
  
  useEffect(() => {
    setCount(num);
  }, [num]);
  
  return (
    <div>
      <p>๋ฒ„ํŠผ {count}๋ฒˆ ๋ˆ„๋ฆ„</p>
      <button onClick={handleClick}>๋ฒ„ํŠผ</button>
    </div>
  )
}

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ๋•Œ๋งˆ๋‹ค ํ™”๋ฉด์— ๋‚˜์˜ค๋Š” "๋ฒ„ํŠผ n๋ฒˆ ๋ˆ„๋ฆ„" ํ…์ŠคํŠธ์˜ n์ด 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ํ•˜์ฐฎ์€ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.
side effect ์ ์ธ ๋‚ด์šฉ์€ ์•„๋‹ˆ์ง€๋งŒ ์„ค๋ช…์šฉ์œผ๋กœ ๊ทธ๋ƒฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ฌ...

๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด num์ด 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š”๋ฐ, useEffect์˜ Deps ๋ฐฐ์—ด์— ์ด num์„ ๋„ฃ์œผ๋ฉด num์ด ์ƒํƒœ๊ฐ€ ๋ณ€ํ• ๋•Œ๋งˆ๋‹ค useEffect์˜ Callback์ด ์‹คํ–‰๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ num์˜ ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋ฉด setCount(num)์ด ์‹คํ–‰๋˜์–ด count์˜ ๊ฐ’๋„ num๊ฐ’๊ณผ ๊ฐ™์•„์ง€๊ฒŒ ๋˜๋ฏ€๋กœ "๋ฒ„ํŠผ n๋ฒˆ ๋ˆ„๋ฆ„" ์˜ n์— ๋ฐ˜์˜์ด ๋˜๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์–ด๋– ํ•œ state๊ฐ€ ๋ณ€ํ• ๋•Œ ์‹คํ–‰์‹œํ‚ฌ ๋กœ์ง์„ ์ •์˜ํ•˜๋Š” ์šฉ๋„๋กœ ์“ฐ๋ ค๋ฉด Deps ๋ฐฐ์—ด์— ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•  ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

clean-up ํ•จ์ˆ˜

useEffect์˜ Callback์—์„œ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ unmount ๋  ๋•Œ ์‹คํ–‰๋œ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ mount, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์ง€๋Š”๊ฒƒ(๋ฆฌ๋ Œ๋”๋ง ๋˜๊ธฐ ์ง์ „)์„ unmount๋ผ๊ณ  ํ•œ๋‹ค.

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๊ธฐ ์œ„ํ•ด unmount๊ฐ€ ๋  ๋•Œ Callback ํ•จ์ˆ˜์—์„œ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ ์ด ํ•จ์ˆ˜๋ฅผ clean-up ํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ธ€๋กœ๋งŒ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋‹ˆ ์ด๊ฒƒ๋„ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

function App() {
  const [render, setRender] = useState(true);

  console.log(render);

  useEffect(() => {
    console.log("์นด์šดํŠธ ์‹œ์ž‘!");
    return () => {console.log("์นด์šดํŠธ ์ข…๋ฃŒ!")}
  })

  const handleClick = () => {
    setRender(curr => !curr);
  }
  
  return (
    <div className="App">
      <button onClick={handleClick}>๋ฆฌ๋ Œ๋”๋ง</button>
    </div>
  );
}

Deps๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์˜ ์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ useEffect์— clean-up ํ•จ์ˆ˜๋งŒ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ์ด๋‹ค.

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๊ธฐ ์œ„ํ•ด unmount๊ฐ€ ๋  ๋•Œ Callback ํ•จ์ˆ˜์—์„œ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋Š” ์‚ฌ์‹ค์— ์ฃผ๋ชฉํ•˜๋ฉฐ ์–ด๋–ค ์ˆœ์„œ๋กœ ์ฝ˜์†”์ด ์ถœ๋ ฅ๋ ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž.

์ฒ˜์Œ ๋ Œ๋”๋ง ๋˜๋ฉด 3๋ฒˆ์งธ์ค„ console.log(render)์— ์˜ํ•ด ์ฝ˜์†”์ฐฝ์— true๊ฐ€ ๋‚˜์˜ค๊ณ  "์นด์šดํŠธ ์‹œ์ž‘!"์ด ์ถœ๋ ฅ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋ฉด ์ผ๋‹จ ์ปดํฌ๋„ŒํŠธ๊ฐ€ unmount๋“œ ๋˜๋‹ˆ ๊ทธ๋•Œ "์นด์šดํŠธ ์ข…๋ฃŒ!"๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ , ๊ณง๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๊ฐ€ mount๋˜๋ฉด ๋ฐ˜์ „๋œ render๊ฐ’์ธ false๊ฐ€ ๋‚˜์˜ค๊ณ  "์นด์šดํŠธ ์‹œ์ž‘!"์ด ๋‚˜์˜ฌ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฐ ํ๋ฆ„์œผ๋กœ, ๋ฒ„ํŠผ์„ ๊ณ„์† ๋ˆ„๋ฅด๋ฉด ์ฝ˜์†”์ฐฝ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋ ๊ฒƒ์ด๋‹ค.

true -> ์นด์šดํŠธ ์‹œ์ž‘! -> ์นด์šดํŠธ ์ข…๋ฃŒ! -> false -> ์นด์šดํŠธ ์‹œ์ž‘! -> ์นด์šดํŠธ ์ข…๋ฃŒ! -> true -> ...

๊ทผ๋ฐ ์‹ค์ œ๋กœ ํ•ด๋ณด๋ฉด ์‚ด์ง ๋‹ค๋ฅด๋‹ค.

์Œ..

๋ถ„๋ช… ์ปดํฌ๋„ŒํŠธ๊ฐ€ unmount๋  ๋•Œ clean-up ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜์–ด ํ•จ์ˆ˜ ๋กœ์ง์ด ์‹คํ–‰๋˜๋Š”๊ฒŒ ๋งž๋‹ค๋ฉด ์ฝ˜์†”์ฐฝ์—๋Š” '์นด์šดํŠธ ์‹œ์ž‘!' ๋‹ค์Œ์—” '์นด์šดํŠธ ์ข…๋ฃŒ!'๊ฐ€ ๋จผ์ € ๋‚˜์™€์•ผ ํ•˜๋Š”๋ฐ ์ƒˆ๋กœ์šด render๊ฐ’์ด ๋จผ์ € ๋‚˜์˜ค๊ณ ์žˆ๋‹ค.

์‚ฌ์‹ค clean-up ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ unmount๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜๋Š” ๋งž์ง€๋งŒ, ์ •ํ™•ํžˆ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ unmount ๋˜๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜๊ณ  ๋‚˜์„œ useEffect ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ง์ „์— ์‹คํ–‰๋œ๋‹ค.

์ฆ‰ ์ •ํ™•ํ•œ ์ˆœ์„œ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง(unmount -> mount)๋  ๋•Œ

  1. ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ unmount
  2. ์ƒˆ ์ปดํฌ๋„ŒํŠธ mount
  3. ๊ธฐ์กด effect์˜ clean-up ํ•จ์ˆ˜ ์‹คํ–‰
  4. ์ƒˆ๋กœ์šด effect ์‹คํ–‰(useEffect์˜ Callback ์‹คํ–‰)

์˜ ์ˆœ์„œ์ธ ๊ฒƒ์ด๋‹ค.

์•„๊นŒ ์ฒ˜์Œ ์˜ˆ์ƒํ•œ ์ˆœ์„œ๋Š” 1324์ธ ๊ฒฝ์šฐ์˜ ์–˜๊ธฐ์˜€๊ณ  ์‹ค์ œ๋กœ๋Š” 1324๊ฐ€ ์•„๋‹ˆ๋ผ 1234์˜€๋˜๊ฒƒ!

๊ทธ๋ž˜์„œ useEffect ์ „์˜ ๋กœ์ง์ธ console.log(render)๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์ƒˆ๋กœ์šด useEffect๊ฐ€ ์‹คํ–‰๋ ๋•Œ ์ „์˜ useEffect์˜ clean-up ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ๋’ค ์ƒˆ๋กœ์šด useEffect๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

clean-up ํ•จ์ˆ˜ ์™œ์”€?

clean-up ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ setInterval์„ ์‚ฌ์šฉํ•˜๋Š” useEffect๊ฐ€ ์žˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋ ๋•Œ๋งˆ๋‹ค useEffect๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋ฉด ์œ„์˜ side effect ํŒŒํŠธ์—์„œ ๋ดค๋˜ setInterval์˜ ์ค‘์ฒฉ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ์ด๋•Œ clean-up ํ•จ์ˆ˜๋กœ clearInterval ๋กœ์ง์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ ๊ธฐ์กด์˜ setInterval์„ clear ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ ์‹คํ–‰๋˜๋Š” useEffect์˜ setInterval ๋กœ์ง์ด ์ค‘์ฒฉ๋  ์ผ์ด ์—†๋‹ค.

์ด์ฒ˜๋Ÿผ clean-up ์ด๋ผ๋Š” ์ด๋ฆ„๋Œ€๋กœ, ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง ์‹œ ๊ธฐ์กด useEffect์˜ ๋กœ์ง์„ ํ™•์‹คํžˆ ๋๋‚ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ์„๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.


useEffect๋Š” ์•Œ๊ณ ์žˆ๋Š” ๊ฐœ๋…์ด๋ผ ์ •๋ฆฌ๊ฐ€ ์–ผ๋งˆ ์•ˆ๊ฑธ๋ฆด์ค„ ์•Œ์•˜๋Š”๋ฐ.. ์ •๋ฆฌํ•˜๋‹ค๋ณด๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค ์ž˜ ๋ชฐ๋ž๋˜ ๋ถ€๋ถ„์ด ๋งŽ์•„์„œ ์ด๊ฒƒ์ €๊ฒƒ ์ฐพ์•„๋ณด๋ฉด์„œ ์ •๋ฆฌํ•˜๋‹ค๋ณด๋‹ˆ ๊ต‰์žฅํžˆ ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค ใ… 
์—„์ฒญ ๊นŠ๊ฒŒ ํŒ๊ฒƒ๋„ ์•„๋‹Œ๊ฑฐ๊ฐ™์€๋ฐ..
์—ญ์‹œ ์ •ํ™•ํžˆ ์•„๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„ค๋ช…ํ•˜๋“ฏ์ด ์ •๋ฆฌํ•œ๋ฒˆ ํ•ด๋ณด๋Š”๊ฒŒ ์ตœ๊ณ ์ธ๋“ฏ ๐Ÿ‘

์–ด์จŒ๋“  ์ •๋ฆฌํ•˜๋‹ค๋ณด๋‹ˆ ์žฅํ™ฉํ•ด์กŒ๋Š”๋ฐ ์•”ํŠผ ๊ฒฐ๋ก !

useEffect์˜ ํšจ๋Šฅ

  • ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ• ์ง€ ๋ชจ๋ฅด๋Š” side effect๊ฐ™์€ ๋†ˆ๋“ค์„ ๊ฒฉ๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค
  • ๊ฒฉ๋ฆฌ์‹œํ‚จ side effect๋ฅผ ์›ํ•˜๋Š” ํƒ€์ด๋ฐ์— ์‹คํ–‰๋˜๋„๋ก ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค
  • clean-up ํ•จ์ˆ˜๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋‚˜ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณผ๋ถ€ํ•˜๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค





์ฐธ๊ณ  ์ž๋ฃŒ

https://points.tistory.com/86
https://choar816.tistory.com/163#google_vignette
https://simsimjae.tistory.com/401

profile
์–ธ์ œ๊นŒ์ง€_์ด๋ ‡๊ฒŒ_์‚ด์•„์•ผ๋ผ_

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

comment-user-thumbnail
2023๋…„ 8์›” 5์ผ

์ฆ๊ฒ๊ฒŒ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ์šฉํ•œ ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€