FE/React

[React] useEffect, useState

baek-dev 2025. 2. 13. 19:08

1. useState - 상태 관리 (State Management)

 

useState는 컴포넌트의 상태를 선언하고 관리할 때 사용되는 React 훅입니다. 상태란 사용자 입력, API 응답 데이터, 컴포넌트 내의 동적 값을 의미합니다.

 

사용법:

const [state, setState] = useState(initialValue);

state: 현재 상태 값.

setState: 상태 값을 업데이트하는 함수.

initialValue: 상태의 초기 값.

 

예제:

import React, { useState } from "react";

const Counter = () => {
  const [count, setCount] = useState(0);  // count의 초기값은 0

  const handleIncrement = () => {
    setCount(count + 1);  // 상태 업데이트
  };

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

export default Counter;

 

설명:

**초기값은 0**으로 설정되며, 버튼을 클릭하면 count 값이 1씩 증가합니다.

**setCount(count + 1)**을 호출하면 컴포넌트가 다시 렌더링되면서 최신 상태가 화면에 표시됩니다.

 

 

2. useEffect - 사이드 이펙트 관리 (Side Effect Handling)

 

useEffect렌더링 후 수행해야 하는 작업(사이드 이펙트)을 처리하기 위해 사용됩니다. 여기서 사이드 이펙트란 데이터를 가져오거나, DOM을 직접 조작하거나, 구독/타이머 등의 작업을 의미합니다.

 

사용법:

useEffect(() => {
  // 실행할 작업 (예: API 호출, 타이머 설정 등)
  
  return () => {
    // 정리(cleanup) 작업 (예: 이벤트 리스너 제거, 타이머 해제 등)
  };
}, [dependencies]);

첫 번째 매개변수: 실행할 콜백 함수.

두 번째 매개변수 (의존성 배열):

빈 배열 [] → 컴포넌트가 처음 마운트될 때 한 번만 실행.

상태나 props 배열 [state, prop] → 해당 값이 변경될 때마다 실행.

 

예제:

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

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

  useEffect(() => {
    const interval = setInterval(() => {
      setCount((prevCount) => prevCount + 1);
    }, 1000);  // 1초마다 count 증가

    // 컴포넌트가 언마운트될 때 정리(cleanup) 작업
    return () => clearInterval(interval);
  }, []);  // 빈 배열이므로 컴포넌트가 마운트될 때 한 번만 실행됨

  return <p>초: {count}</p>;
};

export default Timer;

 

설명:

컴포넌트가 처음 렌더링되면 1초마다 count가 1씩 증가합니다.

컴포넌트가 언마운트될 때 clearInterval을 호출하여 타이머를 정리합니다.

 

 

3. 의존성 배열의 동작 이해

 

의존성 배열은 useEffect가 언제 다시 실행될지를 결정합니다.

의존성 배열의 동작 의존성 배열설명
[] 컴포넌트가 처음 마운트될 때 한 번만 실행
[state] state가 변경될 때마다 실행
의존성 배열 생략 (null) 컴포넌트가 리렌더링될 때마다 실행

 

예제

useEffect(() => {
  console.log("상태가 변경되었습니다.");
}, [count]);  // count가 변경될 때마다 실행

 

 

4. 예제: useState와 useEffect를 함께 사용하는 경우

 

회원 목록 불러오기 예제

import React, { useEffect, useState } from "react";
import { ClassService } from "src/services/ClassService";

const MemberList = () => {
  const [members, setMembers] = useState([]);

  useEffect(() => {
    const fetchMembers = async () => {
      try {
        const response = await ClassService.getMembers();
        setMembers(response.data);  // 상태 업데이트
      } catch (error) {
        console.error("Error fetching members:", error);
      }
    };

    fetchMembers();
  }, []);  // 처음 마운트될 때 한 번 실행

  if (members.length === 0) {
    return <p>회원 정보가 없습니다.</p>;
  }

  return (
    <ul>
      {members.map((member) => (
        <li key={member.id}>{member.name}</li>
      ))}
    </ul>
  );
};

export default MemberList;

 

설명:

**useState**는 API에서 불러온 회원 정보를 관리합니다.

**useEffect**는 컴포넌트가 렌더링될 때 한 번만 호출되어 데이터를 불러옵니다.

회원 목록이 화면에 표시되며, 상태가 업데이트되면 자동으로 렌더링됩니다.

 

 

5. 정리

훅  설명 사용 예제
useState 컴포넌트에서 동적 데이터를 관리하는 상태 훅 사용자 입력값, API 응답 데이터 등
useEffect 컴포넌트 렌더링 후 비동기 작업이나 DOM 조작을 처리하는 훅 API 호출, 구독, 타이머 설정 등

 

useState는 데이터를 저장하고 관리, useEffect는 그 데이터를 가져오거나 관리할 때 필요한 작업을 수행하는 방식으로 협력합니다.

 

 

 

 

출처 : ChatGPT

'FE > React' 카테고리의 다른 글

npm install --legacy-peer-deps  (0) 2025.05.23