어쩌다 알게 된 ƪ(•̃͡•̃͡ ƪ

🟦 [React] useEffect 개념 잡기 본문

개발/🟦 React

🟦 [React] useEffect 개념 잡기

비니_ 2025. 3. 9. 10:08
728x90

📌  useEffect는 리액트 컴포넌트가 렌더링될 때 실행되는 코드(사이드 이펙트)를 관리하는 훅

=> 호출 시점 정해줌

 

 

✔️ 렌더링 이후 실행되는 코드

=> 컴포넌트가 처음 화면에 나타날 때 실행되는 코드 생성 가능

import React, { useEffect } from "react";

const Hello = () => {
  useEffect(() => {
    console.log("👋 컴포넌트가 화면에 나타남!");
  }, []); // 의존성 배열이 빈 배열 -> 처음 1번만 실행

  return <h1>안녕하세요!</h1>;
};

export default Hello;

 

결과:

 

  • Hello 컴포넌트가 화면에 나타날 때 console.log("👋 컴포넌트가 화면에 나타남!")이 실행
  • 빈 배열 []을 넣으면 처음 마운트될 때만 실행되고 이후에는 실행되지 않음.

 

 

 

✔️ 의존성 배열에 따라 실행되는 시점 조절 가능

=> 특정 값이 바뀔 때마다 실행

import React, { useState, useEffect } from "react";

const Counter = () => {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log(`📢 count 값이 변경됨: ${count}`);
  }, [count]); // count가 변경될 때마다 실행됨

  return (
    <div>
      <p>현재 카운트: {count}</p>
      <button onClick={() => setCount(count + 1)}>+1 증가</button>
    </div>
  );
};

export default Counter;

 

결과:

 

  • 버튼을 누를 때마다 count 값이 증가하면서 useEffect가 실행됨.
  • [count] → count 값이 바뀔 때만 실행

 

 

 

✔️ 컴포넌트가 언마운트될 때 정리(cleanup) 가능

=> ex) 타이머, 이벤트 리스너 등을 설정했다면 컴포넌트가 사라질 때 정리

import React, { useState, useEffect } from "react";

const Timer = () => {
  useEffect(() => {
    const interval = setInterval(() => {
      console.log("⏰ 1초마다 실행됨");
    }, 1000);

    return () => {
      clearInterval(interval); // 컴포넌트가 사라질 때 실행 (정리)
      console.log("🧹 타이머 정리됨");
    };
  }, []);

  return <h1>타이머 실행 중...</h1>;
};

const App = () => {
  const [show, setShow] = useState(true);

  return (
    <div>
      {show && <Timer />}
      <button onClick={() => setShow(!show)}>타이머 ON/OFF</button>
    </div>
  );
};

export default App;

 

 

결과: 

 

  • 타이머가 시작되면 ⏰ 1초마다 실행됨이 계속 출력
  • 버튼을 눌러 Timer 컴포넌트를 제거하면 "🧹 타이머 정리됨"이 출력
    타이머가 정리되어 더 이상 실행되지 않음!

 

useEffect 특징

실행 조건 useEffect 코드
컴포넌트가 처음 나타날 때 실행 useEffect( () => {...}, {} )
특정 값이 변경 될 때 실행 useEffect( () => {...}, [value] )
컴포넌트가 사라질 때 정리 (cleanup) return() => {...}

 

728x90
Comments