탐험하는 바이트스토리

🖱️ Swift에서 Redux 아키텍처: 상태 관리의 궁극적인 해결책 본문

프로그래밍

🖱️ Swift에서 Redux 아키텍처: 상태 관리의 궁극적인 해결책

버그메이커 2025. 3. 18. 18:32
반응형

1. Redux란?

Redux는 단일 상태 트리(single state tree)와 액션(action)을 기반으로 한 상태 관리 패턴이야.

원래는 JavaScript 생태계에서 React와 함께 사용하기 위해 개발되었지만,

상태 관리가 중요한 애플리케이션에서는 Swift에서도 활용할 수 있어.

Redux의 가장 큰 특징은 앱의 상태를 단일 저장소(store)에 보관하고,

액션을 통해 상태를 변경한다는 점이야. 이 덕분에 상태 변경의 흐름이 명확해지고, 예측 가능성이 높아져!


2. Redux 아키텍처의 핵심 개념

Redux는 크게 3가지 핵심 요소로 구성돼:

🔹 1) State (상태)

앱의 모든 상태를 하나의 저장소(Store)에서 관리해. 예를 들어, 로그인 여부, 사용자 정보, UI 상태 같은 것들이 포함될 수 있어.

struct AppState {
    var counter: Int = 0
}

🔹 2) Action (액션)

상태를 변경하는 유일한 방법이야. 액션은 무엇을 해야 하는지 나타내는 객체이며, 일반적으로 typepayload(데이터)를 포함해.

struct IncrementAction {}
struct DecrementAction {}

🔹 3) Reducer (리듀서)

액션이 발생하면, 리듀서가 현재 상태와 액션을 받아 새로운 상태를 반환해.

func counterReducer(state: inout AppState, action: Any) {
    if let _ = action as? IncrementAction {
        state.counter += 1
    } else if let _ = action as? DecrementAction {
        state.counter -= 1
    }
}

🔹 4) Store (저장소)

Redux의 중심 역할을 하는 저장소야. 앱 전체의 상태를 보관하고, 액션을 받아 리듀서를 통해 상태를 갱신해.

class Store: ObservableObject {
    @Published var state = AppState()

    func dispatch(action: Any) {
        counterReducer(state: &state, action: action)
    }
}

3. Swift에서 Redux 아키텍처 적용하기

이제 Redux를 SwiftUI에서 활용하는 방법을 살펴보자!

✅ 1) State (앱의 상태 정의)

struct AppState {
    var count: Int = 0
}

✅ 2) Action (상태 변경을 위한 액션 정의)

enum CounterAction {
    case increment
    case decrement
}

✅ 3) Reducer (상태를 변경하는 리듀서 함수)

func counterReducer(state: inout AppState, action: CounterAction) {
    switch action {
    case .increment:
        state.count += 1
    case .decrement:
        state.count -= 1
    }
}

✅ 4) Store (상태를 관리하는 중앙 저장소)

class AppStore: ObservableObject {
    @Published private(set) var state = AppState()

    func dispatch(action: CounterAction) {
        counterReducer(state: &state, action: action)
    }
}

✅ 5) View (SwiftUI에서 Redux 상태 사용)

import SwiftUI

struct CounterView: View {
    @ObservedObject var store: AppStore

    var body: some View {
        VStack {
            Text("Count: \(store.state.count)")
                .font(.largeTitle)

            HStack {
                Button("+") {
                    store.dispatch(action: .increment)
                }
                .padding()

                Button("-") {
                    store.dispatch(action: .decrement)
                }
                .padding()
            }
        }
    }
}

✅ 6) 앱에 Store 적용하기

@main
struct ReduxApp: App {
    let store = AppStore()

    var body: some Scene {
        WindowGroup {
            CounterView(store: store)
        }
    }
}

4. Redux의 장점

예측 가능한 상태 관리 – 상태가 중앙에서 관리되므로, 상태 변화의 흐름이 명확해.
디버깅이 쉬움 – 모든 상태 변경이 액션을 통해 이루어지기 때문에 디버깅이 용이해.
테스트 가능성이 높음 – Reducer는 순수 함수이므로, 단위 테스트를 쉽게 할 수 있어.
앱 전체에서 일관된 상태 유지 – 여러 뷰에서 동일한 상태를 공유할 때 유용해.


5. Redux의 단점

코드량 증가 – MVC에 비해 코드가 많아질 수 있어. 간단한 앱에서는 오히려 불필요한 복잡성을 초래할 수도 있어.
초기 학습 비용 – 기존의 SwiftUI 상태 관리 방법(@State, @ObservedObject)에 익숙한 사람들에게는 다소 어렵게 느껴질 수 있어.
비동기 처리 복잡 – Redux 자체가 비동기 처리를 직접 지원하지 않기 때문에 Combine이나 RxSwift 같은 추가 도구가 필요할 수 있어.


6. Redux는 언제 사용할까?

  • 상태 관리가 복잡한 앱 (예: 채팅, 소셜 네트워크, 쇼핑 앱 등)
  • 여러 뷰에서 같은 데이터를 공유해야 하는 경우
  • 예측 가능한 상태 관리가 중요한 경우
  • 앱의 규모가 크고 유지보수가 중요한 경우

작은 프로젝트에서는 @State@ObservableObject만으로 충분하지만,

규모가 커지면 Redux를 고려하는 것이 좋아!


7. 결론

Redux는 대규모 앱에서 강력한 상태 관리 도구로 사용될 수 있어.

다만, 코드량이 많아지고 복잡도가 증가할 수 있기 때문에 작은 앱에서는 굳이 사용할 필요가 없을 수도 있어.

하지만 상태 관리가 중요한 프로젝트라면 Redux는 확실한 해결책이 될 거야!

이제까지 Swift에서 사용되는 주요 아키텍처 패턴들을 정리해봤어.

필요할 때 적절한 패턴을 선택해서 활용하면 개발 생산성이 확 올라갈 거야! 🚀

반응형