๐จโ๐ป์ค๋ ๊ณต๋ถํ ๊ฒ
ํ์ฌ ์ด๋ค ์คํ๋ฆฐํธ๋ฅผ ์งํ ์ค์ด๊ณ , ์ด๋ค ๋ฌธ์ ์ ๋ถ๋ชํ๋์?
HA์ํ ์ํด useEffect๋ฅผ ๋ค์ ๊ณต๋ถํ๋ ์ค cleanupํจ์์ ๋ํด ์ดํด๊ฐ ๋์ง ์์์ ์ง๋ฌธ ๋๋ฆฝ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ Ajax์์ฒญ์ ํด์ state๋ฅผ ๊ฐฑ์ ํ๋ ์ฝ๋์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ value๋ state๋ ๊ฐ ์ปดํฌ๋ํธ์ ๊ฐ์ ๋ ๋๋ง๋๊ฒ ๋๋ ์ฝ๋์ ๋๋ค.
const [value, setValue] = useState([]);
useEffect(()=>{
async () => {
let URL = 'GET์์ฒญํ ์ฃผ์..'
fetch(URL)
.then((res) => res.json())
.then((el) => {
setValue(el);
})
}
}, [])
ํ์ง๋ง ์ด๋ ๊ฒ ๋๋ฉด
Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
์ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋์ cleanup ํจ์๋ฅผ ์จ์ผํ๋ค. ๋ผ๊ณ ํด์ Ajax์์ฒญ์ useEffect์์ ํ๋ฒ๋ง ๋๋๋ก ํ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ํ๋ ์ด์ฐ์ด์ฐ ์์ ๊ฐ์ ์ค๋ฅ๋ ๋์ง์๋๋ฐ, ์ดํด๊ฐ ๋์ง ์์ต๋๋ค..
์ ์ด์ useEffect์ ๋๋ฒ์งธ์ธ์์ ๋น๋ฐฐ์ด ํน์ ์ธ์๋ฅผ ๋ฃ์ง ์์ผ๋ฉด ๋ฆฌ์กํธ๊ฐ ์ฒ์ ๋ ๋๋ง์ด ๋ ์ดํ์ useEffect๊ฐ ํ๋ฒ ์คํ๋๋ ๊ฒ์ผ๋ก ์๊ณ ์๋๋ฐ ์ ๊ฐ ์๋ ๋๋ก ํ๋ฒ๋ง ์คํ๋๋ฉด ์ ๋ ๊ฒ ์ cleanupํจ์๋ฅผ ๊ตฌํํด์ Ajax์์ฒญ์ด ํ๋ฒ๋ง ๋๋๋กํด์ผํ๋์ง, ์ ์ ๋ ๊ฒ cleanup ํจ์๋ผ๊ณ ํ๋ ๊ฒ์ useEffect์์ ๊ตฌํํด์ผ ๋๋์ง ์ดํด๊ฐ ์ ๋์ง ์์ต๋๋ค.
const [value, setValue] = useState([]);
useEffect(()=>{
let forCleanup = true;
async () => {
let URL = 'GET์์ฒญํ ์ฃผ์..'
fetch(URL)
.then((res) => res.json())
.then((el) => {
if(forCleanup){
setValue(el);
}
})
}
return ()=>{
forCleanup = false;
}
}, [])
์ ๋๋ ๋ถ๋ถ์ ํด๊ฒฐํ๊ธฐ ์ํด์ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ๋
ธ๋ ฅ์ ํ๋์?
๋ฆฌ์กํธ ๊ณต์๋ฌธ์์ ์ฌ๋ ค ๊ธ๋ค์ ์ฐธ์กฐํ์ฌ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ๊ณ ์ณ๋ณด์์ต๋๋ค.
๋ํ useEffect์ ๋๋ฒ์งธ์ธ์๊ฐ ๋น๋ฐฐ์ด์ธ ๊ฒฝ์ฐ ์ฒ์ ๋ ๋๋งํ ํ๋ฒ๋ง useEffect๊ฐ ์คํ๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ณ ์์ด์ AJAX์์ฒญ ๋ํ ํ๋ฒ๋ง ๋๋์ง ์๊ณ ์์๋๋ฐ, cleanup ํจ์๋ฅผ ์ฐ๋ผ๋ ์ค๋ฅ๊ฐ ๋์์ AJAX์์ฒญ์ด ํ๋ฒ๋ง ์คํ๋๊ฒ ์์๊ฐ์ด ํ๋๋ ์ค๋ฅ๋ ์ฌ๋ผ์ง๋๋ฐ, ์ ์ ๋ ๊ฒ cleanupํจ์๋ฅผ ๊ตฌํํ์ง ์์ผ๋ฉด ๋งค๋ชจ๋ฆฌ๋์๊ฐ ๋๋ค๋ ์ค๋ฅ๊ฐ ๋จ๋์ง๊น์ง ์ดํด๊ฐ ์๋๊ธฐ๊น์ง ์ฌ๋ฌ ๊ฒ์๊ณผ ์๋๋ฅผ ํ์ต๋๋ค...