[React] useEffect
useEffect๋ฅผ ์ข ๋ ์ง์ค์ ์ผ๋ก ๋ค๋ค๋ณผ๋งํ ๊ฐ์น๊ฐ ์๋ค๊ณ ๋๊ผ๋ค. ์ด๋ ๋ผ์ดํ์ฌ์ดํด๊ณผ ์ง๊ฒฐ๋์ด์๊ธฐ ๋๋ฌธ์ ๋ ์ ํํ ์๊ณ ์ฌ์ฉํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ฉด์ ๋ค์ ๋ฆฌ๋ค๊ธฐ ์ฑ ์ ์ค๋๋ง์ ํด์ ์ดํด๋ณด์๋ค.
UseEffect
useEffect๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ํน์ ์์ ์ ์ํํ๋๋ก ์ค์ ํ ์ ์๋ ํ ์ด๋ค.
componentDidMount + componentDidUpdate
componentDidMount + componentDidUpdate + componentWillUnmount
๋ง์ดํธ ๋ ๋๋ง ์คํํ๊ณ ์ถ์ ๋ (ComponentDidMount)
useEffect(() => {
console.log('๋ง์ดํธ๋ ๋๋ง');
},[]);
์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋งจ ์ฒ์ ๋ ๋๋ง ๋์ ๋๋ง ์คํํ๊ณ ์ถ์ ๋๋ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๋น ๋ฐฐ์ด์ ๋ฃ์ผ๋ฉด ๋๋ค.
๋ณดํต ๋ง์ดํธ ์์ ์ ์ฉํ๋ ์์
- props ๋ก ๋ฐ์ ๊ฐ์ ์ปดํฌ๋ํธ์ ๋ก์ปฌ ์ํ๋ก ์ค์
- ์ธ๋ถ API ์์ฒญ (REST API ๋ฑ)
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ (D3, Video.js ๋ฑ...)
- setInterval ์ ํตํ ๋ฐ๋ณต์์ ํน์ setTimeout ์ ํตํ ์์ ์์ฝ
ํน์ ๊ฐ์ด ์ ๋ฐ์ดํธ ๋ ๋๋ง ์คํํ๊ณ ์ถ์ ๋ (ComponentDidUpdate)
useEffect(() => {
console.log('์
๋ฐ์ดํธ๋ ๋');
},[update]);
useEffect์ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋๋ ๋ฐฐ์ด ์์ ์ ๋ฐ์ดํธ๋ ๋๋ง๋ค ๊ฒ์ฌํ๊ณ ์ถ์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ธ๋ง์ดํธ ๋ ๋(componentWillUnmount)
useEffect(() => {
console.log('์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ํ๋จ');
return () => {
console.log('์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์์ ์ฌ๋ผ์ง');
};
}, []);
unmount ๋ ๋๋ง ๋ท์ ๋ฆฌ ํจ์๋ฅผ ํธ์ถํ๊ณ ์ถ์ผ๋ฉด useEffect์ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๋น ๋ฐฐ์ด์ ๋ฃ์ผ๋ฉด๋๋ค.
๋ท์ ๋ฆฌํจ์(cleanup)
์ปดํฌ๋ํธ๊ฐ ๋ํ๋ ๋ -> ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ํ๋จ
์ฌ๋ผ์ง๋ -> ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์์ ์ฌ๋ผ์ง
๋ ๋๋ง๋ ๋๋ง๋ค ๋ท์ ๋ฆฌ ํจ์๊ฐ ๊ณ์ ๋ํ๋๋ค.
๋ท์ ๋ฆฌํจ์๊ฐ ํธ์ถ๋ ๋๋ ์ ๋ฐ์ดํธ๋๊ธฐ ์ง์ ์ ๊ฐ์ ๋ณด์ฌ์ค๋ค.
์ธ๋ง์ดํธ์์ ์ ์ฉํ๋ ์์
- setInterval, setTimeout ์ ์ฌ์ฉํ์ฌ ๋ฑ๋กํ ์์ ๋ค clear ํ๊ธฐ (clearInterval, clearTimeout)
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธ์คํด์ค ์ ๊ฑฐ