-
[React] useEffect ์ ๋ฆฌreact 2024. 6. 12. 16:08

๐ [keyword]
- ์ค์ ํจ์
1-1. ์ ๋ฆฌ ํจ์ - ์์กด์ฑ ๋ฐฐ์ด
๐บ ์ฐธ๊ณ ๊ฐ์
React Hooks์ ์ทจํ๋ค - useEffect ๊น๋ํ๊ฒ ๋ง์คํฐํ๊ธฐ | ๋ฆฌ์กํธ ํ ์ค ์๋ฆฌ์ฆ
- ์ปดํฌ๋ํธ๊ฐ Mount, Update, Unmount๋ ๋, ํน์ ์์ ์ ์ฒ๋ฆฌ์์ผ์ค ์ฝ๋๊ฐ ํ์ํ๋ค๋ฉด useEffect๋ฅผ ํ์ฉํ๋ฉด ๋ฉ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก useEffect ํ
์ ์ธ์๋ก ์ฝ๋ฐฑํจ์๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฝ๋ฐฑํจ์๋ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋ ํจ์
- ์ฝ๋ฐฑํจ์ ๋ด๋ถ์ ์ฐ๋ฆฌ๊ฐ ์ฒ๋ฆฌํ ์์ ์ ์ ๋ ฅํด์ค๋๋ค.
useEffect(()=>{})
- ํ๋์ ์ฝ๋ฐฑํจ์๋ง ๋ฐ๋ ๊ฒฝ์ฐ
- ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ฝ๋ฐฑํจ์, ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฐฐ์ด(dependencies)


๋ฐฐ์ด์ด ๋น ๋ฐฐ์ด์ผ ๋
- ํ๋ฉด์ ์ฒซ ๋ ๋๋ง ๋ ๋๋ง ์คํ๋ฉ๋๋ค.

clean up- ์ ๋ฆฌ
- ์ฒซ ๋ฒ์งธ ์ธ์ return ๊ฐ์ ํจ์๋ฅผ ๋ฃ์ด์ค๋๋ค.

clean up ์ฐธ๊ณ ์ฝ๋
// App.js import { useState,useEffect } from "react"; import Timer from "./component/Timer"; function App() { const[showTimer,setShowTimer]=useState(false); return ( <div> {showTimer && <Timer/>} <button onClick={()=>setShowTimer(!showTimer)}>Toggle Timer</button> </div> ); } export default App;// Timer.js import React, {useEffect} from "react"; const Timer=()=>{ useEffect(()=>{ const timer=setInterval(()=>{ console.log("ํ์ด๋ฉฐ ๋์๊ฐ๋ ์ค") },1000) return ()=>{ // ์ ๋ฆฌ์์ ์ฝ๋ clearInterval(timer) console.log('ํ์ด๋จธ๊ฐ ์ข ๋ฃ๋จ') } },[]) return( <div> <span>ํ์ด๋จธ๋ฅผ ์์ํฉ๋๋ค. ์ฝ์์ ๋ณด์ธ์!</span> </div> ) } export default Timer;๐ฏ๏ธ ๊ณต์ ๋ฌธ์
useEffect(setup, dependencies?)- useEffect๋ ์ธ๋ถ ์์คํ
๊ณผ ์ปดํฌ๋ํธ๋ฅผ ๋๊ธฐํํ๋ React Hook์
๋๋ค.
- ์ผ๋ถ ์ปดํฌ๋ํธ์์๋ ์ธ๋ถ ์์คํ
๊ณผ ๋๊ธฐํํด์ผ ํ ์ ์์ต๋๋ค.
- ์ธ๋ถ์์คํ
: React์ ์ํด ์ปจํธ๋กค๋์ง ์๋ ๋ชจ๋ ์ฝ๋
- ๋ช๋ช ์ปดํฌ๋ํธ๋ค์ ํ์ด์ง์ ํ์๋๋ ๋์ ๋คํธ์ํฌ๋ ๋ธ๋ผ์ฐ์ API, ๋๋ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฐ๊ฒฐ์ด ์ ์ง๋์ด์ผ ํจ
- setInterval()์ ์ํด ๊ด๋ฆฌ๋๋ ํ์ด๋จธ ๋๋ clearInterval().
- window.addEventListener()์ ์ด์ฉํ ์ด๋ฒคํธ ๊ตฌ๋ ๋๋ window.removeEventListener().
- animation.start()์ ๊ฐ์ ์๋ ํํฐ ์ ๋๋ฉ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ API ๋๋ animation.reset().
- ์๋ฅผ ๋ค์ด React์ state์ ๊ธฐ์ค์ผ๋ก React์ ์๊ด์๋ ๊ตฌ์ฑ ์์๋ฅผ ์ ์ดํ๊ฑฐ๋, ์๋ฒ ์ฐ๊ฒฐ์ ์ค์ ํ๊ฑฐ๋, ๊ตฌ์ฑ ์์๊ฐ ํ๋ฉด์ ๋ํ๋ ๋ ๋ถ์ ๋ชฉ์ ์ ๋ก๊ทธ๋ฅผ ์ ์กํ ์๋ ์์ต๋๋ค. Effect๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋๋ง ํ ํน์ ์ฝ๋๋ฅผ ์คํํ์ฌ React ์ธ๋ถ์ ์์คํ ๊ณผ ์ปดํฌ๋ํธ๋ฅผ ๋๊ธฐํํ ์ ์์ต๋๋ค.
- ์ธ๋ถ์์คํ
: React์ ์ํด ์ปจํธ๋กค๋์ง ์๋ ๋ชจ๋ ์ฝ๋
- ์ผ๋ถ ์ปดํฌ๋ํธ์์๋ ์ธ๋ถ ์์คํ
๊ณผ ๋๊ธฐํํด์ผ ํ ์ ์์ต๋๋ค.
๋งค๊ฐ๋ณ์
- setup(์ค์ )
- Effect์ ๋ก์ง์ด ํฌํจ๋ ํจ์์ ๋๋ค.
- ์ค์ ํจ์๋ ์ ํ์ ์ผ๋ก clean up(์ ๋ฆฌ) ํจ์๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
- React๋ ์ปดํฌ๋ํธ๊ฐ DOM์ ์ถ๊ฐ๋ ์ดํ์ ์ค์ ํจ์๋ฅผ ์คํํฉ๋๋ค.
- ์์กด์ฑ์ ๋ณํ์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง์ด ๋์์ ๊ฒฝ์ฐ,
- (์ค์ ํจ์์ ์ ๋ฆฌ ํจ์๋ฅผ ์ถ๊ฐํ์๋ค๋ฉด)
- React๋ ์ด์ ๋ ๋๋ง์ ์ฌ์ฉ๋ ๊ฐ์ผ๋ก ์ ๋ฆฌ ํจ์๋ฅผ ์คํํ ํ
- ์๋ก์ด ๊ฐ์ผ๋ก ์ค์ ํจ์๋ฅผ ์คํํฉ๋๋ค.
- ์ปดํฌ๋ํธ๊ฐ DOM์์ ์ ๊ฑฐ๋ ๊ฒฝ์ฐ์๋ ์ ๋ฆฌ ํจ์๋ฅผ ์คํํฉ๋๋ค.
๐น <ํ์ํ ๊ฒฝ์ฐ ํด๋ฆฐ์ ํจ์ ์ถ๊ฐ> - ์ผ๋ถ Effect๋ ์ํ ์ค์ด๋ ์์ ์ ์ค์ง, ์ทจ์ ๋๋ ์ ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํด์ผ ํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, “์ฐ๊ฒฐ”์ “์ฐ๊ฒฐ ํด์ ”๊ฐ ํ์ํ๋ฉฐ, “๊ตฌ๋ ”์ “๊ตฌ๋ ์ทจ์”๊ฐ ํ์ํ๊ณ , “๋ถ๋ฌ์ค๊ธฐ(fetch)“๋ “์ทจ์” ๋๋ “๋ฌด์”๊ฐ ํ์ํฉ๋๋ค.
- ์ด๋ฐ ๊ฒฝ์ฐ์ Effect์์ *ํด๋ฆฐ์ ํจ์(cleanup function)*๋ฅผ ๋ฐํํ์ฌ ์ด๋ป๊ฒ ์ํํ๋์ง ๋ฐฐ์ฐ๊ฒ ๋ ๊ฒ์ ๋๋ค.
- dependencies ์ ํ์ฌํญ
- ์ค์ ํจ์์ ์ฝ๋ ๋ด๋ถ์์ ์ฐธ์กฐ๋๋ ๋ชจ๋ ๋ฐ์ํ ๊ฐ๋ค์ด ํฌํจ๋ ๋ฐฐ์ด๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๋ฐ์ํ ๊ฐ์๋ props์ state, ๋ชจ๋ ๋ณ์ ๋ฐ ์ปดํฌ๋ํธ body์ ์ง์ ์ ์ผ๋ก ์ ์ธ๋ ํจ์๋ค์ด ํฌํจ๋ฉ๋๋ค. ๋ฆฐํฐ๊ฐ ๋ฆฌ์กํธ ํ๊ฒฝ์ ๋ง๊ฒ ์ค์ ๋์ด ์์ ๊ฒฝ์ฐ, ๋ฆฐํฐ๋ ๋ชจ๋ ๋ฐ์ํ ๊ฐ๋ค์ด ์์กด์ฑ์ ์ ๋๋ก ๋ช ์๋์ด ์๋์ง ๊ฒ์ฆํ ๊ฒ์ ๋๋ค. ์์กด์ฑ ๋ฐฐ์ด์ ํญ์ ์ผ์ ํ ์์ ํญ๋ชฉ์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ฉฐ [dep1, dep2, dep3]๊ณผ ๊ฐ์ด ์์ฑ๋์ด์ผ ํฉ๋๋ค. React๋ ๊ฐ๊ฐ์ ์์กด์ฑ๋ค์ Object.is ๋น๊ต๋ฒ์ ํตํด ์ด์ ๊ฐ๊ณผ ๋น๊ตํฉ๋๋ค.
- ์์กด์ฑ์ ์๋ตํ ๊ฒฝ์ฐ, Effect๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ์คํ๋ฉ๋๋ค. ์ธ์์ ์์กด์ฑ ๋ฐฐ์ด์ ์ถ๊ฐํ์ ๋, ๋น ๋ฐฐ์ด์ ์ถ๊ฐํ์ ๋, ์์กด์ฑ์ ์ถ๊ฐํ์ง ์์์ ๋์ ์ฐจ์ด๋ฅผ ํ์ธํด ๋ณด์ธ์.
React๋ ์ค์ ํจ์์ ์ ๋ฆฌ ํจ์๊ฐ ํ์ํ ๋๋ง๋ค ํธ์ถํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋ ์ ์์ต๋๋ค.
- ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ์ถ๊ฐ๋์์ ๋ ์ค์ ์ฝ๋๊ฐ ๋์ํฉ๋๋ค (๋ง์ดํธ ์).
- ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋๋ง๋ค ์๋ ๋์์ ์ํํฉ๋๋ค.
- ๋จผ์ ์ ๋ฆฌ ์ฝ๋๊ฐ ์ค๋๋ props์ state์ ํจ๊ป ์คํ๋ฉ๋๋ค.
- ์ดํ, ์ค์ ์ฝ๋๊ฐ ์๋ก์ด props์ state์ ํจ๊ป ์คํ๋ฉ๋๋ค.
- ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์์ ์ ๊ฑฐ๋ ์ดํ์ ์ ๋ฆฌ ์ฝ๋๊ฐ ๋ง์ง๋ง์ผ๋ก ์คํ๋ฉ๋๋ค (๋ง์ดํธ ํด์ ์).
๐ ์ฐธ๊ณ ์ฝ๋
const [counter,setValue]=useState(0); const [keyword, setKeyword]=useState(""); const onClick=()=>setValue((prev)=>prev+1); const onChange=(event)=> setKeyword(event.target.value); useEffect(()=>{ console.log("I run only once."); },[keyword]); useEffect(()=>{ console.log("I run when 'keyword' changes."); },[]); useEffect(()=>{ console.log("I run when 'counter' changes."); },[counter]); useEffect(()=>{ console.log("I run when 'keyword&counter' changes."); },[keyword,counter]);useEffect(() => { getMovie(); }, [id]);useEffect(()=>{ fetch("<https://api.coinpaprika.com/v1/tickers>") .then((response)=> response.json()) .then((json)=>{ setCoins(json); setLoading(false); }) },[]);'react' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] useState ์ ๋ฆฌ (0) 2024.06.12 [React] jsํ์ผ์์ html ํ๊ทธ ์๋์์ฑํ๊ธฐ (0) 2024.06.12 [React] ๋ ธ๋ง๋์ฝ๋ ReactJs๋ก ์ํ ์น ๋ง๋ค๊ธฐ : #5 useEffect-Cleanup (0) 2024.06.10 [React] ๋ ธ๋ง๋์ฝ๋ ReactJs๋ก ์ํ ์น ๋ง๋ค๊ธฐ : #5 useEffect (0) 2024.06.10 [React] ๋ ธ๋ง๋์ฝ๋ ReactJs๋ก ์ํ ์น ๋ง๋ค๊ธฐ : #4 PROPS (0) 2024.06.09 - ์ค์ ํจ์