๐Ÿงฌ 27. React ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ์™„์ „ ์ •๋ฆฌ โ€” useEffect๋กœ lifecycle์„ ์ดํ•ดํ•˜์ž

JM_Devยท2025๋…„ 5์›” 6์ผ
0
post-thumbnail

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์“ธ ๋• ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ช…ํ™•ํ–ˆ๋‹ค.

  • componentDidMount
  • componentDidUpdate
  • componentWillUnmount

๊ทธ๋Ÿฐ๋ฐ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useEffect, useLayoutEffect, useRef ๋“ฑ์ด
๊ทธ ์—ญํ• ์„ ๋‚˜๋ˆ ์„œ ํ•˜๊ณ  ์žˆ์–ด์„œ ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์€ React ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ํ๋ฆ„์„
ํด๋ž˜์Šคํ˜• ๋ฉ”์„œ๋“œ ๊ธฐ์ค€์œผ๋กœ ๋งตํ•‘ํ•ด์„œ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค.


๐Ÿ” ์ƒ๋ช…์ฃผ๊ธฐ ํ๋ฆ„ ์š”์•ฝ

(์ปดํฌ๋„ŒํŠธ ์ตœ์ดˆ ๋ Œ๋”๋ง)
โ†’ useEffect (Mount ์‹œ ์‹คํ–‰)
โ†’ ์ƒํƒœ ๋ณ€๊ฒฝ โ†’ Re-render
โ†’ useEffect (Update ์‹œ ์‹คํ–‰)
โ†’ ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ ์‹œ โ†’ Clean-up ํ•จ์ˆ˜ ์‹คํ–‰

โœ… ๋งˆ์šดํŠธ: ์ฒ˜์Œ ๋ Œ๋”๋ง๋  ๋•Œ๋งŒ ์‹คํ–‰

useEffect(() => {
  console.log('์ฒ˜์Œ ๋ Œ๋”๋ง ์‹œ ์‹คํ–‰๋จ');
}, []);

๐Ÿ“Œ ์ด๊ฑด ํด๋ž˜์Šคํ˜•์˜ componentDidMount์™€ ๊ฐ™๋‹ค.

  • ๋น„๋™๊ธฐ API ์š”์ฒญ
  • ๊ตฌ๋… ์‹œ์ž‘
  • ์ดˆ๊ธฐํ™” ์ž‘์—…

โœ… ์—…๋ฐ์ดํŠธ: ์ƒํƒœ๋‚˜ props๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์‹คํ–‰

useEffect(() => {
  console.log('์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์‹คํ–‰๋จ');
}, [someState]);

๐Ÿ“Œ ํด๋ž˜์Šคํ˜•์˜ componentDidUpdate์— ํ•ด๋‹นํ•œ๋‹ค.

  • ํŠน์ • ์ƒํƒœ ๋ณ€ํ™” ๊ฐ์ง€
  • ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ์ž‘
  • ์กฐ๊ฑด๋ถ€ fetch

โœ… ์–ธ๋งˆ์šดํŠธ: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ ์‹คํ–‰

useEffect(() => {
  return () => {
    console.log('์–ธ๋งˆ์šดํŠธ ์‹œ ์‹คํ–‰๋จ');
  };
}, []);

๐Ÿ“Œ ํด๋ž˜์Šคํ˜•์˜ componentWillUnmount์™€ ๊ฐ™๋‹ค.

  • ๊ตฌ๋… ํ•ด์ œ
  • ํƒ€์ด๋จธ ์ •๋ฆฌ
  • ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ

๐Ÿ” useRef๋กœ ๋งˆ์šดํŠธ ์—ฌ๋ถ€ ํ™•์ธ

const isMounted = useRef(false);

useEffect(() => {
  if (isMounted.current) {
    console.log('์—…๋ฐ์ดํŠธ์ž…๋‹ˆ๋‹ค!');
  } else {
    isMounted.current = true;
  }
}, [someValue]);

โœ… ์ด ํŒจํ„ด์€ ์ตœ์ดˆ ๋ Œ๋”๋ง์„ ์ œ์™ธํ•˜๊ณ ,
๊ทธ ์ดํ›„์˜ ์—…๋ฐ์ดํŠธ์—์„œ๋งŒ ์‹คํ–‰๋˜๋„๋ก ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿง  ์ƒ๋ช…์ฃผ๊ธฐ ๋น„๊ตํ‘œ

ํด๋ž˜์Šคํ˜• ๋ฉ”์„œ๋“œํ•จ์ˆ˜ํ˜• ๋Œ€์ฒด ๋ฐฉ์‹
componentDidMountuseEffect(() => {}, [])
componentDidUpdateuseEffect(() => {}, [dep])
componentWillUnmountuseEffect์˜ return ํ•จ์ˆ˜
shouldComponentUpdateReact.memo, useMemo ๋“ฑ

โœ… ์‹ค๋ฌด ํŒ

  • ๋ณต์žกํ•œ useEffect๋Š” ๋‚˜๋ˆ ์„œ ์“ฐ๋Š” ๊ฒŒ ๊ฐ€๋…์„ฑ์— ์ข‹๋‹ค
  • useLayoutEffect๋Š” ๋งˆ์šดํŠธ ํƒ€์ด๋ฐ์ด ๋‹ค๋ฅด๋ฏ€๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋งŒ ์‚ฌ์šฉ
  • ๋ Œ๋”๋ง ์‚ฌ์ดํด์„ ๋””๋ฒ„๊น…ํ•˜๋ ค๋ฉด console.log๋กœ ํƒ€์ด๋ฐ์„ ์ฒดํฌํ•˜๋Š” ๊ฒŒ ์œ ์šฉ

๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

์ฒ˜์Œ์—๋Š” useEffect ํ•˜๋‚˜๋กœ ๋ชจ๋“  ๊ฑธ ์ฒ˜๋ฆฌํ•˜๋‹ˆ๊นŒ ์ง๊ด€์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ปค์ง€๋‹ˆ๊นŒ "์ด๊ฑด ๋งˆ์šดํŠธ์šฉ์ธ๊ฐ€? ์—…๋ฐ์ดํŠธ์šฉ์ธ๊ฐ€?"
ํ—ท๊ฐˆ๋ฆฌ๋Š” ์ผ์ด ๋งŽ์•„์กŒ๊ณ , ๊ทธ๋•Œ๋ถ€ํ„ฐ ์˜์‹์ ์œผ๋กœ ์ƒ๋ช…์ฃผ๊ธฐ์ฒ˜๋Ÿผ ๊ตฌ์กฐ๋ฅผ ๋‚˜๋ˆ„๊ฒŒ ๋๋‹ค.

์ด์ œ๋Š” useEffect, useRef, React.memo, useCallback ๋“ฑ์„
"์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ชผ๊ฐœ์„œ ์ œ์–ดํ•˜๋Š” ๋„๊ตฌ"์ฒ˜๋Ÿผ ์“ฐ๊ณ  ์žˆ๋‹ค.


๐Ÿงฌ "์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ดํ•ดํ•˜๋ฉด, React์˜ ๋ชจ๋“  ํ๋ฆ„์ด ๋ˆˆ์— ๋“ค์–ด์˜จ๋‹ค."


profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

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