
๐ก๋ ธ๋ง๋์ฝ๋ ๋๊ผฌ์ค์ ๊ฐ์๋ฅผ ๋ณด๋ฉฐ ๊ณต๋ถํ๋ ์๋ฆฌ์ฆ์ ๋๋ค.
state๊ฐ ๋ณํ๋ Button์ ์ผ๋จ ๋ง๋ค์๋ค.
import { useState } from 'react';
function App() {
const [counter, setValue] = useState(0);
const onClick = () => setValue((prev) => prev + 1);
console.log('I RUN ALL THE TIME');
return (
<div>
<h1>{counter}</h1>
<button onClick={onClick}>ํด๋ฆญํด๋ฆญ</button>
</div>
);
}
export default App;
useState์ ์ฌ์ฉ๋ฌธ๋ฒ์ด ์ข ๋ค๋ฅด์ง?
react๋ฅผ installํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ React.useState(init)๋ฌธ๋ฒ์ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ๋ก useState(init)๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ณธ๋ก ์ผ๋ก ๋์ด๊ฐ์ ์ฝ์์ ํ์ธํด๋ณด๋ฉด...?
state๊ฐ ๋ณํ ๋ ๋ง๋ค ์ฝ์์ด ์ฐํ๋ ๊ฑธ ๋ณผ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ์ ๋ฑ ํ ๋ฒ๋ง ํธ์ถํ๊ณ ์ถ์ ๋๋ ์ด๋ป๊ฒ ํด์ผํ ๊น?
์๋ฅผ ๋ค๋ฉด api๋ฅผ ํธ์ถํ๋ค๊ณ ํ์ ๋, ์ด ๋ฐฉ์๋๋ก๋ผ๋ฉด state๊ฐ ๋ณํ ๋๋ง๋ค api๋ฅผ ๊ณ์ ํธ์ถํด์ผํ๋ค. ๊ทธ๋ด ํ์๊ฐ ์์๊น? (์์ ์๋ ์๊ฒ ์ง๋ง!)
useEffect
useState์ ๋ง์ฐฌ๊ฐ์ง๋ก React Hook์ ์ผ์ข ์ด๋ค. ๋๊ฐ์ argument(์ ๋ฌ์ธ์)๋ฅผ ๊ฐ์ง๋ค.
useEfect๋ฅผ importํ๊ณ ์ฒซ๋ฒ์งธ argument์๋ ์คํํ๊ณ ์ ํ๋ ํจ์๋ฅผ, ๋๋ฒ์งธ argument๋ [๋๊ดํธ]๋ก ๋จ๊ฒจ๋ ์ฑ๋ก ์คํํด๋ณด์.
import { useState, useEffect } from 'react';
function App() {
const [counter, setValue] = useState(0);
const onClick = () => setValue((prev) => prev + 1);
console.log('I RUN ALL THE TIME');
const iRunOnlyOnce = () => {
console.log('I RUN ONLY ONCE');
};
useEffect(iRunOnlyOnce, []);
return (
<div>
<h1>{counter}</h1>
<button onClick={onClick}>ํด๋ฆญํด๋ฆญ</button>
</div>
);
}
export default App;
๊ทธ๋ฐ๋ฐ ๋ถํ๋ฏ ๋์ ๋ ์ ์ ๋ค์ ๋์ฒด ์ ์ ๋ฌ๋๊ฑธ๊น?
๋ต์ index.js์ ์๋ค.
root.render ํจ์์ <React.StrictMode>์ ์๋ค.
๋ฆฌ์ํธ ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด StrictMode๋ ๋ฒ๊ทธ๋ฅผ ์ฐพ๊ธฐ์ํด Re-render๋ฅผ ํ๋ค๊ณ ์ ํ์๋ค.
๋๋ ์๊ฒฉํ ๋ชจ๋๊ฐ ํ์์๋ ์ํ์ด๋ฏ๋ก ๊ณผ๊ฐํ ์ง์ ๋ค.
ํ ๋ฒ์ฉ๋ง render ๋๋ ๊ฒ ํ์ธ!
๋ค์ ๋ณธ๋ก ์ผ๋ก ๋์์์
useEffect์ฌ์ฉํด ๋ดค์ผ๋๊น ์ ์์ด๊ฐ ์ด๋ค ๊ธฐ๋ฅ์ ํ๋์ง ํ์ธํด๋ณด์.

์ค, useEffect๋ฅผ ์ฌ์ฉํ ํจ์๋ ํ ๋ฒ๋ง ์คํ๋๋ค.
๊ทธ๋ ๋ค๋ฉด useEffect์ ๋๋ฒ์งธ argument๋ ์ด๋ค ๊ธฐ๋ฅ์ ๊ฐ์ก์๊น?
useEffect๋ state์ ๋ณํ์ ๋ฐ๋ผ ํจ์๊ฐ ์คํ๋๋๋ก ๋๋ reactHook์ด๋ผ๊ณ ์๊ฐ๋๋ค.
์๊น ์ธ๊ธํ๋ฏ์ด useEffect๋ ๋๊ฐ์ ์ ๋ฌ์ธ์๋ฅผ ๊ฐ๋๋ฐ ์ฒซ ๋ฒ์งธ ์ธ์๋ ์คํ๋๋ ํจ์. ๋๋ฒ์งธ ์ธ์๋ ํจ์๊ฐ ์คํ๋๋ ๊ธฐ์ค์ . ์ฆ, ์์กด๊ฐ ์ด๋ค.
useEffect(() => {
console.log('I RUN ONLY ONCE');
}, []);
์ ์ฝ๋๋ฅผ ์์๋ก ๋ค์๋ฉด, ์ฒซ ๋ฒ์งธ ์ธ์๋ console์ด๊ณ , ๋ ๋ฒ์งธ ์ธ์(์์กด๊ฐ)๋ ๋น๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ฝ์์ ๋จ ํ ๋ฒ๋ง ์ถ๋ ฅ์ด ๋๋ค. ์์กด๊ฐ์ state๋ฅผ ๋ฃ์ผ๋ฉด ํด๋น state์ ๋ณํ์ ๋ฐ๋ผ console์ด ์ฐํ๊ฒ ๋๋ ๋๋ ์์ฃผ ๋ง๋ฒ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
import { useState, useEffect } from 'react';
function App() {
const [counter, setValue] = useState(0);
const [keyword, setKeyword] = useState('');
const onClick = () => setValue((prev) => prev + 1);
const onChange = (e) => setKeyword(e.target.value);
//์ ํ ์ฌํญ์ด ์์ผ๋ฏ๋ก ๊ทธ ์ด๋ค state๊ฐ ๋ณํ๋ ์์ํ ์ถ๋ ฅ๋๋ค.
console.log('I RUN ALL THE TIME');
useEffect(() => {
//์์กด๊ฐ์ด ๋น๊ฐ์ด๋ฏ๋ก ์ฌ์คํ ํฌ์ธํธ๊ฐ ์์ด์ ๋จ ํ ๋ฒ๋ง render.
console.log('I RUN ONLY ONCE');
}, []);
useEffect(() => {
//์์กด๊ฐ keyword๊ฐ ๋ณํ ๋๋ง๋ค render.
console.log('I RUN WHEN "KEYWORD" CHAGE');
}, [keyword]);
useEffect(() => {
//์์กด๊ฐ counter ๋ณํ ๋๋ง๋ค render.
console.log('I RUN WHEN "COUNTER" CHAGE');
}, [counter]);
useEffect(() => {
// ์์กด๊ฐ์ ๋ฐฐ์ด๋ก ๋ฌถ์ ์๋ ์๋ค.
console.log('I RUN WHEN "KEYWORD & COUNTER" CHAGE');
}, [keyword, counter]);
return (
<div>
<input
type={keyword}
placeholder="searchHere"
onChange={onChange}
/>
<h1>{counter}</h1>
<button onClick={onClick}>ํด๋ฆญํด๋ฆญ</button>
</div>
);
}
export default App;

Clean-up Function
๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ , ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์งํ๋ฉฐ, ํ์ ์์ด์ง ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ๊ฑฐํ๋๋ฐ ํ์ํ ํจ์//๋ฌธ๋ฒ useEffect(() => { (์ดํํธ ํจ์) return { (ํด๋ฆฐ์ ํจ์) }; }, [์์กด๊ฐ]);
importํ๋ component๊ฐ ํ ๊ฐ๋ผ๋ฉด ํฌ๊ฒ ๋ฌธ์ ๊ฐ ์๊ฒ ์ง๋ง ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ๋ฒ ํธ์ถํ ๊ฒฝ์ฐ ํ๋ฉด์์ ์ปดํฌ๋ํธ๋ฅผ ์ง์ ์ ๋(Destroy) useEffect๋ก ์ค์ ๋ sideEffect๊ฐ ์ ๋ฆฌ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์๋ค. ๊ทธ๊ฒ์ ๋ฏธ์ฐ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด clean-up function์ด๋ค.
//์์ฉ1
function Hello() {
useEffect(() => {
// ์ดํํธ ํจ์
console.log('CREATE');
// ํด๋ฆฐ์
ํจ์
return () => console.log('DESTROY');
}, []);
return <h1>HELLO</h1>;
}
//์์ฉ2
function Hello() {
const hiFunc = () => {
console.log('CREATE');
//ํด๋ฆฐ์
ํจ์
return byeFunf;
};
const byeFunf = () => {
console.log('DESTROY');
};
useEffect(hiFunc, []);
return <h1>HELLO</h1>;
}
๋๊ฐ ๋ชจ๋ ๋์ผํ ๋์์ ํ๋ค.

๐๐ปReact - useEffect ํ
(์ดํํธ ํจ์, ํด๋ฆฐ์
ํจ์)
๐๐ปuseEffect์ ํด๋ฆฐ์
์ ํ์์ฑ