[React, React Native] Lifecycle ๋ฐ useEffect

2023. 8. 20. 20:48ใ†Study_Develop/React Native

๋ฐ˜์‘ํ˜•

React์™€ React Native๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•œ Lifecycle, useEffect๋ฅผ ๊ณต๋ถ€ํ•ด๋ณด์ž.

 

 

์‰ฝ๊ฒŒ ๋งํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ œ๊ฑฐ๋  ๋•Œ ํŠน์ • ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Lifecycle์ด๋‹ค.

 

์ปดํฌ๋„ŒํŠธ์˜ ์ธ์ƒ์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ์‰ฝ๋‹ค.

 

ํŽ˜์ด์ง€์— ์žฅ์ฐฉ๋˜๊ฑฐ๋‚˜ (mount), ์—…๋ฐ์ดํŠธ ๋˜๊ฑฐ๋‚˜(update), ํ•„์š”์—†์œผ๋ฉด ์ œ๊ฑฐ๋˜๊ฑฐ๋‚˜ (unmount)

 

LifeCycle ๋ž€?

 

 

์œ„์˜ ๊ทธ๋ฆผ์€ ํฌ๊ฒŒ4๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Mount : ์ปดํฌ๋„ŒํŠธ ์ฒ˜์Œ ์‹คํ–‰์‹œ์ผฐ์„ ๋•Œ์˜ ์ƒํƒœ

 

state, props, context ์ €์žฅ -> componentWillMount()-> render() -> componentDidMount() (์ฃผ๋กœ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ ์š”์ฒญ)

 

Update- prop : props๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ

 

componentWillRecieveProps() (props๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๊ฐ์ง€) → shouldComponentUpdate() ( component ์—…๋ฐ์ดํŠธ ํ•  ๊บผ์•ผ?) 

→ componentWillUpdate() (component๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ) → render() → compoentDidUpdate() (component ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋œ ํ›„)

 

Update -state : State๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ

*Props์™€ ์ฐจ์ด์ ์€ componentWillRecieveProps์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค

๋ฉ”์†Œ๋“œ๋“ค์ด ๋ฐ”๋€” state์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ  componentDidUpdate๋Š” ๋ฐ”๋€Œ๊ธฐ ์ „์˜ state๋ฅผ ๊ฐ–๊ณ  ์žˆ์Œ

 
 shouldComponentUpdate()  → componentWillUpdate() → render() → compoentDidUpdate()

 

Unmount : ์ปดํฌ๋„ŒํŠธ ์ œ๊ฑฐ ๋  ๋•Œ

 

Error : ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ

 

์„œ๋ฒ„ ํ†ต์‹ ์— ์‹คํŒจํ–ˆ์„ ๋•Œ ์—๋Ÿฌ ํŽ˜์ด์ง€ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ

 

 

Lifecycle hook ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

 

import {useState, useEffect} from 'react';

function LifeCycleHook(){

  useEffect(()=>{
    //์—ฌ๊ธฐ์ ์€ ์ฝ”๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ ๋กœ๋“œ & ์—…๋ฐ์ดํŠธ ๋งˆ๋‹ค ์‹คํ–‰๋จ
    console.log('์•ˆ๋…•')
  });
  
  return (์ƒ๋žต)
}

 

๋Œ€๋žต์ ์ธ ํ˜•ํƒœ์ด๋‹ค.

 

์ƒ๋‹จ์—์„œ useEffect importํ•ด์˜ค๊ณ ,

์ฝœ๋ฐฑํ•จ์ˆ˜ ์ถ”๊ฐ€ํ•ด์„œ ์•ˆ์— ์ฝ”๋“œ ์ ์œผ๋ฉด ์ด์ œ ๊ทธ ์ฝ”๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ mount & update์‹œ ์‹คํ–‰๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๊ฒŒ Lifecycle hook ์ด๋‹ค.

 

useEffect ํŠน์ง•

 

- useEffect ๋ฐ”๊ฐ™์— ์ ์–ด๋„ ๋˜‘๊ฐ™์ด ์ปดํฌ๋„ŒํŠธ mount & update์‹œ ์‹คํ–‰์ด ๋œ๋‹ค.

( ์ปดํฌ๋„ŒํŠธ๊ฐ€ mount & update์‹œ functon ์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๋„ ๋‹ค์‹œ ์ฝ๊ณ  ์ง€๋‚˜๊ฐ€์„œ ๊ทธ๋ ‡๋‹ค.)

 

- useEffect ์•ˆ์— ์ ์€ ์ฝ”๋“œ๋Š” html ๋ Œ๋”๋ง ์ดํ›„์— ๋™์ž‘์„ ํ•œ๋‹ค.

 

- ์˜ˆ๋ฅผ ๋“ค์–ด, ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์“ธ๋ฐ ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด?

 

function Detail(){

  (๋ฐ˜๋ณต๋ฌธ 10์–ต๋ฒˆ ๋Œ๋ฆฌ๋Š” ์ฝ”๋“œ)
  return (์ƒ๋žต)
}

 

-> ์—ฌ๊ธฐ์— ๋Œ€์ถฉ ์ ์œผ๋ฉด ๋ฐ˜๋ณต๋ฌธ ๋Œ๋ฆฌ๊ณ  ๋‚˜์„œ ํ•˜๋‹จ์˜ html์„ ๋ณด์—ฌ์ค€๋‹ค.

 

function Detail(){

  useEffect(()=>{
    (๋ฐ˜๋ณต๋ฌธ 10์–ต๋ฒˆ ๋Œ๋ฆฌ๋Š” ์ฝ”๋“œ)
  });
  
  return (์ƒ๋žต)
}

 

 -> useEffect์•ˆ์— ์ ์œผ๋ฉด html ๋ณด์—ฌ์ฃผ๊ณ  ๋‚˜์„œ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฐ๋‹ค.

 

- ์ด๋Ÿฐ์‹์œผ๋กœ ์ฝ”๋“œ์˜ ์‹คํ–‰ ์‹œ์ ์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค.

 

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

 

useEffect์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์‹คํ–‰์กฐ๊ฑด

 

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

 

useEffect()์˜ ๋‘˜์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ [ ]๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ฑฐ๊ธฐ์— ๋ณ€์ˆ˜๋‚˜ state๊ฐ™์€ ๊ฒƒ๋“ค์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด [ ]์— ์žˆ๋Š” ๋ณ€์ˆ˜๋‚˜ state๊ฐ€ ๋ณ€ํ•  ๋•Œ๋งŒ useEffect ์•ˆ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์ค€๋‹ค.

 

์œ„์˜ ์ฝ”๋“œ๋Š” count๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋ณ€ํ•  ๋•Œ๋งŒ useEffect์•ˆ์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 

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

 

์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋„ฃ์œผ๋ฉด ์ปดํฌ๋„ŒํŠธ mount์‹œ (๋กœ๋“œ์‹œ) 1ํšŒ ์‹คํ–‰ํ•˜๊ณ  ์˜์˜์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

 

useEffect(()=>{ 
  ๊ทธ ๋‹ค์Œ ์‹คํ–‰๋จ 
  return ()=>{
    ์—ฌ๊ธฐ์žˆ๋Š”๊ฒŒ ๋จผ์ €์‹คํ–‰๋จ
  }
}, [count])

 

๊ทธ๋Ÿผ useEffect ์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— return ()=> {}์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

 

์ฐธ๊ณ ๋กœ ์ด๋Ÿฐ ๊ฒƒ์„ clean up function์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

clean up function์ด ์™œ ์ƒ๊ฒผ๋ƒ?

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด setTimeout ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์—์„œ

setTimeout() ์“ธ ๋•Œ๋งˆ๋‹ค ๋ธŒ๋ผ์šฐ์ € ์•ˆ์— ํƒ€์ด๋จธ๊ฐ€ ํ•˜๋‚˜ ์ƒ๊ธด๋‹ค.

 

๊ทธ๋Ÿผ useEffect์•ˆ์— ์ป๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ๊ฐ€ mount๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

 

๊ทธ๋Ÿผ ์ž˜๋ชป ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ํƒ€์ด๋จธ๊ฐ€ 100๊ฐœ 1000๊ฐœ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

 

๋‚˜์ค‘์— ๊ทธ๋Ÿฐ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ถ์œผ๋ฉดuseEffect์—์„œ ํƒ€์ด๋จธ ๋งŒ๋“ค๊ธฐ ์ „์— ๊ธฐ์กด ํƒ€์ด๋จธ๋ฅผ ์‹น ์ œ๊ฑฐํ•˜๋ผ๊ณ  ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ๋˜๋Š”๋ฐ

๊ทธ๋Ÿฐ๊ฑฐ ์งค ๋•Œ return ()=>{} ์•ˆ์— ์งœ๋ฉด ๋œ๋‹ค.

 

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

 

์ด๋Ÿฐ ์‹์œผ๋กœ ํƒ€์ด๋จธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค!

 

 

โ—clean up function์—๋Š” ํƒ€์ด๋จธ ์ œ๊ฑฐ, socket ์—ฐ๊ฒฐ ์š”์ฒญ ์ œ๊ฑฐ, ajax ์š”์ฒญ ์ค‘๋‹จ ์ด๋Ÿฐ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ž‘์„ฑํ•œ๋‹ค.

 

โ—์ปดํฌ๋„ŒํŠธ unmount์‹œ์—๋„ clean up function ์•ˆ์— ์žˆ๋˜๊ฒŒ 1ํšŒ ์‹คํ–‰๋œ๋‹ค.

 

 

๊ฐ„๋‹จ ์ •๋ฆฌ !!

 

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

 

-> ์žฌ๋ Œ๋”๋ง ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

 

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

 

-> ์ด๋Ÿฌ๋ฉด ์ปดํฌ๋„ŒํŠธ mount ์‹œ (๋กœ๋“œ์‹œ) 1ํšŒ๋งŒ ์‹คํ–‰๊ฐ€๋Šฅํ•˜๋‹ค.

 

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

 

-> useEffect ์•ˆ์˜ ์ฝ”๋“œ ์‹คํ–‰ ์ „์— ํ•ญ์ƒ ์‹คํ–‰๋œ๋‹ค.

 

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

 

-> ์ปดํฌ๋„ŒํŠธ unmount์‹œ 1ํšŒ ์‹คํ–‰๋œ๋‹ค.

 

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

 

-> state1์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์‹คํ–‰๋œ๋‹ค.

 

 

 

 

โ€ผ๏ธ ์ฐธ๊ณ  : ์ฝ”๋”ฉ์• ํ”Œ react ๊ฐ•์˜