React useEffect 훅 완벽 가이드: 호출 시점과 사용법

2025. 5. 27. 22:20·Frontend Development
반응형

React를 사용하면서 가장 자주 사용되는 훅 중 하나인 useEffect에 대해 자세히 알아보겠습니다. 이 글에서는 useEffect의 호출 시점과 실제 사용 예시를 통해 효과적인 사용법을 설명합니다.


useEffect란?

useEffect는 React의 핵심 훅 중 하나로, 컴포넌트의 생명주기와 관련된 부수 효과(side effects)를 처리하기 위해 사용됩니다. 데이터 페칭, 구독 설정, DOM 수동 조작 등 다양한 작업을 수행할 수 있습니다.


useEffect의 호출 시점

useEffect는 크게 세 가지 시점에서 호출됩니다:

  1. 컴포넌트 마운트 시
  2. 의존성 배열 값 변경 시
  3. 컴포넌트 언마운트 시

1. 컴포넌트 마운트 시

컴포넌트가 처음 렌더링된 직후에 호출됩니다. 주로 다음과 같은 작업을 수행할 때 사용합니다:

  • API 호출
  • 이벤트 리스너 등록
  • 외부 라이브러리 초기화
useEffect(() => {
  // 컴포넌트가 마운트될 때 실행될 코드
  fetchData();
  window.addEventListener('resize', handleResize);

  // 클린업 함수
  return () => {
    window.removeEventListener('resize', handleResize);
  };
}, []); // 빈 의존성 배열

2. 의존성 배열 값 변경 시

의존성 배열에 지정된 값이 변경될 때마다 호출됩니다. 이때 중요한 점은:

  • 클린업 함수가 먼저 실행됨 (이전 상태로)
  • 새로운 상태로 본문이 실행됨
useEffect(() => {
  // count가 변경될 때마다 실행
  console.log(`Count changed to: ${count}`);

  return () => {
    // 이전 count 값으로 클린업
    console.log(`Cleaning up for count: ${count}`);
  };
}, [count]); // count가 변경될 때마다 실행

3. 컴포넌트 언마운트 시

컴포넌트가 제거될 때 클린업 함수가 실행됩니다. 메모리 누수를 방지하기 위해 중요한 시점입니다.

useEffect(() => {
  const subscription = someAPI.subscribe();

  return () => {
    // 컴포넌트가 언마운트될 때 실행
    subscription.unsubscribe();
  };
}, []);

useEffect 사용 시 주의사항

  1. 의존성 배열 관리

    • 빈 배열 []: 마운트/언마운트 시에만 실행
    • 의존성 없음: 매 렌더링마다 실행
    • 의존성 있음: 해당 값이 변경될 때만 실행
  2. 무한 루프 방지

    • 의존성 배열에 함수나 객체를 직접 넣지 않기
    • 필요한 경우 useCallback이나 useMemo 사용
  3. 클린업 함수 활용

    • 이벤트 리스너 제거
    • 구독 취소
    • 타이머 해제

실제 사용 예시

function UserProfile({ userId }) {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    let isMounted = true;

    const fetchUser = async () => {
      try {
        const response = await fetch(`/api/users/${userId}`);
        const data = await response.json();

        if (isMounted) {
          setUser(data);
          setLoading(false);
        }
      } catch (error) {
        if (isMounted) {
          console.error('Error fetching user:', error);
          setLoading(false);
        }
      }
    };

    fetchUser();

    return () => {
      isMounted = false;
    };
  }, [userId]);

  if (loading) return <div>Loading...</div>;
  if (!user) return <div>User not found</div>;

  return (
    <div>
      <h1>{user.name}</h1>
      <p>{user.email}</p>
    </div>
  );
}

결론

useEffect는 React 컴포넌트에서 부수 효과를 다루는 강력한 도구입니다. 올바른 시점에 호출되고, 적절한 클린업을 수행하는 것이 중요합니다. 의존성 배열을 신중하게 관리하고, 클린업 함수를 활용하여 메모리 누수를 방지하는 것이 좋은 React 개발의 핵심입니다.


참고 자료

  • React 공식 문서 - useEffect
  • React Hooks 완벽 가이드
반응형
저작자표시 비영리 변경금지 (새창열림)

'Frontend Development' 카테고리의 다른 글

DOM 이벤트 전파(Event Propagation) 완벽 가이드  (0) 2025.05.27
JavaScript Promise 완벽 가이드: 비동기 처리의 새로운 패러다임  (0) 2025.05.27
CSS Flexbox vs Grid: 현대 웹 레이아웃의 두 가지 접근 방식  (0) 2025.05.27
JavaScript의 undefined와 null: 그 차이점과 사용법  (0) 2025.05.27
TypeScript에서 interface와 type의 차이점: 언제 무엇을 사용해야 할까?  (0) 2025.05.27
'Frontend Development' 카테고리의 다른 글
  • DOM 이벤트 전파(Event Propagation) 완벽 가이드
  • JavaScript Promise 완벽 가이드: 비동기 처리의 새로운 패러다임
  • CSS Flexbox vs Grid: 현대 웹 레이아웃의 두 가지 접근 방식
  • JavaScript의 undefined와 null: 그 차이점과 사용법
Kun Woo Kim
Kun Woo Kim
안녕하세요, 김건우입니다! 웹과 앱 개발에 열정적인 전문가로, React, TypeScript, Next.js, Node.js, Express, Flutter 등을 활용한 프로젝트를 다룹니다. 제 블로그에서는 개발 여정, 기술 분석, 실용적 코딩 팁을 공유합니다. 창의적인 솔루션을 실제로 적용하는 과정의 통찰도 나눌 예정이니, 궁금한 점이나 상담은 언제든 환영합니다.
  • Kun Woo Kim
    WhiteMouseDev
    김건우
  • 깃허브
    포트폴리오
    velog
  • 전체
    오늘
    어제
  • 공지사항

    • [인사말] 이제 티스토리에서도 만나요! WhiteMouse⋯
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 분류 전체보기 (100) N
      • Frontend Development (39) N
      • Backend Development (21) N
      • Algorithm (33) N
        • 백준 (11) N
        • 프로그래머스 (17)
        • 알고리즘 (5)
      • Infra (1)
      • 자료구조 (3)
  • 링크

    • Github
    • Portfolio
    • Velog
  • 인기 글

  • 태그

    tailwindcss
    frontend development
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kun Woo Kim
React useEffect 훅 완벽 가이드: 호출 시점과 사용법
상단으로

티스토리툴바