본문 바로가기
Flutter/Package

플러터 상태관리: Redux 심층 가이드

by Maccrey Coding 2024. 7. 22.
반응형

플러터 앱 개발에서 상태 관리는 가장 중요한 부분 중 하나입니다.
Redux는 예측 가능한 상태 변경을 위한 상태 관리 라이브러리로, 앱의 상태를 단일 소스로 관리하고 UI와 일관되게 동기화하는 데 도움을 줍니다.

Redux는 Flux 아키텍처를 기반으로 구현되었으며, 다음과 같은 주요 특징을 가지고 있습니다.

  • 단일 상태 소스: Redux는 앱의 모든 상태를 단일 객체에 저장합니다.
  • 불변 상태: Redux 상태는 불변하며, 직접 변경될 수 없습니다.
  • 순수한 함수: Redux 액션과 리듀서 함수는 순수한 함수로 작성되어야 합니다.
  • 예측 가능한 상태 변경: Redux는 상태 변경을 예측 가능하게 만들고, 디버깅을 용이하게 합니다.

1. Redux 구성 요소

 

Redux는 다음과 같은 세 가지 주요 구성 요소로 구성됩니다.

  • Store: 앱의 상태를 저장하는 객체입니다.
  • Actions: 상태를 변경하는 요청을 나타내는 객체입니다.
  • Reducers: 액션을 처리하고 상태를 업데이트하는 함수입니다.

2. Redux 사용법

 

Redux를 사용하려면 다음과 같은 기본 단계를 따릅니다.

 

2.1. redux 패키지 설치

먼저, Flutter 프로젝트의 루트 디렉토리에서 pubspec.yaml 파일을 열어 redux 패키지를 추가합니다.

dependencies:
  flutter:
    sdk: flutter
  redux: ^6.0.1 # 원하는 버전으로 변경 가능
  redux_thunk: ^0.8.0 # 비동기 작업을 처리하기 위한 미들웨어
  flutter_redux: ^0.8.0 # Flutter와 Redux를 연결하기 위한 패키지

패키지 버전은 최신 버전으로 업데이트하거나, 특정 버전을 명시할 수 있습니다.

 

2.2. 패키지 설치

pubspec.yaml 파일을 수정한 후, 터미널에서 다음 명령어를 실행하여 패키지를 설치합니다

flutter pub get

 

2.3. Store 생성

 

import 'package:redux/redux.dart';

// 상태 객체
class AppState {
  int counter = 0;
}

// 리듀서 함수
AppState reducer(AppState state, dynamic action) {
  switch (action) {
    case 'increment':
      return AppState(counter: state.counter + 1);
    case 'decrement':
      return AppState(counter: state.counter - 1);
    default:
      return state;
  }
}

// Store 생성
final store = Store<AppState>(reducer, initialState: AppState());
 
  • redux 패키지를 import합니다.
  • 상태 객체를 정의합니다.
  • 리듀서 함수를 작성합니다.
  • Store 객체를 생성합니다.

2.4. UI에서 Store에 접근

 
import 'package:flutter/material.dart';
import 'package:redux/redux.dart';

class CounterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StoreConnector<AppState, int>(
      converter: (state) => state.counter,
      builder: (context, counter) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Redux Counter'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text('Count: $counter'),
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    ElevatedButton(
                      onPressed: () => store.dispatch('increment'),
                      child: Text('Increment'),
                    ),
                    SizedBox(width: 10),
                    ElevatedButton(
                      onPressed: () => store.dispatch('decrement'),
                      child: Text('Decrement'),
                    ),
                  ],
                ),
              ],
            ),
          ),
        );
      },
    );
  }
}
 
  • StoreConnector 위젯을 사용하여 Store에 접근합니다.
  • converter 속성을 사용하여 상태 객체에서 원하는 값을 추출합니다.
  • builder 콜백 함수에서 추출된 값을 사용하여 UI를 구성합니다.
  • store.dispatch() 메서드를 사용하여 액션을 전송합니다.

3. Redux 활용 팁

  • 상태 객체를 최대한 단순하게 유지하세요.
  • 리듀서 함수에서 순수한 함수를 사용하세요.
  • redux_dev_tools 패키지를 사용하여 Redux 개발을 용이하게 하세요.
  • 테스트를 통해 Redux 코드를 검증하세요.

4. Redux 고급 기능

  • 타임 트래블 디버깅: 과거 상태로 돌아가 디버깅을 수행하는 기능을 제공합니다.
  • Redux Saga: 비동기 액션 처리를 위한 라이브러리입니다.
  • Redux Thunk: 비동기 액션 처리를 위한 미들웨어입니다.

5. Redux 활용 예시

  • 간단한 카운터 앱: 위에서 소개한 예시처럼 Redux를 사용하여 간단한 카운터 앱을 만들 수 있습니다.
  • 폼 유효성 검사: 사용자 입력 데이터의 유효성을 검사하고 UI에 피드백을 제공하는 데 사용할 수 있습니다.
  • API 통신 및 데이터 페칭: API 호출을 처리하고 응답 데이터를 관리하는 데 사용할 수 있습니다.
  • 상태 기반 라우팅: 사용자의 상호 작용에 따라 앱의 라우팅을 제어하는 데 사용할 수 있습니다.

6. Redux 대안

 

Redux 외에도 Flutter에서 사용할 수 있는 다양한 상태 관리 솔루션이 있습니다.

  • Provider: 상태 객체를 사용하여 상태를 관리하는 패턴입니다.
  • BLoC: 비즈니스 로직과 UI를 분리하는 패턴입니다.
  • Get: 간편하고 가벼운 상태 관리 솔루션입니다.

어떤 상태 관리 솔루션을 선택할지는 프로젝트의 특성과 개발자의 선호에 따라 다릅니다.

 

7. 결론

 

Redux는 Flutter 앱 개발에서 예측 가능하고 효율적인 상태 관리를 위한 강력한 도구입니다. 단일 상태 소스, 순수한 함수, 예측 가능한 상태 변경 등의 특징을 통해 앱의 코드 품질과 유지 관리성을 향상시킬 수 있습니다.

이 블로그 게시글을 통해 Redux의 기본적인 사용법과 활용 팁을 이해하셨기를 바랍니다. 더 궁금한 점이나 알아보고 싶은 기능이 있다면 언제든지 댓글 남겨주세요!

 

이 외에도 궁금한 점이나 알아보고 싶은 기능이 있다면 언제든지 댓글 남겨주세요!

 

반응형