ํด๋ฆฐ์ ์์ ์ด ํ์ํ effect
useEffect(() => {
setFormIsValid(
enteredEmail.includes("@") && enteredPassword.trim().length > 6
);
}, [enteredEmail, enteredPassword]);
setFormIsValid()ํจ์๋ enteredEmail, enteredPassword๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค state๊ฐ ์ ๋ฐ์ดํธ๋๋ค. ==>> ์ข์ง ์๋ค!!
ํจ์ ์ปดํฌ๋ํธ ์คํ์ด ํธ๋ฆฌ๊ฑฐ๋์ ๋ฆฌ์กํธ๋ DOM์์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ ํ์ํ ์ง ์ฌ๋ถ๋ฅผ ํ์ธํด์ผ ํ๋ค. ๊ทธ๋์ enteredEmail, enteredPassword๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฌ๋ถํ์ธ์ ๋ถํ์ํ๋ค.
๋ด๊ฐ ํ๊ณ ์ถ์ ๊ฒ
1. ์ผ์ ๋์ ํค ์ ๋ ฅ์ ์์งํ๋ ๊ฒ.
2. ํค ์ ๋ ฅ ํ ์ผ์ ์๊ฐ ๋์ ์ผ์ ์ค์ง๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ.
=> ์ฌ์ฉ์๊ฐ ํ์ดํํ๋ ๋์์๋ ์ ํจํ ์ด๋ฉ์ผ ์ฃผ์๋ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํ์ง ๋ง๊ณ , ์ฌ์ฉ์๊ฐ ํ์ดํ์ ๋ฉ์ถ ๋ ๊ทธ๋์์ผ ํ์ธํ๋ค.
์ฌ์ฉ์๊ฐ ๋ค ์ ๋ ฅํ ๊ฒ ๊ฐ์ผ๋ ํ๋ฒ ํ์ธํด๋ณด์! => ๋๋ฐ์ด์ฑ
์ด๊ฒ์ setTimeout()๊ณผ useEffect๋ฅผ ์ฌ์ฉํ๋ฉด ๊ตฌํํ๊ธฐ ์ฝ๋ค.
useEffect(() => {
console.log("checking form validity!!");
setTimeout(() => {
setFormIsValid(
enteredEmail.includes("@") && enteredPassword.trim().length > 6
);
}, 500);
}, [enteredEmail, enteredPassword]);
500๋ฐ๋ฆฌ์ด ํ์๋ง ์ด ์์ (์ ํจ์ฑ ๊ฒ์ฌ)์ ์ํํ๋ค.
๊ทผ๋ฐ ์์ ์ฝ๋๋ ๋ชจ๋ ํค ์ ๋ ฅ์ ๋ํด ํ์ด๋จธ๋ฅผ ์ค์ ํ๊ฑฐ๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ํ์ด๋จธ๋ฅผ ์ ์ฅํ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์์ ํค๊ฐ ์ ๋ ฅ๋๋ฉด ์ง์ด๋ค. ์ฆ ํ์ด๋จธ๊ฐ ํ ๋ฒ์ ํ๋๋ง ์คํ๋๋๋ก!
500๋ฐ๋ฆฌ ์ด ํ์ ์๋ฃ๋๋ ํ์ด๋จธ ํ๋๋ง ์๊ธฐ๊ณ , ์ฌ์ฉ์๊ฐ ์๋ก ํค๋ฅผ ์ ๋ ฅํด์ ํ์ด๋จธ๋ฅผ ๋ค์ ์์ํ๊ธฐ๊น์ง๋ clear๋๋ ๊ฒ์ด๋ค.
useEffect(()=>{
์คํ์ํฌ ์ฝ๋
return ()=> {} ๐ ์ฌ๊ธฐ์ ํด๋ฆฐ์
ํจ์๋ฅผ ์จ๋ณด์
}, [])
useEffect ํจ์๊ฐ ์คํ๋ ๋๋ง๋ค (์ฌ์ค ์คํ๋๊ธฐ ์ ์), ์ฒ์ ์คํ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ํด๋ฆฐ์ ํจ์๊ฐ ์คํ๋๋ค.
๋ํ ์ด ํด๋ฆฐ์ ํจ์๋ ์ดํํธ๋ฅผ ํน์ ํ ์ปดํฌ๋ํธ๊ฐ DOM์์ ๋ง์ดํธ ํด์ ๋ ๋๋ง๋ค ์คํ๋๋ค. ์ฆ, ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฌ์ฉ๋ ๋๋ง๋ค!
ํด๋ฆฐ์ ํจ์๊ฐ ์คํ๋๋ ๊ฒฝ์ฐ ์ ๋ฆฌ
1. ๋ชจ๋ ์๋ก์ด sideEffect ํจ์๊ฐ ์คํ๋๊ธฐ ์ ์ ์คํ๋๋ค.
2. ์ปดํฌ๋ํธ๊ฐ ์ ๊ฑฐ๋๊ธฐ ์ ์ ์คํ๋๋ค.
(๋จ, sideEffect ํจ์๊ฐ ์คํ๋๊ธฐ ์ ์๋ ์คํ๋์ง ์๋๋ค. )
useEffect(() => {
const identifier = setTimeout(() => {
console.log("checking form validity!!");
setFormIsValid(
enteredEmail.includes("@") && enteredPassword.trim().length > 6
);
}, 500);
return () => {
console.log("clean up!!!!");
clearTimeout(identifier);
}; // ์ด๊ฑด clean up ํจ์์ด๋ค.
}, [enteredEmail, enteredPassword]);
์ ํจ์ ํด์
ํด๋ฆฐ์ ํจ์๊ฐ ์คํ๋ ๋๋ง๋ค ํด๋ฆฐ์ ํจ์๊ฐ ์คํ๋๊ธฐ ์ ์ ์ค์ ๋ ํ์ด๋จธ๋ฅผ ์ง์ด๋ค.
๋ฐ๋ผ์ ๋ค์ sideEffect๋ฅผ ์คํํ ๋๊ฐ ๋๋ฉด ์๋ก์ด ํ์ด๋จธ๋ฅผ ์ค์ ํ ์ ์๋ค.
์ฆ, ์๋ก์ด ํ์ด๋จธ๋ฅผ ์ค์ ํ๊ธฐ ์ ์ ๋ง์ง๋ง ํ์ด๋จธ๋ฅผ ์ง์ฐ๋ ๊ฒ์ด๋ค.
useEffect ์ด์ ๋ฆฌ
useEffect๊ฐ ์๋ํ๋ ๋ฐฉ์
์ธ์ useEffect์ ์ด๋ค ๋ถ๋ถ์ด ์์๋๊ณ ์คํ๋๋์ง ๊ผญ ์๊ธฐ!!!
์์กด์ฑ ๋ฐฐ์ด์ ์์ ์์ ๋ ๊ฒฝ์ฐ (๋น ๋ฐฐ์ด๋ ์์๋) =>
ํด๋น ์ปดํฌ๋ํธ๊ฐ ์ฒ์์ผ๋ก ๋ ๋๋ง (์ฒ์์ผ๋ก ๋ง์ดํธ)๋๊ณ , ๋ชจ๋ ์ปดํฌ๋ํธ ๋ ๋๋ง ์ฃผ๊ธฐ ํ์ useEffect ์์ ์๋ ํจ์๊ฐ ์คํ๋๋ค.
์์กด์ฑ ๋ฐฐ์ด์ด ๋น์ด์์ ๋ (๋น ๋ฐฐ์ด์ผ ๋) =>
ํด๋น ์ปดํฌ๋ํธ๊ฐ ์ฒ์์ผ๋ก ๋ ๋๋ง (์ฒ์์ผ๋ก ๋ง์ดํธ)๋ ๋๋ง ์คํ๋๋ค.
(๊ทธ ์ดํ์ ๋ ๋๋ง ์ฃผ๊ธฐ์๋ ์คํ๋์ง ์๋๋ค. )
์์กด์ฑ์ ์ถ๊ฐํ ๊ฒฝ์ฐ=>
์ปดํฌ๋ํธ๊ฐ ์ฒ์์ผ๋ก ๋ ๋๋ง (์ฒ์์ผ๋ก ๋ง์ดํธ) ์คํ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์กด์ฑ ๋ฐฐ์ด์ ์ถ๊ฐํ state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ๋๋ค.
์์กด์ฑ์ ์ถ๊ฐํ ๊ฒฝ์ฐ && ํด๋ฆฐ์ ํจ์ =>
useEffect ์์ ์๋ ํจ์๊ฐ ์คํ๋๊ธฐ ์ ์ ์คํ๋๋ค. ํ์ง๋ง ์ฒ์ ์คํ๋๊ธฐ ์ ์๋ ์คํ๋์ง ์๋๋ค.
์์กด์ฑ ๋ฐฐ์ด์ด ๋น์ด์์ ๋ (๋น ๋ฐฐ์ด์ผ ๋) && ํด๋ฆฐ์ ํจ์ =>
์ปดํฌ๋ํธ๊ฐ ์ ๊ฑฐ๋๋ฉด ์คํ๋๋ค. (์ปดํฌ๋ํธ๊ฐ DOM์์ ์ ๊ฑฐ ๋ ๋ ์คํ๋จ)