레이블이 React 생명주기인 게시물을 표시합니다. 모든 게시물 표시
레이블이 React 생명주기인 게시물을 표시합니다. 모든 게시물 표시

2025년 1월 18일 토요일

9 React useEffect 훅과 라이프사이클 완벽 정리

 React의 useEffect 훅은 컴포넌트의 생명주기(lifecycle)와 관련된 작업을 수행할 때 사용됩니다. 이를 활용하면 마운트, 업데이트, 언마운트 시점에서 특정 로직을 실행할 수 있습니다.


useEffect, React useEffect, React 생명주기, 컴포넌트 마운트, 업데이트 시 useEffect, API 호출 React, 타이머 설정 React, React 상태 관리, React 언마운트, useEffect 의존성 배열


1. useEffect 훅 기본 개념

useEffect는 React 컴포넌트에서 사이드 이펙트를 처리하기 위해 사용하는 훅입니다. 주로 데이터 가져오기(API 호출), DOM 업데이트, 타이머 설정과 같은 작업을 수행할 때 활용됩니다.

기본 문법

import React, { useEffect } from 'react';

function ExampleComponent() {
  useEffect(() => {
    console.log('컴포넌트가 렌더링되었습니다.');
  });

  return <div>useEffect 기본 사용법</div>;
}

위 코드는 ExampleComponent가 렌더링될 때마다 useEffect 내부의 코드가 실행됩니다.


2. 마운트, 업데이트, 언마운트 타이밍 다루기

가. 마운트 시점에서 실행

컴포넌트가 처음으로 렌더링될 때만 실행하고 싶다면 useEffect의 두 번째 인자로 빈 배열([])을 전달합니다.

useEffect(() => {
  console.log('컴포넌트가 마운트되었습니다.');
}, []); // 빈 배열을 전달하면 최초 1회만 실행됨

이렇게 하면 컴포넌트가 마운트될 때 한 번만 실행됩니다.


나. 업데이트 시점에서 실행

특정 상태(state)가 변경될 때마다 실행되도록 만들려면 useEffect의 두 번째 인자로 해당 상태를 배열에 추가합니다.

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

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

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

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

이렇게 하면 count 값이 변경될 때마다 useEffect가 실행됩니다.


다. 언마운트 시점에서 실행

컴포넌트가 제거될 때(clean-up)를 수행하려면 useEffect 내부에서 return 문을 사용하여 정리(clean-up) 함수를 반환하면 됩니다.

useEffect(() => {
  console.log('컴포넌트가 마운트됨');
  return () => {
    console.log('컴포넌트가 언마운트됨');
  };
}, []);

위 코드는 컴포넌트가 마운트될 때 실행되고, 컴포넌트가 제거될 때 정리(clean-up) 함수가 실행됩니다.


3. useEffect 훅을 활용한 실전 예제

가. API 호출 예제

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

function FetchData() {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch('https://jsonplaceholder.typicode.com/todos/1')
      .then((response) => response.json())
      .then((json) => setData(json));
  }, []);

  return (

API 데이터

{JSON.stringify(data, null, 2)}
); }

위 코드는 API에서 데이터를 가져와 화면에 출력하는 간단한 예제입니다. 마운트될 때 한 번만 실행되도록 설정되었습니다.


나. 타이머 설정 예제

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

function Timer() {
  const [seconds, setSeconds] = useState(0);

  useEffect(() => {
    const interval = setInterval(() => {
      setSeconds((prev) => prev + 1);
    }, 1000);

    return () => clearInterval(interval); // 언마운트 시 타이머 정리
  }, []);

  return <p>타이머: {seconds}초</p>;
}

이 코드는 컴포넌트가 마운트되면 1초마다 seconds 값을 증가시키고, 언마운트되면 타이머를 정리합니다.


4. useEffect 사용 시 주의할 점

가. 의존성 배열 사용 시 주의

  • 의존성 배열을 정확하게 설정하지 않으면 무한 루프가 발생할 수 있습니다.
useEffect(() => {
  console.log('무한 루프 발생!');
}, [Math.random()]); // 매번 새로운 값이 들어가면서 무한 실행됨

나. 불필요한 렌더링 방지

  • 불필요한 상태 변경이 발생하면 useEffect가 여러 번 실행될 수 있습니다. 이를 방지하려면 상태 변경 로직을 최적화해야 합니다.

5. 정리

React의 useEffect 훅을 활용하면 컴포넌트의 라이프사이클을 효과적으로 관리할 수 있습니다.

  1. 마운트 시 실행 → useEffect(() => {}, [])
  2. 업데이트 시 실행 → useEffect(() => {}, [state])
  3. 언마운트 시 실행 → useEffect(() => { return () => {}; }, [])

또한 API 호출, 타이머 설정 등의 다양한 기능을 처리할 수 있으며, 의존성 배열을 올바르게 설정하여 최적화하는 것이 중요합니다.

위 개념을 활용하여 React 프로젝트에서 효과적으로 상태 관리 및 비동기 작업을 처리해 보세요.

3 React 컴포넌트 개념: 함수형 컴포넌트와 클래스형 컴포넌트

 

React 컴포넌트, 함수형 컴포넌트, 클래스형 컴포넌트, React Props, React 재사용성, React 컴포넌트 재사용, React 상태 관리, React 생명주기, 함수형 컴포넌트 vs 클래스형 컴포넌트, React 데이터 전달


React 컴포넌트란?

React에서 **컴포넌트(Component)**는 UI를 구성하는 가장 기본적인 단위입니다. 컴포넌트를 사용하면 코드의 재사용성을 높이고, 유지보수를 쉽게 할 수 있습니다. React는 **함수형 컴포넌트(Function Component)**와 클래스형 컴포넌트(Class Component) 두 가지 방식으로 컴포넌트를 정의할 수 있습니다.


함수형 컴포넌트와 클래스형 컴포넌트


1. 함수형 컴포넌트

함수형 컴포넌트는 JavaScript 함수 형태로 정의되는 컴포넌트입니다. React 16.8 이후부터는 React Hooks가 도입되면서 함수형 컴포넌트에서도 상태(state) 관리와 생명주기(lifecycle) 기능을 사용할 수 있게 되었습니다.

import React from 'react';

function Greeting(props) {
  return <h1>안녕하세요, {props.name}님!</h1>;
}

export default Greeting;

위 코드에서 Greeting함수형 컴포넌트이며, props를 받아서 name 값을 출력하는 역할을 합니다.


2. 클래스형 컴포넌트

클래스형 컴포넌트class 문법을 사용하여 정의되며, React의 Component 클래스를 상속받아야 합니다. 클래스형 컴포넌트에서는 state를 사용할 수 있으며, 생명주기 메서드를 활용할 수 있습니다.

import React, { Component } from 'react';

class Greeting extends Component {
  render() {
    return <h1>안녕하세요, {this.props.name}님!</h1>;
  }
}

export default Greeting;

함수형 컴포넌트에 비해 클래스형 컴포넌트는 문법이 다소 복잡하지만, 상태(state) 관리나 생명주기 메서드가 필요할 때 사용됩니다. 그러나 React의 최신 트렌드는 함수형 컴포넌트 + Hooks를 활용하는 방식으로 변화하고 있습니다.



Props와 컴포넌트 재사용성


1. Props란?

**Props(프로퍼티)**는 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달할 때 사용하는 객체입니다. Props는 읽기 전용(immutable)이며, 자식 컴포넌트에서 직접 수정할 수 없습니다.

function UserProfile(props) {
  return (
    <div>
      <h2>이름: {props.name}</h2>
      <p>나이: {props.age}</p>
    </div>
  );
}

function App() {
  return <UserProfile name="김철수" age={25} />;
}

위 코드에서 UserProfile 컴포넌트는 nameage 값을 props로 전달받아 화면에 표시합니다.


2. 컴포넌트 재사용성

컴포넌트의 가장 큰 장점은 재사용성입니다. 같은 컴포넌트를 여러 곳에서 사용할 수 있으며, props를 활용하여 다양한 데이터를 표현할 수 있습니다.

function Button(props) {
  return <button style={{ backgroundColor: props.color }}>{props.label}</button>;
}

function App() {
  return (
    <div>
      <Button color="blue" label="확인" />
      <Button color="red" label="취소" />
    </div>
  );
}

위 코드에서는 Button 컴포넌트를 색상과 텍스트만 변경하여 재사용하고 있습니다.


마무리

이번 장에서는 React 컴포넌트 개념, 함수형 컴포넌트와 클래스형 컴포넌트의 차이점, props와 컴포넌트 재사용성에 대해 알아보았습니다. React에서 컴포넌트는 재사용성과 유지보수성을 높이는 핵심 요소이므로, 이를 효과적으로 활용하는 것이 중요합니다.

다음 장에서는 React의 상태(state)와 생명주기(lifecycle) 메서드에 대해 알아보겠습니다.