You will learn
- effect๋ ๋ฌด์์ธ์ง
- effect์ ์ด๋ฒคํธ์ ์ฐจ์ด
- ์ปดํฌ๋ํธ์์ effect๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ
- ๋ถํ์ํ effect ์ฌ์คํ์ ๊ฑด๋๋ฐ๋ ๋ฐฉ๋ฒ
- ์ ๊ฐ๋ฐ ํ๊ฒฝ์์ effect๊ฐ ๋ ๋ฒ ์คํ๋๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง
์ดํํธ๋?
๋ฆฌ์กํธ ์ปดํฌ๋ํธ ์์๋ ๋ ์ข ๋ฅ์ ์ฝ๋๊ฐ ์๋ค.
- ๋ ๋๋ง ์ฝ๋ : ์์ ํจ์
- ์ด๋ฒคํธ ํธ๋ค๋ฌ : side effect ์ ๋ฐ
๊ทธ๋ฐ๋ฐ ์ด ๋๊ฐ์ง๋ก ๋ถ์กฑํ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ฑํ ๋ฐฉ ์ ์ฅ๊ณผ ๊ฐ์ด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋ ์คํ๋์ด์ผ ํ๋ ์ฝ๋๋ ์๋ค. ์์ ํจ์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋ ๋๋ง ์ฝ๋์ ํฌํจ๋ ์ ์๊ณ , ๋ฑํ ์๋ฒ์ ์ฐ๊ฒฐํ ์ด๋ฒคํธ๊ฐ ์๋๊ฒ๋ ์ด์ํ๋ค.
์ด๋ด๋ ์ฌ์ฉํ๋๊ฒ Effect๋ค. ๋ ๋๋ง๋ ํ๋์ ์ด๋ฒคํธ๋ผ๋ฉด ๋ ๋๋ง์ด๋ผ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ผ๊ณ ๋ณผ ์ ์์๊น.
์ดํํธ์ ์ฃผ ์ฌ์ฉ ๋ชฉ์ ์ ๋ฆฌ์กํธ ๋ฐ์ ์ธ๋ถ ์์คํ (๋ธ๋ผ์ฐ์ DOM api, ๋คํธ์ํฌ, ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ)๊ณผ์ ์ํต์ด๋ค. ๊ทธ๋์ ์ด๋ฌํ ๋ชฉ์ ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ์ง ์๋๊ฒ์ด ์ข๋ค.
์ดํํธ ์์ฑํ๊ธฐ
1. ์ดํํธ ์ ์
- ์ปดํฌ๋ํธ์ ์ต์์ ๋ ๋ฒจ์ ์์ฑํ๋ค.
- ์ดํํธ๋ ํ๋ฉด์ด ์ ๋ฐ์ดํธ ๋ ํ์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ์ ๋๋ ์ด๊ฐ ๋ฐ์ํ ์ ์๋ค.
useEffectํ ์์ ์์ฑํด์ผ ํ๋ ์ด์ ๋ ๋จผ์ ๋ ๋๋ง ์ฝ๋์ ์์์ฑ์ ๋ฐฉํดํ์ง ์๊ธฐ ์ํจ์ด๊ธฐ๋ ํ์ง๋ง, ๋ ๋๋ง ์ด์ ์๋ ์ดํํธ์์ ์ฌ์ฉํ DOM ๋ ธ๋๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
2. ์์กด์ฑ ๋ฐฐ์ด
๊ธฐ๋ณธ์ ์ผ๋ก ์ดํํธ๋ ๋ชจ๋ ๋ ๋๋ง๋ง๋ค ์คํ๋๋๋ฐ, ๋ง์ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํ๊ฑฐ๋(ํค๋ณด๋ ์ ๋ ฅ๋ง๋ค ์ฑํ ์๋ฒ์ ์ฐ๊ฒฐ), UI๋ฅผ ๋ง๊ฐ๋จ๋ฆฐ๋ค(ํค๋ณด๋ ์ ๋ ฅ๋ง๋ค fade-in ์ ๋๋ฉ์ด์ ). ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์์กด์ฑ ๋ฐฐ์ด์ ์ดํํธ ์คํ์ ์ ๋ฐํ๋ ๋ณ์๋ค์ ๋ฃ์ด ์ดํํธ ์คํ์ ํน์ ํ ์ ์๋ค.
3. ํด๋ฆฐ์ ํจ์
์ดํํธ๋ ๋ฆฌ์กํธ ์ธ๋ถ์ ์ํตํ๋ ์ฐฝ๊ตฌ์ด๊ธฐ ๋๋ฌธ์, ๋ฐ๋์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ฐ์ง ์๋ค. ๊ทธ๋์ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ฑ๋ก, ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ธ์คํด์ค ์์ฑ, ์น์์ผ ์ฐ๊ฒฐ๊ณผ ๊ฐ์ ์ฝ๋๋ค์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ ธ๋(์ธ๋ง์ดํธ) ๊ณ์ ๋จ์์๊ฒ ๋๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ํด์งํด์ฃผ๋ ํด๋ฆฐ์ ํจ์๊ฐ ํ์ํ๋ค.
ref ๋ ์์กด์ฑ ๋ฐฐ์ด์ ํฌํจ๋์ง ์๋๋ค
Ref ๊ฐ์ฒด๋ ๋ฆฌ์กํธ์์ ๋ณ๋๋ก ๋ณด๊ดํ๋ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๊ต์ฒด๋์ง ์๋๋ค. ๊ทธ๋์ ์ํ์ ๋ฌ๋ฆฌ ๋ ๋๋ง ์ฌ์ด์๋ ๋ฐ๋์ง ์๋๋ค. ๊ทธ๋์ ๋น๋ก ์ดํํธ ์์์ ref๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ๊ตณ์ด ์์กด์ฑ ๋ฐฐ์ด์ ref๋ ์ถ๊ฐํ์ง ์์๋ ๋๋ค. ์๋ํ๋ฉด ๋ฃ์ด๋ ์ด์ฐจํผ ์ดํํธ ์คํ์ ์ด๋ฐํ์ง ์์ํ ๋๊น.
๋ฐ์ดํฐ ํจ์นญ์ ๊ณ ๋ คํ ์
๋ฌธ์์์๋ ์ดํํธ ์์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ถ์ฒํ๊ณ ์์ง ์๋ค. ์ง๊ธ๊น์ง ๋ง์ด ์ฌ์ฉํด์จ ํจํด์์๋ ๋ถ๊ตฌํ๊ณ ๋๋ ทํ ๋จ์ ์ด ์์ด์ TanStack Query, useSWR๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ฆฌ์กํธ ํ์คํ ํ๋ ์์ํฌ๋ค์ ์ฌ์ฉํ๋๊ฒ์ ๊ถ์ฅํ๋ค.
- ์ํฐํด ํ์์ ์ผ์ผํค๊ธฐ ์ฝ๋ค. ์ดํํธ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฉด ์ปดํฌ๋ํธ ํธ๋ฆฌ ์์์๋ถํฐ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ, ์์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋๋ค. ๋คํธ์ํฌ ํ๊ฒฝ์ด ์ข์ง ์๋ค๋ฉด ์ ์ฒด ๊ณผ์ ์ด ๋งค์ฐ ๊ธธ์ด์ง๊ฒ ๋๋ค.
- ์บ์ฑ ๋์ง ์๋๋ค. ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ ๋๋ฉด ๊ฐ์ ธ์๋ ๋ฐ์ดํฐ๊ฐ ๋ชจ์กฐ๋ฆฌ ์ฌ๋ผ์ง๊ณ ๋ค์ ๋ง์ดํธ๋ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ค์ ๊ฐ์ ธ์์ผ ํ๋ค.
- ์ฝ๋๊ฐ ํ์ ์ด์์ผ๋ก ๊ธธ์ด์ง๋ค. ์์ฃผ ๋ฐ์ํ๋ ๋ฒ๊ทธ์ธ ๋ ์ด์ค ์ปจ๋์ ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ํ๋๊ทธ ๋ณ์๋ฅผ ๋ฃ๊ณ , ์กฐ๊ฑด๋ฌธ๊ณผ ํด๋ฆฐ์ ํจ์๊น์ง ์์ฑํ๋๊ฒ ์ข์๋ฐ ์ด๋ฌ๋ฉด ๋จ์ํ ๋ฐ์ดํฐ ํจ์นญ ๊ธฐ๋ฅ์๋ ๋ง์ ์ค์ ์ฝ๋๊ฐ ์ถ๊ฐ๋๋ ์ .
์์ ๋ฌธ์
1,2 ๋ฒ ๋ฌธ์ ๋ ์ฌ์์ ์๋ต.
3. Strict Mode
export default function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
function onTick() {
setCount(c => c + 1);
}
setInterval(onTick, 1000);
}, []);
return <h1>{count}</h1>;
}
๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก Strict Mode๊ฐ ์ ์ฉ๋์ด ์๋๋ฐ, ์ดํํธ๋ฅผ ๋ ๋ฒ ์คํํ๋ค. ๊ทธ๋์ setCount(c=>c+1)์ด ๋ ๋ฒ์ฉ ์คํ๋๋ฉด์ ์นด์ดํฐ๊ฐ ์ด๋น 2 ์ฉ ์ฆ๊ฐํ๊ฒ ๋๋๊ฒ.
4. Race Condition ๋ฌธ์
export default function Page() {
const [person, setPerson] = useState('Alice');
const [bio, setBio] = useState(null);
useEffect(() => {
setBio(null);
fetchBio(person).then(result => {
setBio(result);
});
}, [person]);
return (
์ด๋ ๊ฒ ์ดํํธ์์ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ ํจ์นญ์ ํ๋ฉด ๋ฐ์ํ๊ฒ ๋๋ ๋ฌธ์ ๊ฐ ๋ ์ด์ค ์ปจ๋์
๋ฌธ์ ๋ค. person1 ์ ์ ํํ๋ค๊ฐ person2๋ก ๊ณง๋ฐ๋ก ๋ฐ๊ฟจ๋๋ฐ, person1์ ๋ํ ์์ฒญ์ ์๋ต์ด ๋ ๋ฆ๊ฒ ๋์ฐฉํ๋ฉด person = person2 ์ธ ์ํ์ด์ง๋ง bio = person1Bio๊ฐ ๋๋ ๋ฌธ์ .
useEffect(() => {
let ignore = false;
setBio(null);
fetchBio(person).then(result => {
if (!ignore) {
setBio(result);
}
});
return () => {
ignore = true;
}
}, [person]);
๊ทธ๋์ ๋น๋๊ธฐ ๋ฐฉ์์ ๋ฐ์ดํฐ ํจ์นญ์์ ignore ๊ฐ์ ํ๋๊ทธ ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.

