![[React] useEffect](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMYdCQ%2FbtsGl2bwLmJ%2FS4K7p9xHdLFbtaA0qAKcdK%2Fimg.png)
๐ useEffect๋ ๋ฌด์์ธ๊ฐ์?
useEffect
ํ
์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ํน์ ์์
์ ์ํํ ์ ์๋๋ก ํด์ฃผ๋ ๊ธฐ๋ฅ์ด์์. ํด๋์ค ์ปดํฌ๋ํธ์ componentDidMount
, componentDidUpdate
, componentWillUnmount
์๋ช
์ฃผ๊ธฐ ๋ฉ์๋์ ์ ์ฌํ ์ญํ ์ ํ์ฃ . ํ์ง๋ง useEffect
๋ ์ด ๋ชจ๋ ์๋ช
์ฃผ๊ธฐ๋ฅผ ํ๋์ API๋ก ํตํฉํ์ฌ ์ ๊ณตํด์.
์ฌ๋ฌ๋ถ์ด ํ ์นดํ์ ์์ ์๊ณ , ์นดํ์ ๋ถ์๊ธฐ๋ ๋ค๋ฅธ ์๋๋ค์ ๋ํ์ ๋ฐ๋ผ ์ฌ๋ฌ๋ถ์ ๊ธฐ๋ถ์ด๋ ํ๋์ด ๋ฌ๋ผ์ง๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ด๋, ์นดํ์ ๋ถ์๊ธฐ๋ ๋ํ๋ useEffect
ํ
์ ์์กด์ฑ ๋ฐฐ์ด(dependency array)์ ํด๋นํ๊ณ , ์ฌ๋ฌ๋ถ์ ๊ธฐ๋ถ์ด๋ ํ๋์ ๋ณํ๋ ํ
๋ด๋ถ์์ ์คํ๋๋ ๋ถ์ ํจ๊ณผ(side effects)์ ํด๋นํด์. ์นดํ์ ์ฒ์ ๋ค์ด์ค ๋ ๊ธฐ๋ถ์ด ์ข์์ง๋ ๊ฒ์ฒ๋ผ, ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋ ํน์ ์์
์ ์ํํ ์ ์๊ณ , ์นดํ์ ๋ถ์๊ธฐ๊ฐ ๋ฐ๋ ๋๋ง๋ค ์ฌ๋ฌ๋ถ์ ๊ธฐ๋ถ์ด๋ ํ๋์ด ๊ทธ์ ๋ง์ถฐ ๋ณํํ๋ ๊ฒ์ฒ๋ผ, ์์กด์ฑ ๋ฐฐ์ด์ ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค useEffect
๋ด์ ์ฝ๋๊ฐ ์คํ๋ผ์. ๋ง์ง๋ง์ผ๋ก, ์นดํ๋ฅผ ๋ ๋ ๋ ๊ธฐ๋ถ์ด ์กฐ๊ธ ์ธ์ธํด์ง๋ ๊ฒ์ฒ๋ผ, ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ ๋ ๋ ์ ๋ฆฌ(cleanup) ์์
์ ์ํํ ์ ์์ด์.
๐ฅ๏ธ useEffect์ ์ฌ์ฉ ๋ฐฉ๋ฒ
useEffect
๋ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์์: ํจ๊ณผ๋ฅผ ์ํํ๋ ํจ์์ ์์กด์ฑ ๋ฐฐ์ด(dependency array)์ด์ฃ . ์์กด์ฑ ๋ฐฐ์ด์ ์ ํ์ ์ผ๋ก ์ ๊ณต๋ ์ ์์ผ๋ฉฐ, ์ด ๋ฐฐ์ด ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ํจ๊ณผ ํจ์๊ฐ ์คํ๋ผ์.
1. useEffect ํ ์ ๊ธฐ๋ณธ ํํ
useEffect
ํ ์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ํํ๋ฅผ ๊ฐ์ง๋๋ค:- ์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ถ์ ํจ๊ณผ๋ฅผ ์ํํ ํจ์์์.
- ๋ ๋ฒ์งธ ์ธ์๋ ์์กด์ฑ ๋ฐฐ์ด๋ก, ์ด ๋ฐฐ์ด ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ํจ๊ณผ ํจ์๊ฐ ์คํ๋ผ์.
useEffect(() => {
// ์ฌ๊ธฐ์ ๋ถ์ ํจ๊ณผ๋ฅผ ์ํํ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
}, [/* ์์กด์ฑ ๋ฐฐ์ด */]);
2. ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋์์ ๋
- ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋๋ง ์คํ๋์ด์ผ ํ๋ ์ฝ๋๋ ์์กด์ฑ ๋ฐฐ์ด์ ๋น์์ ๊ตฌํํ ์ ์์ด์.
useEffect(() => {
console.log('์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋์์ต๋๋ค.');
}, []); // ์์กด์ฑ ๋ฐฐ์ด์ด ๋น์ด ์๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
์ด ์ฝ๋๋ ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ์ฒ์ ๋ ๋๋ง ๋ ๋ ํ ๋ฒ๋ง "์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋์์ต๋๋ค."๋ฅผ ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค.
3. ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ ๋ ๋
- ํน์ ์ํ ๋ณ์๋ prop์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ๋์ด์ผ ํ๋ ์ฝ๋๋ ํด๋น ๋ณ์๋ prop์ ์์กด์ฑ ๋ฐฐ์ด์ ํฌํจ์์ผ ๊ตฌํํด์.
const [count, setCount] = useState(0);
useEffect(() => {
console.log(`count๊ฐ ์
๋ฐ์ดํธ๋์ด ${count}๊ฐ ๋์์ต๋๋ค.`);
}, [count]); // count๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ๋ฉ๋๋ค.
์ด ์ฝ๋๋ 'count' ์ํ ๋ณ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฝ์์ ๊ทธ ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
4. ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ ๋ ๋
- ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ ๋ ๋ ์คํ๋์ด์ผ ํ๋ ์ ๋ฆฌ(cleanup) ์์
์
useEffect
์ ํจ์์์ ํด๋ฆฐ์ ํจ์๋ฅผ ๋ฐํํ์ฌ ๊ตฌํํด์.
useEffect(() => {
console.log('์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋์์ต๋๋ค.');
return () => {
console.log('์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋์์ต๋๋ค.');
};
}, []);
์ด ์ฝ๋๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋ "์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋์์ต๋๋ค."๋ฅผ ์ถ๋ ฅํ๊ณ , ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ ๋ ๋ "์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋์์ต๋๋ค."๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
๐ค useEffect์ ์ฌ์ฉ ์์
useEffect
ํ
์ ๋ฆฌ์กํธ์์ ๋ถ์ ํจ๊ณผ(side effects)๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋ผ์. ์ฃผ๋ก ๋ฐ์ดํฐ fetching, ๊ตฌ๋
(subscriptions) ์ค์ ๋๋ ์๋์ผ๋ก DOM์ ๋ณ๊ฒฝํ๋ ์์
์ ์ฌ์ฉํด์. ์ด ํ
์ ํตํด ํจ์ํ ์ปดํฌ๋ํธ ๋ด์์๋ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋์ ์ ์ฌํ ์์
์ ์ํํ ์ ์์ด์.
1. ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
useEffect(() => {
const fetchData = async () => {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
};
fetchData();
}, []); // ์์กด์ฑ ๋ฐฐ์ด์ด ๋น์ด ์์ผ๋ฏ๋ก, ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
์ด ์ฝ๋๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋ ์ธ๋ถ API๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค.
์์กด์ฑ ๋ฐฐ์ด์ด ๋น์ด ์๊ธฐ ๋๋ฌธ์, ์ด ํจ๊ณผ๋ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ ๋๋ง ๋ ๋ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
2. ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ
useEffect(() => {
const handleResize = () => {
console.log('window ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค.');
};
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
};
}, []); // ์์กด์ฑ ๋ฐฐ์ด์ด ๋น์ด ์์ผ๋ฏ๋ก, ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
์ด ์ฝ๋๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋ ์๋์ฐ์ ํฌ๊ธฐ ๋ณ๊ฒฝ ์ด๋ฒคํธ์ ๋ฆฌ์ค๋๋ฅผ ์ถ๊ฐํ๊ณ , ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ ๋ ๋ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
3. ์ฌ์ฉ์ ์ธํฐ๋์ ์ ๋ฐ๋ฅธ ์ํ ์ ๋ฐ์ดํธ
function ClickCounter() {
const [count, setCount] = useState(0);
useEffect(() => {
const handleClick = () => setCount(prevCount => prevCount + 1);
document.addEventListener('click', handleClick);
return () => {
document.removeEventListener('click', handleClick);
};
}, []);
return <div>ํด๋ฆญ ํ์: {count}</div>;
}
์ด ์ฝ๋๋ ๋ฌธ์ ์ ์ฒด์ ํด๋ฆญ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ถ๊ฐํ์ฌ, ์ฌ์ฉ์๊ฐ ์ด๋๋ ํด๋ฆญํ ๋๋ง๋ค ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํต๋๋ค.
์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋ ์ถ๊ฐ๋๊ณ , ์ธ๋ง์ดํธ ๋ ๋ ์ ๊ฑฐ๋ฉ๋๋ค.
์ด ๋ฐฉ์์ ํตํด ์ฌ์ฉ์ ์ธํฐ๋์ ์ ๊ธฐ๋ฐํ ์ํ ์ ๋ฐ์ดํธ ๋ก์ง์ ๊ตฌํํ ์ ์์ต๋๋ค.
๐จ ์ฃผ์ํ ์
- ํด๋ฆฐ์
ํจ์:
useEffect
๋ด๋ถ์์ ๊ตฌ๋ ์ ์์ฑํ๋ ๊ฒฝ์ฐ, ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ ๋ ๋ ๊ตฌ๋ ์ ์ ๋ฆฌ(cleanup) ํด์ผ ํด์. ์ด๋ฅผ ์ํดuseEffect
์ ํจ๊ณผ ํจ์์์ ํด๋ฆฐ์ ํจ์๋ฅผ ๋ฐํํ ์ ์์ด์. - ์์กด์ฑ ๋ฐฐ์ด: ์์กด์ฑ ๋ฐฐ์ด์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ์์์น ๋ชปํ ๋ฌดํ ๋ฃจํ์ ๋น ์ง ์ ์์ด์. ํจ๊ณผ๊ฐ ์์กดํ๋ ๋ชจ๋ ๊ฐ์ ์์กด์ฑ ๋ฐฐ์ด์ ํฌํจ๋์ด์ผ ํด์.
๐ ๊ฒฐ๋ก
useEffect
ํ
์ ๋ฆฌ์กํธ์์ ๋ถ์ ํจ๊ณผ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์. ์ ์ ํ ์ฌ์ฉํ๋ค๋ฉด, ๋ฐ์ดํฐ fetching, ๊ตฌ๋
์ค์ , DOM ์กฐ์ ๋ฑ ๋ค์ํ ์์
์ ํจ๊ณผ์ ์ผ๋ก ์ํํ ์ ์์ด์. ํ์ง๋ง, ์์กด์ฑ ๋ฐฐ์ด์ ๊ด๋ฆฌ์ ํด๋ฆฐ์
ํจ์์ ์ฌ์ฉ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํด์.
๐ ์ถ๊ฐ ์ ๋ณด
- ๋ฆฌ์กํธ์
useEffect
์ ๋ํ ๋ ๊น์ ์ดํด๋ฅผ ์ํ์ ๋ค๋ฉด, ๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์์์ ์์ธํ ์ ๋ณด๋ฅผ ์ฐพ์๋ณผ ์ ์์ด์.
'Front-end > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ์๋ช ์ฃผ๊ธฐ (0) | 2024.10.20 |
---|---|
[React] JSX (0) | 2024.10.19 |
[React] useRef (0) | 2024.01.31 |
[React] State (1) | 2024.01.08 |
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!