| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- ์ ๋๋ฒ์ ์ ๋ ํฐ
- ์์ด๋์ ๋ ํฐ
- selectorslevel4
- ๋ชจ๋์นํฐํธ
- ๊ทธ๋ฃน์ ๋ ํฐ
- ํฅ์ค์ฝ๋
- ํ์ ์ ๋ ํฐ
- textdecoration
- bordercollapse
- ์ถ์ฝ
- borderspacing
- ํฐํธ์จ์ดํธ
- ๊ตฌ๊ธํฐํธ
- ํด๋์ค์ ๋ ํฐ
- inlineblock
- borderstyle
- texttransform
- textshadow
- fontweight
- liststyleimage
- liststyletype
- ์ฃผ์
- captionside
- liststyleposition
- formtag
- CDN
- ํผํ๊ทธ
- wordspacing
- gtammertable
- ๋นํ๊ทธ
- Today
- Total
็ก์
useEffect (์ ์ฆ์ดํํธ) ๋ณธ๋ฌธ
๐ก useEffect
ํจ์ํ ์ปดํฌ๋ํธ์์ ์ฌ์ด๋ ์ดํํธ(Side Effect)๋ฅผ ์ฒ๋ฆฌํ๋ Hook์ด๋ค.
(์ฌ์ด๋ ์ดํํธ๋ ์ปดํฌ๋ํธ์ ๋ ๋๋ง ์ธ๋ถ์์ ๋ฐ์ํ๋ ์์ ์ ์๋ฏธํ๋ค.)
โผ๏ธ ์ฃผ์ ํน์ง
- API ํธ์ถ
- ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ฑ๋ก ๋ฐ ์ ๊ฑฐ
- ํ์ด๋จธ(setTimeout, setInterval) ์ค์ ๋ฐ ํด์
- DOM ์ง์ ์กฐ์
- localStorage ์ ๊ทผ
โผ๏ธ ๊ธฐ๋ณธ ๋ฌธ๋ฒ
useEffect(() => {
// ์คํํ ์ฝ๋
return () => {
// ์ ๋ฆฌ(Cleanup) ํจ์
};
}, [dependencies]);
- ์ฒซ ๋ฒ์งธ ์ธ์: ์คํํ ํจ์.
- return: ์ ๋ฆฌ(Cleanup) ํจ์.
- ๋ ๋ฒ์งธ ์ธ์: ์์กด์ฑ ๋ฐฐ์ด. (Dependencies)
โผ๏ธ ์คํ ๋ฐฉ์
1๏ธโฃ ๋ง์ดํธ ์ ํ ๋ฒ๋ง ์คํ
์์กด์ฑ ๋ฐฐ์ด์ ๋น ๋ฐฐ์ด([])๋ก ์ ๋ฌํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ ๋๋ง๋ ๋๋ง ์คํ๋๋ค.
useEffect(() => {
console.log("Mount");
}, []);
- ์ฃผ์ ์ฌ์ฉ: ์ด๊ธฐ API ํธ์ถ, ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ฑ๋ก, ์ด๊ธฐ ๋ฐ์ดํฐ ์ค์ .
2๏ธโฃ ํน์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ์คํ
์์กด์ฑ ๋ฐฐ์ด์ ๊ฐ์ ๋ฃ์ผ๋ฉด ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ๋๋ค.
useEffect(() => {
console.log(count);
}, [count]);
//์ฌ๋ฌ ๊ฐ์ ๊ฐ์ํ ์๋ ์๋ค.
useEffect(() => {
console.log("์คํ");
}, [count, user]);
- ์ฃผ์ ์ฌ์ฉ: state ๋ณ๊ฒฝ ๊ฐ์ง, props ๋ณ๊ฒฝ ๊ฐ์ง, ํน์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ํ ์ถ๊ฐ ์์ .
3๏ธโฃ ๋ ๋๋ง๋ ๋๋ง๋ค ์คํ
์์กด์ฑ ๋ฐฐ์ด์ ์๋ตํ๋ฉด ๋ชจ๋ ๋ ๋๋ง๋ง๋ค ์คํ๋๋ค.
useEffect(() => {
console.log("Render");
});
- state๊ฐ ๋ณ๊ฒฝ๋์ด ๋ค์ ๋ ๋๋ง๋ ๋๋ง๋ค ์คํ๋๋ฏ๋ก ๋ถํ์ํ ์คํ์ด ๋ฐ์ํ ์ ์์ด ์ฃผ์ํด์ผ ํ๋ค.
โผ๏ธ Cleanup ํจ์ (์ ๋ฆฌ)
return์ผ๋ก ํจ์๋ฅผ ๋ฐํํ๋ฉด ๋ค์ useEffect๊ฐ ์คํ๋๊ธฐ ์ ๋๋ ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋ ์คํ๋๋ค.
useEffect(() => {
// ํ์ด๋จธ ์ค์
const timer = setInterval(() => {
console.log("์คํ");
}, 1000);
// ์ ๋ฆฌ ํจ์
return () => {
clearInterval(timer); // ํ์ด๋จธ ํด์
console.log('ํ์ด๋จธ๊ฐ ์ ๋ฆฌ๋์์ต๋๋ค!');
};
}, []);
- ์ฃผ์ ์ฌ์ฉ: ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ ๊ฑฐ, ํ์ด๋จธ ํด์ , ๊ตฌ๋ (Subscription) ํด์ , ๋คํธ์ํฌ ์์ฒญ ์ ๋ฆฌ.
๐ Cleanup์ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
โผ๏ธ ๋น๋๊ธฐ ์์
useEffect ์์ฒด๋ฅผ async๋ก ์์ฑํ๋ฉด ์ ๋๋ค. ๋์ useEffect ๋ด๋ถ์์ ๋น๋๊ธฐ ํจ์๋ฅผ ๋ง๋ ๋ค ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค.
useEffect๋ ๋ฐํ๊ฐ์ผ๋ก undefined ๋๋ ์ ๋ฆฌ ํจ์(cleanup function) ๋ง ๋ฐํํด์ผ ํ๋๋ฐ, async ํจ์๋ ํญ์ Promise๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
useEffect(() => {
async function fetchData() {
const response = await fetch("/api/data");
const data = await response.json();
setData(data);
}
fetchData();
}, []);
- fetchData()๋ API์์ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ๋ก ๊ฐ์ ธ์จ๋ค.
- await๋ฅผ ์ฌ์ฉํด ์๋ต์ ๋ฐ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ํ(setData)์ ์ ์ฅํ๋ค.
- ์์กด์ฑ ๋ฐฐ์ด([])์ด ๋น์ด ์์ผ๋ฏ๋ก ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ง์ดํธ๋ ๋ ํ ๋ฒ๋ง ์คํ๋๋ค.
โผ๏ธ ์๋ช ์ฃผ๊ธฐ์์ ๊ด๊ณ
useEffect๋ ํด๋์คํ ์ปดํฌ๋ํธ์ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋์ ๋น์ทํ ์ญํ ์ ํ๋ค.
| ํด๋์คํ ์ปดํฌ๋ํธ | useEffect |
| componentDidMount | useEffect(() => {}, []) |
| componentDidUpdate | useEffect(() => {}, [state]) |
| componentWillUnmount | return () => {} |
๐ POINT ๐
โ๏ธ useEffect ๋ด๋ถ ์ฝ๋๋ ์ปดํฌ๋ํธ์ ๋ ๋๋ง์ด ๋๋ ํ ์คํ๋๋ค. โ๏ธ
โ๏ธ ๋ ๋๋ง๊ณผ ์ง์ ๊ด๋ จ์ด ์๋ ์์ ์ useEffect์์ ์ฒ๋ฆฌํ๋ฉด ์ด๊ธฐ ํ๋ฉด์ ๋จผ์ ํ์ํ ๋ค ๋ถ๊ฐ์ ์ธ ์์ ์ ์ํํ ์ ์๋ค. โ๏ธ
โ๏ธ ์์กด์ฑ ๋ฐฐ์ด์๋ Effect์์ ์ฌ์ฉํ๋ state๋ props๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์์น์ด๋ค. โ๏ธ
โ๏ธ ์์กด์ฑ ๋ฐฐ์ด์ ์๋ชป ์์ฑํ๋ฉด ๋ถํ์ํ ์ฌ์คํ์ด๋ ๋ฌดํ ๋ ๋๋ง์ด ๋ฐ์ํ ์ ์๋ค. โ๏ธ
โ๏ธ React ์์๋ ํจ์ํ ์ปดํฌ๋ํธ์ useEffect๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ํ์ค์ด๋ค. โ๏ธ
๐ ์คํ ๋ฐฉ์ ์ ๋ฆฌ ๐
| ์์กด์ฑ ๋ฐฐ์ด | ์คํ ์์ |
| ์๋ต | ๋ชจ๋ ๋ ๋๋ง๋ง๋ค ์คํ |
| [] | ์ต์ด ๋ง์ดํธ ์ ํ ๋ฒ ์คํ |
| [value] | value๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ |
| return () => {} | ๋ค์ Effect ์คํ ์ ๋๋ ์ธ๋ง์ดํธ ์ ์คํ |
'<React>' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Callback Function (์ฝ๋ฐฑ ํจ์) (0) | 2026.07.23 |
|---|---|
| Axios (์ก์์ค์ค) (0) | 2026.07.23 |
| React.js Life Cycle (๋ฆฌ์กํธ์ ์๋ช ์ฃผ๊ธฐ) (0) | 2026.07.23 |
| reducer / Redux / Redux Toolkit (0) | 2026.07.20 |
| reducer์ reducers (0) | 2026.07.20 |
