็„ก์ œ

useEffect (์œ ์ฆˆ์ดํŽ™ํŠธ) ๋ณธ๋ฌธ

<React>

useEffect (์œ ์ฆˆ์ดํŽ™ํŠธ)

yo-u-loo 2026. 7. 23. 16:25

 

๐ŸŸก 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