[๐ŸŽ์ฝ”๋”ฉ์• ํ”Œ ๊ฐ•์˜์š”์•ฝ] Lifecycle๊ณผ useEffect 2 โšก

๐ŸŒˆ KJยท2025๋…„ 6์›” 13์ผ

codingapple

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

Lifecycle๊ณผ useEffect 2 โšก

์ €๋ฒˆ์‹œ๊ฐ„ ์ˆ™์ œ ํ•ด๊ฒฐ ๐Ÿ“

Detail ํŽ˜์ด์ง€์—์„œ 2์ดˆ ํ›„ ๋ฐ•์Šค๊ฐ€ ์‚ฌ๋ผ์ง€๊ฒŒ ๋งŒ๋“ค๊ธฐ ๐Ÿ•

๋™์ ์ธ UI ๋งŒ๋“ค ๋•Œ์˜ ๊ธฐ๋ณธ ์›์น™:
1. UI ์ƒํƒœ๋ฅผ ์ €์žฅํ•  state ๋งŒ๋“ค๊ธฐ ๐Ÿ”ง
2. state์— ๋”ฐ๋ผ UI๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€ ์ž‘์„ฑํ•˜๊ธฐ ๐ŸŽจ

function Detail(){
  let [alert, setAlert] = useState(true)

  useEffect(()=>{
    setTimeout(()=>{ setAlert(false) }, 2000)
  }, [])

  return (
    {
      alert == true
      ? <div className="alert alert-warning">
          2์ดˆ์ด๋‚ด ๊ตฌ๋งค์‹œ ํ• ์ธ
        </div>
      : null
    }
  )
}
  • alert state๊ฐ€ true๋ฉด ๋…ธ๋ž€๋ฐ•์Šค ๋ณด์ž„ โœ…
  • false๋ฉด ์•ˆ๋ณด์ž„ โŒ
  • useEffect์™€ setTimeout์œผ๋กœ 2์ดˆ ํ›„ ์ž๋™ ์ˆจ๊น€ ์ฒ˜๋ฆฌ โฐ

useEffect ์‹คํ–‰์กฐ๊ฑด ์ œ์–ดํ•˜๊ธฐ ๐ŸŽฏ

ํŠน์ • ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ ์‹œ์—๋งŒ ์‹คํ–‰ ๐Ÿ”„

useEffect(()=>{ 
  ์‹คํ–‰ํ• ์ฝ”๋“œ 
}, [count])
  • ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์— [๋ณ€์ˆ˜๋ช…] ํ˜•ํƒœ๋กœ ์กฐ๊ฑด ์„ค์ • ๐Ÿ“‹
  • count ๋ณ€์ˆ˜๊ฐ€ ๋ณ€ํ•  ๋•Œ๋งŒ useEffect ์‹คํ–‰ ๐ŸŽช
  • ๋ฐฐ์—ด ์•ˆ์— ์—ฌ๋Ÿฌ ๊ฐœ state ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ ๐Ÿงฎ

์ปดํฌ๋„ŒํŠธ ๋กœ๋“œ ์‹œ 1ํšŒ๋งŒ ์‹คํ–‰ ๐Ÿš€

useEffect(()=>{ 
  ์‹คํ–‰ํ• ์ฝ”๋“œ 
}, [])
  • ๋นˆ ๋ฐฐ์—ด [] ์‚ฌ์šฉ ์‹œ ์ปดํฌ๋„ŒํŠธ mount ์‹œ 1ํšŒ๋งŒ ์‹คํ–‰ ๐ŸŽฏ
  • ํŽ˜์ด์ง€ ๋กœ๋“œ ํ›„ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ ๐Ÿ’ซ

Clean up function ๐Ÿงน

๊ธฐ๋ณธ ๊ฐœ๋… ๐Ÿ’ก

useEffect(()=>{ 
  ๊ทธ ๋‹ค์Œ ์‹คํ–‰๋จ 
  return ()=>{
    ์—ฌ๊ธฐ์žˆ๋Š”๊ฒŒ ๋จผ์ €์‹คํ–‰๋จ
  }
}, [count])
  • return ์•ˆ์˜ ํ•จ์ˆ˜๊ฐ€ useEffect ์‹คํ–‰ ์ „์— ๋จผ์ € ์‹คํ–‰๋จ โšก
  • "์ฑ…์ƒ์„ ์‹น ์น˜์šฐ๊ณ  ์‹œ์ž‘"ํ•˜๋Š” ๊ฐœ๋…๊ณผ ๊ฐ™์Œ ๐Ÿงฝ
  • clean up function์ด๋ผ๊ณ  ๋ถ€๋ฆ„ ๐Ÿท๏ธ

์‹ค์ œ ์‚ฌ์šฉ ์˜ˆ์‹œ - ํƒ€์ด๋จธ ์ •๋ฆฌ โฒ๏ธ

useEffect(()=>{ 
  let a = setTimeout(()=>{ setAlert(false) }, 2000)
  return ()=>{
    clearTimeout(a)
  }
}, [])

์™œ ํ•„์š”ํ•œ๊ฐ€? ๐Ÿค”

  • setTimeout ์‚ฌ์šฉ ์‹œ๋งˆ๋‹ค ๋ธŒ๋ผ์šฐ์ €์— ํƒ€์ด๋จธ ์ƒ์„ฑ ๐Ÿ“Š
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ mount๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜์–ด ํƒ€์ด๋จธ๊ฐ€ ๊ณ„์† ์Œ“์ž„ ๐Ÿ“ˆ
  • ํƒ€์ด๋จธ 100๊ฐœ, 1000๊ฐœ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฒ„๊ทธ ๋ฐฉ์ง€ ๐Ÿšซ
  • clearTimeout()์œผ๋กœ ๊ธฐ์กด ํƒ€์ด๋จธ ์ œ๊ฑฐ ํ›„ ์ƒˆ ํƒ€์ด๋จธ ์ƒ์„ฑ โ™ป๏ธ

Clean up function ์ฃผ์š” ์šฉ๋„:

  • ํƒ€์ด๋จธ ์ œ๊ฑฐ โฐ
  • Socket ์—ฐ๊ฒฐ ์š”์ฒญ ์ œ๊ฑฐ ๐Ÿ”Œ
  • Ajax ์š”์ฒญ ์ค‘๋‹จ ๐ŸŒ
  • ์ปดํฌ๋„ŒํŠธ unmount ์‹œ์—๋„ 1ํšŒ ์‹คํ–‰๋จ ๐Ÿ“ค

๋นกํ†ต์‹ ์ •๋ฆฌ - useEffect ์‚ฌ์šฉ๋ฒ• ๐Ÿ“š

1. ์žฌ๋ Œ๋”๋ง๋งˆ๋‹ค ์‹คํ–‰ ๐Ÿ”„

useEffect(()=>{ ์‹คํ–‰ํ• ์ฝ”๋“œ })

2. ์ปดํฌ๋„ŒํŠธ ๋กœ๋“œ ์‹œ 1ํšŒ๋งŒ ์‹คํ–‰ ๐ŸŽฏ

useEffect(()=>{ ์‹คํ–‰ํ• ์ฝ”๋“œ }, [])

3. useEffect ์‹คํ–‰ ์ „ ํ•ญ์ƒ ์‹คํ–‰ ๐Ÿงน

useEffect(()=>{ 
  return ()=>{
    ์‹คํ–‰ํ• ์ฝ”๋“œ
  }
})

4. ์ปดํฌ๋„ŒํŠธ ์ œ๊ฑฐ ์‹œ 1ํšŒ ์‹คํ–‰ ๐Ÿ“ค

useEffect(()=>{ 
  return ()=>{
    ์‹คํ–‰ํ• ์ฝ”๋“œ
  }
}, [])

5. ํŠน์ • state ๋ณ€๊ฒฝ ์‹œ์—๋งŒ ์‹คํ–‰ ๐ŸŽช

useEffect(()=>{ 
  ์‹คํ–‰ํ• ์ฝ”๋“œ
}, [state1])

์˜ค๋Š˜์˜ ์ˆ™์ œ ๐Ÿ“‹

input์—์„œ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฐ’ ์ž…๋ ฅ ์‹œ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅํ•˜๊ธฐ โš ๏ธ

  • <input> ํ•˜๋‚˜ ๋งŒ๋“ค๊ธฐ ๐Ÿ“
  • ์œ ์ €๊ฐ€ ์ˆซ์ž ๋ง๊ณ  ๋‹ค๋ฅธ ๊ฐ’ ์ž…๋ ฅ ์‹œ "๊ทธ๋Ÿฌ์ง€๋งˆ์„ธ์š”" ์ถœ๋ ฅ ๐Ÿ’ฌ
  • useEffect ํ™œ์šฉํ•ด๋ณด๊ธฐ ๐ŸŽฏ
  • ๋ชจ๋ฅด๋Š” ๊ฑด ๊ฒ€์ƒ‰ํ•ด์„œ ํ•ด๊ฒฐํ•˜๊ธฐ ๐Ÿ”

์ถ”๊ฐ€ ์ •๋ณด ๋ฐ ํŒ ๐Ÿ’ก

useEffect์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด ์‹ฌํ™” ๐Ÿง 

// ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜์กด์„ฑ
useEffect(()=>{
  console.log('name ๋˜๋Š” age๊ฐ€ ๋ณ€๊ฒฝ๋จ')
}, [name, age])

// ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ์˜์กด์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜์ 
const user = {name: 'John', age: 25}
useEffect(()=>{
  // ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋จ
}, [user]) // ์ฃผ์˜: ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ผ๋ฉด ๊ณ„์† ์‹คํ–‰๋จ

์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ useEffect ํŒจํ„ด โšก

// debounce ํŒจํ„ด์œผ๋กœ API ํ˜ธ์ถœ ์ตœ์ ํ™”
useEffect(()=>{
  const timer = setTimeout(()=>{
    // API ํ˜ธ์ถœ
    fetchSearchResults(searchTerm)
  }, 500)
  
  return ()=> clearTimeout(timer)
}, [searchTerm])

useEffect vs useLayoutEffect ์ฐจ์ด์  ๐Ÿ”

// useEffect: ๋น„๋™๊ธฐ์  ์‹คํ–‰ (ํ™”๋ฉด ๋ Œ๋”๋ง ํ›„)
useEffect(()=>{
  // DOM ์—…๋ฐ์ดํŠธ ํ›„ ์‹คํ–‰
})

// useLayoutEffect: ๋™๊ธฐ์  ์‹คํ–‰ (ํ™”๋ฉด ๋ Œ๋”๋ง ์ „)
import { useLayoutEffect } from 'react'
useLayoutEffect(()=>{
  // DOM ์—…๋ฐ์ดํŠธ ์ „ ์‹คํ–‰ (๊นœ๋นก์ž„ ๋ฐฉ์ง€)
})

Clean up function ๊ณ ๊ธ‰ ํ™œ์šฉ ๐Ÿ”ง

useEffect(()=>{
  // ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก
  const handleScroll = () => {
    console.log('์Šคํฌ๋กค ์ค‘...')
  }
  
  window.addEventListener('scroll', handleScroll)
  
  // ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ •๋ฆฌ
  return () => {
    window.removeEventListener('scroll', handleScroll)
  }
}, [])

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ํ•„์ˆ˜ ํŒจํ„ด ๐Ÿ›ก๏ธ

  • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ๋ฐ˜๋“œ์‹œ ์ œ๊ฑฐํ•ด์•ผ ํ•จ ๐Ÿ—‘๏ธ
  • API ์š”์ฒญ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ ์ทจ์†Œํ•ด์•ผ ํ•จ โŒ
  • ํƒ€์ด๋จธ๋‚˜ ์ธํ„ฐ๋ฒŒ์€ ์ •๋ฆฌํ•ด์•ผ ํ•จ โฐ

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