React

useEffect란?

Lulung 2024. 12. 19. 10:45

useEffect는 React에서 함수형 컴포넌트의 사이드 이펙트를 처리할 수 있도록 도와주는 훅이다. 사이드 이펙트란 렌더링 외의 작업을 의미하는데, 예를 들어 데이터 fetching, 구독(subscription), 타이머 설정, 이벤트 리스너 등록/제거 등이 이에 해당한다.

즉, useEffect는 컴포넌트가 렌더링될 때마다 특정 작업을 실행하거나, 속성이 변경되었을 때 그에 맞는 작업을 실행하는 기능을 제공한다.

 

기본 사용법

useEffect는 두 가지 인수를 받는다. 

1. 콜백 함수 : 사이드 이펙트를 처리하는 코드가 들어간다. 이 콜백 함수는 렌더링 후 실행된다.

2. 의존성 배열(dependency array) : useEffect가 언제 실행될지 결정한다. 이 배열에는 컴포넌트가 리렌더링될 때 useEffect가 다시 실행되기 위한 조건을 명시할 수 있다.

 

useEffect의 기본 구조

useEffect(() => {
  // 사이드 이펙트 코드
}, [/* 의존성 배열 */]);

의존성 배열

  • 의존성 배열에 포함된 값이 변경될 때마다 useEffect가 다시 실행된다.
  • 의존성 배열이 빈 배열일 경우, 컴포넌트가 마운트될 때 한 번 즉, 컴포넌트가 처음 렌더링될 때만 실행된다.

예시 : 마운트될 때 한 번만 실행

import { useEffect } from 'react';

const MyComponent = () => {
  useEffect(() => {
    console.log('컴포넌트가 마운트되었습니다');
  }, []); // 빈 배열 => 마운트될 때만 실행

  return <h1>Hello, World!</h1>;
};

예시 : 상태 변화에 반응

import { useState, useEffect } from 'react';

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

  useEffect(() => {
    console.log(`현재 카운트: ${count}`);
  }, [count]); // count 값이 변경될 때마다 실행

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increase</button>
    </div>
  );
};

예시 : 언마운트 시 실행

useEffect에서 리턴된 함수는 컴포넌트가 언마운트될 때 실행된다. 이를 이용해 리소스 정리 작업을 할 수 있다.

import { useEffect } from 'react';

const MyComponent = () => {
  useEffect(() => {
    const timer = setInterval(() => {
      console.log('1초마다 실행됩니다');
    }, 1000);

    // 언마운트 시 클린업 함수 실행
    return () => {
      clearInterval(timer); // 타이머를 종료
      console.log('컴포넌트가 언마운트되었습니다');
    };
  }, []); // 빈 배열: 마운트될 때만 실행

  return <h1>Hello, World!</h1>;
};

예시 : API 호출

import { useState, useEffect } from 'react';

const MyComponent = () => {
  const [data, setData] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      const response = await fetch('https://jsonplaceholder.typicode.com/posts');
      const result = await response.json();
      setData(result);
    };

    fetchData(); // API 호출

  }, []); // 빈 배열 => 컴포넌트가 마운트될 때만 실행

  if (!data) return <p>Loading...</p>;

  return (
    <div>
      <h1>Fetched Data</h1>
      <ul>
        {data.map(post => (
          <li key={post.id}>{post.title}</li>
        ))}
      </ul>
    </div>
  );
};

 

실행 순서

1. 컴포넌트 렌더링 후 useEffect의 콜백 함수 실행

2. 의존성 배열에 설정된 값이 변경되었을 때 useEffect 다시 실행

3. 컴포넌트 언마운트 또는 의존성이 변경되기 전, 이전에 실행된 useEffect의 정리(cleanup) 함수 실행

 

주의 사항

  • 무한 루프 : 의존성 배열을 설정하지 않으면 매 렌더링마다 실행된다.
  • 효율성 : 불필요한 실행이 없도록 의존성 배열을 적절히 설정해야 한다.