๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒŒ | WEB DEV/React

[React] 13. ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ Lifecycle์™€ useEffect

by KASSID 2024. 1. 2.

๋ชฉ์ฐจ

    728x90

    ์ด์ „ ๊ธ€ โ–ผ

    ๋”๋ณด๊ธฐ

    0. 2023.05.05 - [๐ŸŒŒ | WEB DEV/React] - [React] 0. React๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  & ์ดˆ๊ธฐ ์„ธํŒ…

    1. 2023.05.07 - [๐ŸŒŒ | WEB DEV/React] - [React] 1. JSX

    2. 2023.05.26 - [๐ŸŒŒ | WEB DEV/React] - [React] 2. state (๋ณ€์ˆ˜, array, object)

    2-1. 2023.05.27 - [๐ŸŒŒ | WEB DEV/React] - [React] 2-1. array state ์ •๋ ฌํ•˜๊ธฐ ( .sort()ํ™œ์šฉ)

    3. 2023.05.28 - [๐ŸŒŒ | WEB DEV/React] - [React] 3. ์ปดํฌ๋„ŒํŠธ (Component)

    4. 2023.05.28 - [๐ŸŒŒ | WEB DEV/React] - [React] 4. ๋™์ ์ธ UI ์ œ์ž‘ํ•˜๊ธฐ

    5. 2023.05.28 - [๐ŸŒŒ | WEB DEV/React] - [React] 5. ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„ ์ถ•์•ฝํ•˜๊ธฐ (map)

    6. 2023.05.29 - [๐ŸŒŒ | WEB DEV/React] - [React] 6. props

    7. 2023.07.03 - [๐ŸŒŒ | WEB DEV/React] - [React] 7. ์ด๋ฏธ์ง€ ์‚ฝ์ž…ํ•˜๊ธฐ(css, html, publicํด๋”์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ)

    8. 2023.07.06 - [๐ŸŒŒ | WEB DEV/React] - [React] 8. ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

    9. 2023.07.09 - [๐ŸŒŒ | WEB DEV/React] - [React] 9. ๋ผ์šฐํŒ…-1 (react-router-dom์„ธํŒ…, Routes, Route, Link)

    10. 2023.07.10 - [๐ŸŒŒ | WEB DEV/React] - [React] ๋ผ์šฐํŒ…-2 (useNavigate, 404page, Nested Routes, Outlet)

    11. 2023.10.03 - [๐ŸŒŒ | WEB DEV/React] - [React] 11. ๋ผ์šฐํŒ…-3 ์–‘์‚ฐํ˜• ๋ผ์šฐํŒ…

    12. 2023.10.04 - [๐ŸŒŒ | WEB DEV/React] - [React] 12. Styled-components (+ ํ•œ ์ปดํฌ๋„ŒํŠธ์— cssํŒŒ์ผ ์ ์šฉ๋ฒ•)

     

    ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ Lifecycle์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!

     

    1. ์ปดํฌ๋„ŒํŠธ์˜ Lifecycle

     

    ์ปดํฌ๋„ŒํŠธ๋Š” ํŽ˜์ด์ง€ ๋‚ด์—์„œ ์•„๋ž˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

     

    1) mount (์ƒ์„ฑ)
    2) update (์žฌ๋ Œ๋”๋ง)
    3) unmount (์‚ญ์ œ)

     

     

    ์œ„์˜ ์ฃผ๊ธฐ์— ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ„์„ญ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ฆ‰, ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ ์ค‘๊ฐ„์ค‘๊ฐ„์— ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. (e.g. ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ ์‹œ ํŠน์ • ์ฝ”๋“œ ์‹คํ–‰ ๋“ฑ)

     

     

     


     

    2. ์ปดํฌ๋„ŒํŠธ Lifecycle์— ๊ฐ„์„ญํ•˜๋Š” ๋ฐฉ๋ฒ•

    ํŠน์ • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ or ์—…๋ฐ์ดํŠธ๋˜๊ณ ๋‚˜์„œ or ์‚ฌ๋ผ์ง€๊ธฐ ์ „์— ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ผ!

    ๋ผ๊ณ  ๊ฐ„์„ญ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ

    ์ด๋Ÿฌํ•œ ๊ฐ„์„ญ์€ hook์„ ๋‹ฌ์•„์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค. (Lifecycle hook)

     

    1) ์ด์ „์˜ ๋ฐฉ์‹

    Lifecycle hook์„ ์˜ˆ์ „์—๋Š” class ๋ฌธ๋ฒ•๊ณผ ํ•จ๊ป˜

    componentDidMount(), componentDidUpdate(), componentWillUnmount() ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜์˜€๋‹ค.

     

    class Page extends React.Component {
      componentDidMount(){
        //mount ์‹œ
      }
      componentDidUpdate(){
        //update ์‹œ
      }
      componentWillUnmount(){
        //unmount ์ „
      }
      ...
    }

     

    2) ์ตœ๊ทผ์˜ ๋ฐฉ์‹

    ์ตœ๊ทผ์—๋Š” useEffect ํ›…์„ ์ด์šฉํ•ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

    import {useState, useEffect} from 'react';
    
    function Pages(){
      useEffect(()=>{
        //mount, update ์‹œ ์ฝ”๋“œ ์‹คํ–‰
      })
      ...
      
      return(
        ...
      ) 
    }

     

     

    ์˜ˆ์‹œ (mount ์‹œ)

    import {useState, useEffect} from 'react';
    
    function Pages(){
      useEffect(()=>{
        console.log("HELLO!");
      })
      
      return(
        ...
      ) 
    }

     

    ์ด์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. (์œ„์˜ ์˜ˆ์‹œ๋Š” ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ)

     

    โ€ป useEffect ๋‚ด๋ถ€ ์ฝ”๋“œ๊ฐ€ 2๋ฒˆ ์‹คํ–‰๋˜๋Š” ์ด์œ 

    ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋„ ํ™•์ธ๋˜๋“ฏ useEffect ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 2ํšŒ ์‹คํ–‰์ด ๋œ๋‹ค.
    ์ด๋Š” react๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ๊ฐœ๋ฐœ ์‹œ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ์‚ฌ์ „์„ค์ •ํ•œ ๊ฒƒ์ด๋‹ค. (StrictMode)
    ๋”ฐ๋ผ์„œ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๋นŒ๋“œ ํŒŒ์ผ์—์„œ๋Š” ์ •์ƒ์ ์œผ๋กœ 1ํšŒ ์‹คํ–‰ํ•œ๋‹ค.

    ์ด๋ฅผ ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ 1ํšŒ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด
    index.js์—์„œ <React.StrictMode> ํƒœ๊ทธ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๋œ๋‹ค.

     

     

    ์˜ˆ์‹œ 2 update ์‹œ(์žฌ๋ Œ๋”๋ง)

    import {useState, useEffect} from 'react';
    
    function Pages(){
      useEffect(()=>{
        console.log("HELLO!");
      })
      
      let [count, setCount] = useState(0);
      
      return(
        ...
        <button onClick={()=>{setCount(count+1)}} />
      ) 
    }

     

    ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์žฌ๋ Œ๋”๋ง์ด ๋  ๋•Œ useEffect ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๊ฐ€ ์žฌ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     


    3. useEffect๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ?

     

    1) useEffect์˜ ๋™์ž‘์›๋ฆฌ

    useEffect ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋Š” html์ด ๋ชจ๋‘ ๋ Œ๋”๋ง์ด ๋œ ํ›„ ์‹คํ–‰์ด ๋œ๋‹ค.

     

    ์œ„์—์„œ ๋ณด์•˜๋˜ ์˜ˆ์‹œ๋ฅผ ๋‹ค์‹œ ๋ณด๋ฉด,

     

    ์˜ˆ์‹œ_ useEffect ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฒฝ์šฐ

    import {useState, useEffect} from 'react';
    
    function Pages(){
      useEffect(()=>{
        console.log("HELLO!");
      })
      
      return(
        ...
      ) 
    }

     

    ์˜ˆ์‹œ_ ์•„๋‹Œ ๊ฒฝ์šฐ

    import {useState, useEffect} from 'react';
    
    function Pages(){
      console.log("HELLO!");
      
      return(
        ...
      ) 
    }

     

    ์œ„์˜ ์ฝ”๋“œ๋“ค์€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

     

    ํ•˜์ง€๋งŒ ์–ธ๊ธ‰ํ•œ๋Œ€๋กœ

    ๋ณต์žกํ•œ ์—ฐ์‚ฐ์ด๋‚˜ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ฝ”๋“œ๋“ค์€ useEffect ๋‚ด๋ถ€์— ์œ„์น˜์‹œํ‚จ๋‹ค๋ฉด (e.g. ํƒ€์ด๋จธ, ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ get)

    html ๋ Œ๋”๋ง์ด ๋œ ์ดํ›„์— ๋™์ž‘ํ•˜๋ฏ€๋กœ

    ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์กฐ๊ธˆ ๋” ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์›น์‚ฌ์ดํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    2) ์™œ Effect ์ผ๊นŒ?

    ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์šฉ์–ด ์ค‘ SideEffect ๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค.

    ์ด๋Š” ํ•จ์ˆ˜์˜ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ์ด ์—†๋Š” ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•œ๋‹ค.

     

    useEffect๋Š” ํ•ด๋‹น ์šฉ์–ด์—์„œ ๋”ฐ์˜จ ์šฉ์–ด๋ผ๊ณ  ํ•œ๋‹ค!

     

     


     

    4. useEffect ์‹คํ–‰์กฐ๊ฑด

     

    ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ๋˜ useEffect๋Š” 1๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง„ ์•„๋ž˜์˜ ํ˜•ํƒœ์˜€๋‹ค.

    useEffect(()=>{})

     

    ์—ฌ๊ธฐ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•˜๋ฉด ์‹คํ–‰ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    1) ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•œ ๊ฒฝ์šฐ

    useEffect(()=>{},[stat1])

    ๋Œ€๊ด„ํ˜ธ[ ] ์•ˆ์— ๋ณ€์ˆ˜, state ๋“ฑ์„ ๋„ฃ์–ด์„œ

    ๊ทธ ๊ฐ’์ด ๋ณ€ํ•  ๊ฒฝ์šฐ useEffect ๋‚ด๋ถ€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰์ด ๋œ๋‹ค.

    ๋งˆ์šดํŠธ๊ฐ€ ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ ์œ ํšจํ•˜๋‹ค.

     

    ์ด๋•Œ, ๋Œ€๊ด„ํ˜ธ ์•ˆ ๋ณ€์ˆ˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

    useEffect(()=>{},[stat1, stat2, ...])

    ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด, useEffect ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

     

    2) ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ([ ] ๋งŒ!)

    ๋Œ€๊ด„ํ˜ธ [ ]๋งŒ ๋„ฃ์–ด์ค€ ๊ฒฝ์šฐ์—๋Š”

    ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ์‹œ๋‹จ 1ํšŒ ๋งŒ ์‹คํ–‰๋œ๋‹ค.

     

    useEffect(()=>{},[])

     

     


    5. clean up function

     

    useEffect๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ด์ „์— ํŠน์ • ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š”

    return ()=>{ } ์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

    ๋˜ํ•œ, unmount ์‹œ์—๋„ ์‹คํ–‰๋œ๋‹ค.

    useEffect(()=>{
      // 2. ~~
      return ()=>{
    	// 1. ~~~
      }
    })

     

    ์ด๋ฅผ clean up function์ด๋ผ๊ณ  ํ•œ๋‹ค.

     

    ์ด ๊ธฐ๋Šฅ์€ useEffect ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ํ•˜๊ธฐ ์ „

    setTimeout์„ clearํ•˜๊ฑฐ๋‚˜ socket ์—ฐ๊ฒฐ์š”์ฒญ์„ ์ œ๊ฑฐ, ajax์š”์ฒญ์„ ์ค‘๋‹จํ•˜๋Š” ๋“ฑ

    ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ์˜ˆ์‹œ

    useEffect(()=>{
      let time = setTimeout(()=>{...}, 1000)
      return ()=>{
        clearTimeout(time)
      }
    },[])

     

    useEffect(()=>{
      return()=>{
        ...
      }
    },[])

    ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด unmount ์‹œ 1ํšŒ ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Œ!

    ๋Œ“๊ธ€