프로그래밍/ReactJS

React State: 동적인 UI를 위한 핵심 개념 마스터하기

shimdh 2025. 9. 19. 14:46
728x90

React 개발자라면 "상태(State)"의 중요성을 모를 수 없을 것입니다. 마치 살아있는 유기체처럼 끊임없이 변화하는 사용자 인터페이스를 만들기 위해 React가 제공하는 가장 강력한 도구 중 하나이기 때문입니다. 이 블로그 포스트에서는 React의 상태가 무엇인지, 왜 중요한지, 그리고 어떻게 효과적으로 사용할 수 있는지에 대해 깊이 있게 탐구해 보겠습니다.


🚀 상태란 무엇인가요? Props와는 무엇이 다를까요?

React에서 "상태(State)" 는 컴포넌트가 동적인 데이터를 관리하고 이에 반응할 수 있도록 해주는 핵심 개념입니다. 언뜻 보면 "속성(Props)"과 비슷하게 느껴질 수 있지만, 근본적인 차이가 있습니다.

속성(Props) vs. 상태(State)

  • 속성(Props): 부모 컴포넌트에서 자식 컴포넌트로 전달되는 데이터입니다. 한 번 전달되면 변경할 수 없는(Immutable) 값입니다. 마치 함수의 인자와 같아서, 컴포넌트가 렌더링될 때 한 번 정의되고 그 이후에는 변경되지 않습니다.
  • 상태(State): 컴포넌트 자체 내에서 관리되는 데이터입니다. 속성과는 다르게 변경 가능(Mutable) 하며, 컴포넌트의 내부 데이터를 유지하고 외부 입력 없이도 사용자 인터페이스의 변경 사항을 반영할 수 있도록 해줍니다.

간단히 말해, Props는 "주어진 값" 이고 State는 "컴포넌트 스스로 관리하고 변경할 수 있는 값" 이라고 생각할 수 있습니다.


728x90

💡 상태의 주요 특징

상태가 React 애플리케이션에서 어떻게 동작하는지 이해하기 위해 몇 가지 중요한 특징을 살펴보겠습니다.

  • 변경 가능(Mutable): Props와 달리 상태는 특정 메서드(클래스 컴포넌트의 setState, 함수 컴포넌트의 useState 훅)를 사용하여 수정될 수 있습니다. 이 변경 가능성 덕분에 동적인 UI를 구현할 수 있습니다.
  • 지역적(Local): 각 컴포넌트는 자체적인 상태를 유지합니다. 따라서 명시적으로 공유되지 않는 한, 한 컴포넌트의 상태는 다른 컴포넌트에 직접적인 영향을 미치지 않습니다. 이는 컴포넌트의 독립성을 보장하고 재사용성을 높여줍니다.
  • 재렌더링 유발(Triggers Re-rendering): 가장 중요한 특징 중 하나입니다. 상태가 변경되면 React는 자동으로 해당 컴포넌트를 다시 렌더링합니다. 이는 사용자가 화면에서 보는 내용이 항상 최신 상태를 반영하도록 보장하며, 개발자가 DOM을 직접 조작할 필요 없이 선언적으로 UI를 업데이트할 수 있게 해줍니다.

👨‍💻 실용적인 예시: 간단한 카운터 애플리케이션

개념만으로는 이해하기 어려울 수 있으니, 간단한 카운터 애플리케이션을 통해 상태가 어떻게 작동하는지 살펴보겠습니다.

import React, { Component } from 'react';

class Counter extends Component {
  constructor(props) {
    super(props);
    // 상태를 count 속성으로 초기화합니다.
    this.state = { count: 0 };
  }

  increment = () => {
    // count를 1 증가시켜 상태를 업데이트합니다.
    this.setState({ count: this.state.count + 1 });
  };

  decrement = () => {
    // count를 1 감소시켜 상태를 업데이트합니다.
    this.setState({ count: this.state.count - 1 });
  };

  render() {
    return (
      <div>
        <h1>카운트: {this.state.count}</h1>
        <button onClick={this.increment}>증가</button>
        <button onClick={this.decrement}>감소</button>
      </div>
    );
  }
}

export default Counter;

이 예시에서 우리는 다음을 볼 수 있습니다:

  1. 초기 상태 설정: constructor 내부에서 this.state = { count: 0 };를 통해 count라는 상태 변수를 0으로 초기화했습니다.
  2. 상태 업데이트 메서드: incrementdecrement 메서드는 this.setState()를 사용하여 count 값을 업데이트합니다. setState는 React에게 "내 상태가 바뀌었으니 다시 렌더링해줘!"라고 알리는 역할을 합니다.
  3. 렌더링: render 메서드에서는 this.state.count를 사용하여 현재 카운트 값을 화면에 표시합니다. 버튼이 클릭되어 상태가 변경될 때마다 render 메서드가 다시 호출되어 업데이트된 숫자가 표시됩니다.

이처럼 setState를 통해 상태를 변경하면 React가 자동으로 해당 컴포넌트를 다시 렌더링하여 사용자에게 최신 UI를 보여줍니다.


🎯 왜 상태를 사용해야 할까요?

상태를 효과적으로 사용하는 것은 인터랙티브하고 사용자 친화적인 React 애플리케이션을 구축하는 데 필수적입니다.

  • 동적 사용자 인터페이스: 애플리케이션은 종종 양식 입력이나 버튼 클릭과 같은 사용자 상호작용에 기반한 실시간 업데이트가 필요합니다. 상태는 이러한 동적인 변화를 관리하는 데 최적화되어 있습니다.
  • 컴포넌트 상호작용성: 컴포넌트는 변경되는 조건에 따라 다르게 반응해야 합니다. 예를 들어, 토글 버튼은 클릭될 때마다 다른 상태(켜짐/꺼짐)를 가져야 합니다. 상태는 이러한 컴포넌트 간의 상호작용성을 원활하게 촉진하는 데 도움이 됩니다.
  • 데이터 흐름 관리: React는 단방향 데이터 흐름(Unidirectional Data Flow)을 지향합니다. 상태는 이 단방향 흐름의 핵심 축 중 하나로, 컴포넌트의 내부 데이터를 체계적으로 관리하고 예측 가능한 방식으로 UI를 업데이트할 수 있게 합니다.

🏁 결론

React에서 "상태(State)"는 단순히 데이터를 저장하는 공간을 넘어, 애플리케이션의 생명력을 불어넣는 핵심 개념입니다. 상태를 초기화하고, 이벤트(버튼 클릭과 같은)를 통해 업데이트하며, 변경 사항이 발생할 때 React가 자동으로 재렌더링하여 사용자에게 최신 정보를 보여준다는 개념을 마스터하는 것은 동적인 웹 애플리케이션을 만드는 강력한 도구를 갖추게 됨을 의미합니다.

이제 React의 상태 관리에 대한 견고한 토대를 마련했으니, 다음 단계로 생명주기 메서드(Lifecycle Methods)에 대해 배우면서 상태 관리가 컴포넌트가 존재하는 다양한 단계에서 어떻게 작동하는지 더 깊이 이해하게 될 것입니다. React의 핵심을 파고들어 진정한 인터랙티브 웹 애플리케이션을 만들어 보세요!

728x90