프로그래밍/ReactJS

MobX 옵저버블: React 애플리케이션의 반응성을 극대화하는 핵!

shimdh 2025. 10. 18. 11:18
728x90

안녕하세요, React 개발자 여러분! 현대 웹 애플리케이션에서 상태 관리는 필수적인 요소입니다. Redux나 Zustand 같은 라이브러리가 인기 있지만, MobX는 더 직관적이고 반응적인 접근으로 개발자들의 사랑을 받고 있어요. 특히 MobX의 옵저버블(Observable) 개념은 상태 변화에 자동으로 UI를 동기화하는 마법 같은 기능을 제공합니다. 이 글에서는 MobX 옵저버블의 본질을 깊이 파헤치고, 핵심 개념 5가지를 실제 코드 예시와 함께 탐구해 보겠습니다. 초보자부터 고급 개발자까지, 반응형 프로그래밍의 매력을 느껴보세요!

옵저버블이란 무엇인가? MobX 반응형 프로그래밍의 심장

MobX의 핵심은 바로 옵저버블(Observable) 입니다. 옵저버블은 단순한 데이터가 아니라, 관찰 가능한 데이터 구조로 진화한 형태예요. 이 값에 변화가 생기면, 그 값을 '구독'하는 모든 컴포넌트나 함수가 자동으로 재렌더링되거나 재계산됩니다. 마치 Excel 스프레드시트에서 셀 하나를 변경하면 연결된 모든 셀이 자동 업데이트되는 것처럼요!

과거에는 상태 변경 시마다 UI를 수동으로 업데이트해야 했습니다. 이는 코드 복잡성을 높이고, 버그를 유발하기 쉽죠. 하지만 MobX 옵저버블은 "모든 파생된 값은 항상 상태와 동기화된다" 는 철학으로 이런 문제를 해결합니다. 결과적으로 개발자는 상태 관리의 골치 아픈 부분에서 벗어나 비즈니스 로직에 집중할 수 있어요. 이제 옵저버블의 핵심 개념 5가지를 하나씩 살펴보죠.

728x90

MobX 옵저버블의 핵심 개념 5가지

MobX를 효과적으로 활용하려면 옵저버블의 기본 빌딩 블록을 이해해야 합니다. 각 개념을 코드와 함께 설명하겠습니다.

1. 옵저버블 생성: 반응형 상태의 시작점

옵저버블 생성은 MobX의 첫걸음입니다. @observable 데코레이터를 사용하면 클래스 속성을 자동으로 관찰 가능한 상태로 만듭니다. 이 속성의 값이 바뀔 때마다 MobX가 이를 감지하고, 관련 UI나 로직을 트리거해요. 별도의 수동 업데이트 코드가 필요 없다는 게 포인트입니다!

import { observable } from 'mobx';

class Store {
  @observable count = 0; // 이 count 변수는 이제 옵저버블입니다.
}

const store = new Store();

위 예시에서 store.count를 변경하면 (예: store.count = 10), 이를 사용하는 모든 요소가 자동으로 반응합니다. 이는 개발 생산성을 폭발적으로 높여줍니다.

2. 계산된 값(computed): 효율적인 파생 데이터 관리

@computed는 옵저버블로부터 파생된 값을 생성합니다. 기본 옵저버블이 변할 때만 재계산되므로, 캐싱 효과로 성능을 최적화해요. 복잡한 계산이 필요한 대규모 앱에서 특히 빛을 발합니다.

import { computed } from 'mobx';

class Store {
  @observable count = 0;

  @computed get doubleCount() {
    return this.count * 2;
  }
}

const store = new Store();
console.log(store.doubleCount); // 출력: 0
store.count = 5;
console.log(store.doubleCount); // 출력: 10 (변경에 반응)

doubleCountcount에 의존하므로, count가 변하지 않으면 불필요한 계산을 피합니다. 이는 앱의 속도를 유지하는 데 필수적이에요. React.memo와 결합하면 더 강력한 최적화가 가능합니다.

3. 반응(reaction): 옵저버블 변경에 따른 부수 효과 처리

reaction은 옵저버블 변화에 부수 효과(side effects) 를 연결합니다. 로깅, API 호출, 또는 외부 라이브러리 업데이트처럼 상태 변화에 따라 실행되어야 할 로직을 처리해요. 이는 순수한 UI 업데이트를 넘어 비즈니스 로직을 자동화합니다.

import { reaction } from 'mobx';

const store = new Store();

reaction(
  () => store.count,  // 관찰할 데이터
  (count) => {
    console.log(`The count has changed to: ${count}`);
  }
);

store.count = 3; // 콘솔에 로그: The count has changed to: 3

reaction은 MobX의 자동 추적 시스템을 활용해, 정확한 타이밍에 콜백을 실행합니다. 비동기 작업이 많아지는 현대 앱에서 이 기능은 없어서는 안 될 도구예요.

4. 옵저버 컴포넌트(observer): React UI의 자동 업데이트

React에서 observer HOC(High-Order Component)를 사용하면 컴포넌트가 옵저버블 변화에 자동으로 반응합니다. 함수형 컴포넌트에 딱 맞아요. 전체 앱을 재렌더링하지 않고, 필요한 부분만 업데이트하므로 성능이 우수합니다.

import React from 'react';
import { observer } from 'mobx-react-lite';

const CounterComponent = observer(({ store }) => (
  <div>
    <h1>Count: {store.count}</h1>
    <button onClick={() => store.count++}>Increment</button>
  </div>
));

export default CounterComponent;

observer로 래핑된 컴포넌트는 사용하는 옵저버블만 감시하므로, 불필요한 렌더링을 최소화합니다. React의 PureComponent나 memo와 함께 쓰면 완벽한 조합이 됩니다.

5. 배열 및 객체를 옵저버블로 사용: 복잡한 상태 관리

MobX는 배열과 객체도 옵저버블로 지원합니다. 중첩된 데이터 구조(예: TODO 리스트)를 쉽게 관리할 수 있어요. 배열의 push/pop이나 객체의 속성 변경까지 세밀하게 추적합니다.

import { observable } from 'mobx';

class TodoStore {
  @observable todos = [];

  addTodo(todo) {
    this.todos.push(todo);
  }
}

const todoStore = new TodoStore();
todoStore.addTodo('Learn React');
console.log(todoStore.todos); // 출력: ['Learn React']

const TodoListComponent = observer(({ todoStore }) => (
  <ul>
    {todoStore.todos.map((todo, index) => (
      <li key={index}>{todo}</li>
    ))}
  </ul>
));

export default TodoListComponent;

이처럼 배열 변경이 UI에 즉시 반영됩니다. 복잡한 폼이나 트리 구조 데이터에서 MobX의 진가가 드러나요.

결론: MobX 옵저버블로 더 나은 React 개발 경험을!

MobX 옵저버블은 종속성 자동 추적과 컴포넌트 간 데이터 흐름 단순화를 통해, React 앱의 반응성을 극대화합니다. 옵저버블 생성부터 computed, reaction, observer, 그리고 복잡한 데이터 구조까지 – 이 개념들을 마스터하면 최소한의 코드로 유지보수성 높은 UI를 만들 수 있어요.

728x90