- effect(or side effect)๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ผ์ด๋๋ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๋ปํจ. ์๋ฅผ๋ค์ด http๋ฆฌํ์คํธ๋ฅผ ๋ณด๋ด๋ ๊ฒ ๋๋ ๋ธ๋ผ์ฐ์ ์ ์ฅ์(๋ก์ปฌ์ ์ฅ์ ๋ฑ)์ ๋ฌด์ธ๊ฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด๋ค. ๋ํ ์ฝ๋์์ ํ์ด๋จธ๋ ๊ฐ๊ฒฉ์ ์ค์ ํ ์ ์๋ค.
- ์๋ฒ์ ๋ฆฌํ์คํธ๋ฅผ ๋ณด๋ด๊ฑฐ๋ ์ ์ฌ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ฆฌ์กํธ๋ฅผ ํ์๋ก ํ์ง ์์. ๋ฆฌ์กํธ๋ ui๋ฅผ ๋ธ๋ผ์ฐ์ ์ ๋ณด์ฌ์ฃผ๋ ์ญํ ์ด๊ธฐ ๋๋ฌธ.
- ์๋ฅผ๋ค์ด state๊ฐ์ http๋ฆฌํ์คํธ๋ก ๋ณด๋ด๊ณ ๊ทธ์๋ํ http๋ฆฌํ์คํธ ์๋ต์ผ๋ก ์ด๋ค state๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋ฌดํ๋ฃจํ๋ก ๋น ์ง ์ ์์. ๋ฐ๋ผ์ ์ด๋ฐ ์ฌ์ด๋์ดํํธ๋ ์ง์ ์ ์ผ๋ก ์ปดํฌ๋ํธ ํจ์์ ๋ค์ด๊ฐ์๋ ์๋จ!!
- ๊ทธ๋ฌ๋ฏ๋ก effect๋ ์ผ๋ฐ์ ์ธ ์ปดํฌ๋ํธ ํจ์ ๋ฐ์์ ์ํ๋์ด์ผ ํจ -> ์ฌ์ด๋์ดํํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ useEffectํจ์๋ฅผ ์ฌ์ฉํ๋ค.
- useEffect(()=>{..}, [dependencies])
- ๋ชจ๋ ์ปดํฌ๋ํธ ํ๊ฐ ํ์ ์คํ๋์ด์ผ ํ๋ ํจ์, ์ง์ ๋ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ํจ์ ์คํ, ์ฌ์ด๋์ดํํธ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋จ.
return ()=>{};
- ์์กด์ฑ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฐฐ์ด, ๋น๊ฐ์ผ ๊ฒฝ์ฐ ์ค์ ๋ก ์ฑ์ด ์คํ๋ ๋ ํ๋ฒ๋ง ์คํ๋จ.
์์กด์ฑ์ ์ถ๊ฐํ ํญ๋ชฉ
: effect ํจ์์์ ์ฌ์ฉํ๋ ๋ชจ๋ "๊ฒ๋ค"์ ์ถ๊ฐํด์ผ ํ๋ค. ๊ตฌ์ฑ ์์(๋๋ ์ผ๋ถ ์์ ๊ตฌ์ฑ ์์)๊ฐ ๋ค์ ๋ ๋๋ง ๋์ด ์ด๋ฌํ "๊ฒ๋ค"์ด ๋ณ๊ฒฝ๋ ์ ์๋ ๊ฒฝ์ฐ, ์ปดํฌ๋ํธ ํจ์์ ์ ์๋ ๋ณ์๋ ์ํ, ์ปดํฌ๋ํธ ํจ์์ ์ ์๋ props ๋๋ ํจ์๋ ์ข ์์ฑ์ผ๋ก ์ถ๊ฐ๋์ด์ผ ํ๋ค.์์กด์ฑ์ ์ถ๊ฐํ์ง ์์๋ ๋๋ ํญ๋ชฉ
:์ํ ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ํ์๊ฐ ์๋ค. (์ง๋ ๊ฐ์์์ ํ๋ ๊ฒ์ฒ๋ผ setFormIsValid ์ฌ์ฉ): React๋ ํด๋น ํจ์๊ฐ ์ ๋ ๋ณ๊ฒฝ๋์ง ์๋๋ก ๋ณด์ฅํ๋ฏ๋ก ์ข ์์ฑ์ผ๋ก ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ๋ํ "๋ด์ฅ" API ๋๋ ํจ์๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์๋ค. fetch(), ๋ localStorage ๊ฐ์ ๊ฒ๋ค ๋ง์ด์ฃ (๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ๋ ํจ์ ๋ฐ ๊ธฐ๋ฅ, ๋ฐ๋ผ์ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ): ์ด๋ฌํ ๋ธ๋ผ์ฐ์ API/์ ์ญ ๊ธฐ๋ฅ์ React ๊ตฌ์ฑ ์์ ๋ ๋๋ง ์ฃผ๊ธฐ์ ๊ด๋ จ์ด ์์ผ๋ฉฐ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
import React, { useState, useEffect } from "react";
function App() {
const [counter, setCounter] = useState(0);
const onClick = () => {
setCounter((prev) => prev + 1);
};
console.log("i run all the time");
useEffect(()=>{
console.log("i run only once!");
});
return (
<div>
<h1>{counter}</h1>
<button onClick={onClick}>click</button>
</div>
);
}
export default App;
๐๐ป ๋ฒํผ์ ํด๋ฆญํ ๋๋ง๋ค effect ํจ์๊ฐ ์คํ๋จ.
useEffect(()=>{
console.log("i run only once!");
},[]);
๐๐ป ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋ effectํจ์๊ฐ 'ํ๋ฒ' ์คํ๋จ.
๐๐ป state๊ฐ ๋ณํด์ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ๋๋ง ๋๋๋ผ๋ effectํจ์๋ฅผ ์คํ๋์ง ์์!!
function App() {
const [counter, setCounter] = useState(0);
const [keword, setKeyword] = useState("");
const onClick = () => setCounter((prev) => prev + 1);
const onChange = (event) => setKeyword(event.target.value);
console.log("i run all the time");
// ๊ฒ์์ฐฝ์ ๋ฌด์ธ๊ฐ๋ฅผ ์ผ์ ๋, ๊ฒ์ API๋ฅผ ์ด์ฉํ๋ค๋ฉด,,
useEffect(() => {
console.log("CALL THE API...");
}, []);
console.log("SEARCH FOR", keyword);
return (
<div>
<input
value={keword}
type="text"
placeholder="Search here"
onChange={onChange}
/>
<h1>{counter}</h1>
<button onClick={onClick}>click</button>
</div>
);
}
๐๐ป ๊ฒ์์ฐฝ์ ๋ฌด์ธ๊ฐ๋ฅผ ์ผ์ ๋, ๊ฒ์ API๋ฅผ ์ด์ฉํ๋ค๋ฉด, ๊ฒ์์ฐฝ์ ์ ๋ ฅํ ๋๋ง๋ค ์ปดํฌ๋ํธ๊ฐ ์ฌ์คํ๋์ด ์ฑ๋ฅ์ ์ข์ง ์์.
useEffect(()=>{
console.log("SEARCH FOR", keyword);
}, [keyword]);
๐๐ป [keyword]์์กด์ฑ์ ์ถ๊ฐํ๋ฉด, keyword๊ฐ ๋ณํํ ๋๋ง๋ค ํด๋น effectํจ์๊ฐ ์คํ๋๊ณ , ๋ฒํผ ํด๋ฆญ ์ ์คํ๋์ง ์์!
๐๐ป ์ปดํฌ๋ํธ์ state๋ก ์ธํด ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ๋๋ง ๋๋๋ผ๊ณ ์ดํํธํจ์๋ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋์ด์ผ ์คํ๋๋ ๊ฒ!!
useEffect(() => {
const time = setTimeout(()=>{
if (keyword !== "" && keyword.length > 5) {
console.log("SEARCH FOR", keyword);
}
};, 300);
return(()=> clearTimeout(time));
}, [keyword]);
๐๐ป '๋๋ฐ์ด์ฑ'๊ธฐ์ : ์ผ์ ๋์ ํค ์
๋ ฅ์ ์์งํ๊ฑฐ๋ ํค ์
๋ ฅ ํ ์ผ์ ์๊ฐ๋์ ์ผ์ ์ค์ง๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ. ์๋ฅผ๋ค์ด 3์ด๋์ ์
๋ ฅํ ๊ฐ๋ค์ ์ ํจ์ฑ๊ฒ์ฌ๋ฅผ ํ์ง ์๊ณ , 3์ด ํ์ ์ ํจ์ฑ๊ฒ์ฌ๋ฅผ ํ๋ฒ๋ง ํจ.
๐๐ป clearTimeout(): ๋ค์์ ํค๊ฐ ์
๋ ฅ๋๋ฉด ์ ์ ์๋ ์๊ฐ์ ์ง์์ผํจ. ๊ทธ๋์ผ ์๋ก์ด ์๊ฐ์ด ์ค์ ๋จ. -> ๋ง์ง๋ง์ ์
๋ ฅํ ๊ฒ๋ถํฐ 3์ด๊ฐ ์ง๋๊ณ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ๋๊ฒ์.(๋ง์ง๋ง ํ์ด๋จธ๋ง ์๋ฃ๋จ.)
๐๐ป return ()=>{}; : ์ฒ์ ์คํ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ , effectํจ์๊ฐ ์คํ๋ ๋๋ง๋ค ์ ์ ์คํ๋จ!
๐๐ป โญ๏ธ 3์ด ๋์ ์ ํจ์ฑ๊ฒ์ฌ๋ ์ํ์ง๋ง, ํค์
๋ ฅ ๋ ๋๋ง๋ค(์๋๋ ์ดํํธํจ์๊ฐ ์คํ๋์ด์ผ ํจ) returnํจ์๋ ์คํ๋จ!! -> ๋ฆฌํดํจ์๋ ์ดํํธํจ์ ์คํ์ ์ ์คํํ๋ ํจ์๋๊น!!
import React, { useState } from "react";
function Hello() {
useEffect(()=>{
console.log("created :)");
return ()=>{
console.log("destroyed :(")
};
}, [])
return <p>Hello</p>;
}
function App() {
const [showing, setShowing] = useState(false);
const onClick = () => {
setShowing((prev) => !prev);
};
return (
<div>
{showing ? <Hello /> : null}
<button onClick={onClick}>{!showing ? "Hide" : "Show"}</button>
</div>
);
}
export default App;
๐๐ป ๋ฒํผ์ ํด๋ฆญํ๋ฉด Hello๊ฐ ๋ณด์ฌ์ง๊ณ ์์ด์ง๋ ์ฝ๋.
๐๐ป return ()=>{}; : Hello ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง๊ฑฐ๋ ์์ด์ง๋ return์ ํจ์๋ฅผ ์คํํจ.
๐๐ป ์๋ฅผ๋ค์ด์ ์ปดํฌ๋ํธ ์์ ๋๊ฐ์ useEffect ํ
์ด ์๊ณ ํจ์์์ return์ด ์๋ค๊ณ ํ์๋, ์ปดํฌ๋ํธ๊ฐ ์์ด์ง๋ฉด ํด๋น ๋๊ฐ์ ํ
๋ฆฌํด์ด ๋ชจ๋ ์คํ๋จ!