useEffect์ ์ฒซ ๋ฒ์งธ ์ธ์์ธ ์ฝ๋ฐฑํจ์๋ฅผ ๋น๋๊ธฐ ํจ์๋ก ์ฌ์ฉํ๋๊น ์๋ฌ ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋๋ ์ํฉ
โช (์ง๊ธ ๋น์ฅ ๊ฒฐ๊ณผ์ ๋ฌธ์ ๋ ์์ง๋ง ํฐ๋ฏธ๋ ์ฐฝ๊ณผ ์ฝ์ ์ฐฝ์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ณ ์๋ค!)


1. eslint ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๋ฅผ ํด์ํด๋ณด๋ฉด useEffect์ ์ฝ๋ฐฑ์ ๊ฒฝ์ ์ํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋๊ธฐ์ ์ผ๋ก ์คํ๋ฉ๋๋ค. ๋ผ๊ณ ๋์ด ์๋ค.
โช ๋น๋๊ธฐ ์์
์ด ํฌํจ๋ useEffect ์ฝ๋ฐฑ์์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ฌ๋ฌ ๋น๋๊ธฐ ์์
์ด ์๋ก ๊ฒฝ์ํ์ฌ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋์๋ค!
๊ฒฝ์ ์ํ(Race Condition)
๋น๋๊ธฐ ์ฝ๋์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ค ํ๋๋ก, ๋ ๊ฐ ์ด์์ ๋น๋๊ธฐ ์์ ์ด ๋์์ ๊ฒฝ์ํ์ฌ ์ํ๋ฅผ ๋ณ๊ฒฝํ ๋ ์์ธกํ ์ ์๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ ๋งํ๋ค.
2. ์ฝ์์ฐฝ ์๋ฌ ๋ฌธ๊ตฌ๋ฅผ ํด์ํด๋ณด๋ฉด ์ ๋ฆฌ(Clean-Up) ์ธ์๋ ์ด๋ ํ ๊ฒ๋ ๋ฐํํด์๋ ์ ๋ฉ๋๋ค.๋ผ๊ณ ๋์ด ์๋ค.
โช useEffect์ ์ฝ๋ฐฑ ํจ์๋ Promise๋ฅผ ๋ฐํํ๋ฉด ์๋๋๋ฐ ๋น๋๊ธฐ ํจ์๋ก Promise๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค!
useEffect์ ์ฒซ ๋ฒ์งธ ์ธ์์ธ ์ฝ๋ฐฑํจ์๋ฅผ ๋น๋๊ธฐ ํจ์๋ก ์ฌ์ฉํ๋ฉด ์๋์ง๋ง, useEffect ๋ด๋ถ์์ ๋น๋๊ธฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ useEffect ๋ด๋ถ์์ ๋น๋๊ธฐ ํจ์๋ฅผ ์ ์ธํด ์คํํ๊ฑฐ๋, ์ฆ์ ์คํ ํจ์๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค!
๋น๋๊ธฐ ํจ์ ์ ์ธํด์ ์คํํ๊ธฐ
useEffect(() => {
const fetchData = async () => {
try{
const response = await fetch(url);
if(!response.ok){
throw new Error("API ์์ฒญ ์๋ฌ ๋ฐ์!");
}
console.log("API ์์ฒญ ์ฑ๊ณต!");
}catch(err){
console.error(err);
}
}
fetchData();
}, [url])
๋น๋๊ธฐ ์ฆ์ ์คํ ํจ์ ์ฌ์ฉ
useEffect(() => {
(async () => {
try{
const response = await fetch(url);
if(!response.ok){
throw new Error("API ์์ฒญ ์๋ฌ ๋ฐ์!");
}
console.log("API ์์ฒญ ์ฑ๊ณต!");
}catch(err){
console.error(err);
}
})();
}, [url])
useEffect ๋ด๋ถ์์ ๋น๋๊ธฐ ํจ์๊ฐ ์์ฑ๋๊ณ ์คํ๋๋ ๊ฒ์ ๋ฐ๋ณตํ๋ฏ๋ก ํด๋ฆฐ ์ (Clean-Up) ํจ์์์ ์ด์ ๋น๋๊ธฐ ํจ์์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข๋ค. fetch์ ๊ฒฝ์ฐ abortController ๋ฑ์ผ๋ก ์ด์ ์์ฒญ์ ์ทจ์ํ๋ ๊ฒ์ด ์์ ํ๋ค!
useEffect(() => {
const controller = new AbortController();
(async () => {
try{
const result = await fetch(url, { signal: controller.signal });
setData(await result.json())
}catch(err){
console.error(err);
}
})();
// ํด๋ฆฐ ์
(Clean-Up) ํจ์ ์์ฑ
return () => controller.abort();
}, [url])