useEffect()
1. ๊ฐ์
๋ฆฌ์กํธ์์ useState()๊ณผ ํจ๊ป ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ Hook์ useEffect()์ด๋ค. useEffect()๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ๋๋๋ง ๋ ๋๋ง๋ค ํน์ ์์
์ ์คํํ ์ ์๋๋ก ๋์์ ์ค๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ํด๋์คํ ์ปดํฌ๋ํธ์ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋(componentDidMount, componentDidUpdate, compoenntWillUnMount)์ ๊ฐ์ ๊ธฐ๋ฅ์ด๋ค.
2. useEffect() ์ฌ์ฉํ๊ธฐ
๊ธฐ๋ณธํํ useEffect(function, deps)
function: ์ํํ๊ณ ์ ํ๋ ์์
deps: ๋ฐฐ์ด ํํ์ด๋ฉฐ, ๋ฐฐ์ด ์์๋ ๊ฒ์ฌํ๊ณ ์ ํ๋ ํน์ ๊ฐ์ด ๋ค์ด๊ฐ๊ฑฐ๋ ๋๋ ๋น ๋ฐฐ์ด์ด๋ค.
์๋๋ ๊ฐ๋จํ useEffect()์ ์ฌ์ฉ์์์ด๋ค.
import React, { useEffect } from 'react';
const App = () => {
useEffect(() => {
consolo.log('Hello useEffect()!');
}, []);
return <div></div>;
};
export default App;3. ๋ง์ดํธ
์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ํ๋ฌ์ ๋(๋ง์ดํธ ๋์์ ๋)๋ฅผ useEffect()๋ก ๊ด๋ฆฌ๋ฅผ ํด๋ณด์.
deps ๋ฐฐ์ด์ ๋น์ฐ๊ฒ ๋๋ค๋ฉด, ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ํ๋ ๋์๋ง useEffect() ์ ๋ฑ๋กํ ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค.
์๋์ ์ฝ๋๋ฅผ ์์๋ก ์ดํด๋ณด์.
import React, { useEffect, useState } from 'react';
const Test = () => {
const [numberArr, setNumberArr] = useState([]);
const onClickBtn = () => {
const num = Math.floor(Math.random() * 100);
const newNumArr = [...numberArr, num];
setNumberArr(newNumArr);
};
return (
<div>
<button onClick={onClickBtn}>์ซ์ ์์ฑ</button>
{numberArr.map((item, index) => {
return <Number key={index} number={item} />;
})}
</div>
);
};
export default Test;
const Number = ({ number }) => {
useEffect(() => {
console.log(`์ปดํฌ๋ํธ ๋ง์ดํธ ${number}`);
}, []);
return <div>Number: {number}</div>;
};์์ ์ปดํฌ๋ํธ๋ฅผ ์ดํด๋ณด์. Test์ปดํฌ๋ํธ์์ ์ซ์ ์์ฑ ๋ฒํผ์ ๋๋ฅด๋ฉด ์๋ก์ด ์ซ์์ด ์๊ธฐ๊ณ numberArr์ ์๋ก์ด ์ซ์๊ฐ ๋ด๊ธฐ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ numberArr์ ๋ฐ๋ผ Number ์ปดํฌ๋ํธ๊ฐ ์๊ธฐ๊ฒ ๋๋ค.
Number์ปดํฌ๋ํธ์์๋ ์ปดํฌ๋ํธ๊ฐ ์์ฑ(๋ง์ดํธ)๋ ๋ useEffect()๋ก ์ธํด ์ฝ์์ด ์ฐํ๊ฒ ๋๋ค. ์๋๋ ์ซ์๊ฐ ์์ฑ๋ ๋ ๋ณด์ฌ์ง๋ ํ๋ฉด๊ณผ ์ฝ์์ด๋ค.


4. ์ธ๋ง์ดํธ
์ด๋ฒ์๋ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง ๋(์ธ๋ง์ดํธ ๋์์ ๋)๋ฅผ useEffect()๋ก ๊ด๋ฆฌ๋ฅผ ํด๋ณด์.
useEffect()์์ ํจ์๋ฅผ ๋ฐํํ ์ ์๋๋ฐ ์ด ํจ์๋ฅผ cleanupํจ์๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ์ด cleanupํจ์๊ฐ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง ๋ ํธ์ถ๋๋ค. ์ฝ๊ฒ ๋งํด cleanupํจ์๊ฐ useEffect()์ ๋ํ ๋ท์ ๋ฆฌ๋ฅผ ํด์ค๋ค๊ณ ํ ์ ์๋ค.
cleanupํจ์๋ฅผ ์ฌ์ฉํด๋ณด์. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์์ Test์ปดํฌ๋ํธ์ ์ถ๊ฐ์ ์ธ ์ฝ๋(Test์ปดํฌ๋ํธ๋ฅผ ์ญ์ ํ๊ธฐ ์ํ ์ฝ๋, cleanupํจ์ ์ฝ๋)๊ฐ ํ์ํ๋ค. ์๋์ ๊ฐ์ด ์์ฑํด๋ณด์.
import React, { useEffect, useState } from 'react';
const Test = () => {
const [numberArr, setNumberArr] = useState([]);
const onClickBtn = () => {
const num = Math.floor(Math.random() * 100);
const newNumArr = [...numberArr, num];
setNumberArr(newNumArr);
};
return (
<div>
<button onClick={onClickBtn}>์ซ์ ์์ฑ</button>
{numberArr.map((item, index) => {
return (
<Number
key={index}
number={item}
numberArr={numberArr}
setNumberArr={setNumberArr}
/>
);
})}
</div>
);
};
export default Test;
const Number = ({ number, numberArr, setNumberArr }) => {
// Number์ปดํฌ๋ํธ๋ฅผ ์ธ๋ง์ดํธํ๊ธฐ ์ํ ํจ์
// setNumberArr๋ฅผ ํตํด numberArr์ ๊ฐ์ ๋ฐ๊พผ๋ค.
const onClickDelBtn = () => {
const newNumArr = numberArr.filter((item) => item !== number);
setNumberArr(newNumArr);
};
useEffect(() => {
console.log(`์ปดํฌ๋ํธ ๋ง์ดํธ ${number}`);
// cleanup ํจ์
return () => {
console.log(`์ปดํฌ๋ํธ ์ธ๋ง์ด๋ ${number}`);
};
}, []);
return (
<div>
<span>Number: {number}</span>
<button onClick={onClickDelBtn}>์ซ์ ์ง์ฐ๊ธฐ</button>
</div>
);
};

5. deps ์ ํน์ ๊ฐ ๋ฃ๊ธฐ
deps์ ํน์ ๊ฐ์ ๋ฃ๊ฒ ๋๋ค๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ง์ดํธ ๋ ๋ useEffect()๊ฐ ํธ์ถ๋๊ณ deps์ ๋ฃ์ ํน์ ๊ฐ์ด ๋ฐ๋ ๋์๋ useEffect()๊ฐ ํธ์ถ๋๋ค. ์๋์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ deps์ ํน์ ๊ฐ์ด ์์ ๋์ ์์ ๋์ useEffect()๋ฅผ ๋น๊ตํด๋ณด์ง.
import React, { useEffect, useState } from 'react';
const Test = () => {
const [number, setNumber] = useState(1);
const onClickChangeBtn = () => {
const num = Math.floor(Math.random() * 100);
setNumber(num);
};
// ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋๋ง ์คํ
useEffect(() => {
console.log('์ปดํฌ๋ํธ ๋ง์ดํธ');
}, []);
// ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋๋ ์
๋ฐ์ดํธ ๋ ๋ ์ค์
useEffect(() => {
console.log(`์ปดํฌ๋ํธ ๋ง์ดํธ ๋๋ ์ปดํฌ๋ํธ ์
๋ฐ์ดํธ ${number}`);
}, [number]);
return (
<div>
<span>Number: {number}</span>
<button onClick={onClickChangeBtn}>์ซ์ ๋ฐ๊พธ๊ธฐ</button>
</div>
);
};
export default Test;์์ ์ฝ๋์์ useEffect()๊ฐ ๋ ๋ฒ ๋ณด์ธ๋ค. ๋ณด์ด๋ ์์๋๋ก 1๋ฒ useEffect(), 2๋ฒ useEffect()๋ผ๊ณ ๋ถ๋ฅด๊ฒ ๋ค.
1๋ฒ useEffect()์ deps์ ํน์ ๊ฐ์ด ์์ ๋น ๋ฐฐ์ด์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฒ์ ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋ ๋๋ง ํธ์ถ์ด ๋๋ค.
2๋ฒ useEffect()์ deps์๋ number๊ฐ์ด ๋ค์ด๊ฐ์๋ค. number์ ๊ฐ์ ์ซ์ ๋ฐ๊พธ๊ธฐ ๋ฒํผ์ ๋๋ฅผ ๋ ๋ง๋ค ๋ฐ๋๊ธฐ ๋๋ฌธ์ 2๋ฒ useEffect()๋ ์ซ์ ๋ฐ๊พธ๊ธฐ ๋ฒํผ์ ๋๋ฌ number๊ฐ์ด ๋ฐ๋ ๋ ๋ ๋ง๋ค ํธ์ถ์ด ๋๋ค.
์๋๋ ์ซ์ ๋ฐ๊พธ๊ธฐ ๋ฒํผ์ ๋๋ฅผ ๋ ๋ง๋ค ํธ์ถ๋๋ useEffect()์ ๊ฒฐ๊ณผ ์ฌ์ง์ด๋ค.

6. deps ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ตํ๊ธฐ
useEffect()์ deps์ ์์ฒด๋ฅผ ์๋ตํ๊ฒ ๋๋ค๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋ ๋ฟ๋ง ์๋๋ผ ๋ฆฌ๋๋๋ง ๋ ๋๋ง๋ค useEffect()๊ฐ ํธ์ถ๋๋ค.
import React, { useEffect, useState } from 'react';
const Test = () => {
const [number, setNumber] = useState(1);
const onClickChangeBtn = () => {
const num = Math.floor(Math.random() * 100);
setNumber(num);
};
useEffect(() => {
console.log('์ปดํฌ๋ํธ ๋ง์ดํธ ๋๋ ๋ฆฌ๋๋๋ง');
});
return (
<div>
<span>Number: {number}</span>
<button onClick={onClickChangeBtn}>์ซ์ ๋ฐ๊พธ๊ธฐ</button>
</div>
);
};
export default Test;์์ ์ฝ๋์์ ์ซ์ ๋ฐ๊พธ๊ธฐ ๋ฒํผ์ ๋๋ฅผ ๋ ๋ง๋ค number๊ฐ์ด ๋ฐ๊พธ๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ๊ฐ ๊ณ์ ๋ฆฌ๋๋๋ง ๋๋ค. ๊ทธ๋ฆฌ๊ณ useEffect()๋ฅผ ๋ณด๋ฉด deps๊ฐ ์์ ํ ์๋ต๋์ด ์๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋๋๋ง ๋ ๋ ๋ง๋ค useEffect()๊ฐ ํธ์ถ๋๋ค. ๋ค์ ๋งํด ํ๋ฆ์ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค.
์ซ์ ๋ฐ๊พธ๊ธฐ ๋ฒํผ์ ๋๋ฅธ๋ค.
number๊ฐ์ด ๋ฐ๋๋ค.์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋๋๋ง ๋๋ค.
useEffect()๊ฐ ํธ์ถ๋๋ค.
์๋๋ ์ซ์ ๋ฐ๊พธ๊ธฐ ๋ฒํผ๋ฅผ ๋๋ฅผ ๋ ๋ง๋ค useEffect()๊ฐ ํธ์ถ๋์ด ๊ณ์ ์ฐํ๋ ์ฝ์์ ์ฌ์ง์ด๋ค.

7. Conclusion
useEffect()๋ฅผ ์์ฃผ ์ฌ์ฉํ์๋ค. ํ์ง๋ง lifecycle๊ณผ๋ ์ฐ๊ด์ ์ง์ด ์๊ฐ์ ํ์ง ์์๋ค. ์ด๋ฒ ๊ณต๋ถ๋ฅผ ํตํด lifecycle๊ณผ ์ฐ๊ด์ ์ง์ด ์ดํดํ๋๋ก ๋ ธ๋ ฅ์ ํ๊ณ , cleanupํจ์์ ๋ํด์๋ ๋ง์ฐํ๊ฒ ์๊ณ ์์๋๋ฐ ์ด๋จ ๋ ์ฌ์ฉํ์ง๋ ์ ์ ์๋ ๊ณต๋ถ์๋ค.
์ฐธ๊ณ
[React] ๋ฆฌ์กํธ Hooks : useEffect() ํจ์ ์ฌ์ฉ๋ฒ 16. useEffect๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์ดํธ/์ธ๋ง์ดํธ/์ ๋ฐ์ดํธ์ ํ ์์ ์ค์ ํ๊ธฐ
๐ 2022-07-31
Last updated