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

๐ [keyword]
|
๐บ ์ฐธ๊ณ ๊ฐ์
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๋ ์ํ ์ค์ด๋ ์์
์ ์ค์ง, ์ทจ์ ๋๋ ์ ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํด์ผ ํ ์ ์์ต๋๋ค.
|
- 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);
})
},[]);