본문 바로가기
Swift

Swift TCA에서 Environment의 역할

by mr.conan 2023. 7. 3.
728x90
반응형

SwiftUI를 기반으로 한 Typed Composable Architecture(TCA)는 복잡한 앱 상태 관리와 상호작용을 위한 강력한 도구입니다. TCA의 핵심 개념 중 하나는 "environment"입니다. Environment은 주로 앱의 의존성을 캡슐화하고 상태 및 액션과 상호작용하는 외부 시스템과의 통신을 담당합니다.

Environment를 이해하기 위해 예시 앱을 가정해보겠습니다. 예를 들어, 할 일 목록을 관리하는 앱을 만든다고 가정해봅시다. 우리의 앱은 할 일을 저장하고 가져오는 네트워크 서비스와 상호작용해야 합니다. 이런 경우, TCA의 environment를 사용하여 이 작업을 처리할 수 있습니다.

1. Environment 모델링하기

첫 번째로, 우리는 앱의 외부 시스템과 상호작용하는 데 사용할 environment를 모델링해야 합니다. 이를 위해 다음과 같은 코드를 작성할 수 있습니다.

struct AppEnvironment {
    var todoService: TodoService
}

struct TodoService {
    func fetchTodos() -> Effect<[Todo], Error> {
        // 네트워크를 통해 할 일 목록을 가져오는 비동기 작업
    }
    
    func save(todo: Todo) -> Effect<Bool, Error> {
        // 네트워크를 통해 할 일을 저장하는 비동기 작업
    }
}

위의 코드에서 AppEnvironment는 우리의 앱이 의존하는 외부 시스템을 캡슐화하는 구조체입니다. 이 예시에서는 TodoService를 사용하여 할 일 목록을 가져오고 저장합니다.

2. Reducer에서 Environment 사용하기

다음으로, 우리는 TCA의 Reducer에서 environment를 사용하여 외부 시스템과 상호작용할 수 있습니다. 이를 위해 Reducer를 작성하고 environment를 전달해야 합니다.

enum AppAction {
    case fetchTodos
    case todosResponse(Result<[Todo], Error>)
    case saveTodo(Todo)
    case todoSaved(Result<Bool, Error>)
}

struct AppState {
    var todos: [Todo] = []
}

let appReducer = Reducer<AppState, AppAction, AppEnvironment> { state, action, environment in
    switch action {
    case .fetchTodos:
        return environment.todoService.fetchTodos()
            .map { .todosResponse(.success($0)) }
            .catch { Just(.todosResponse(.failure($0))) }
        
    case .todosResponse(.success(let todos)):
        state.todos = todos
        return .none
        
    case .todosResponse(.failure):
        return .none
        
    case .saveTodo(let todo):
        return environment.todoService.save(todo: todo)
            .map { .todoSaved(.success($0)) }
            .catch { Just(.todoSaved(.failure($0))) }
        
    case .todoSaved:
        return .none
    }
}

위의 예제에서 appReducer는 AppState, AppAction, 그리고 AppEnvironment를 기반으로한 TCA Reducer입니다. Reducer는 fetchTodos와 saveTodo 액션에 따라서 외부 시스템과 상호작용합니다. 예를 들어, .fetchTodos 액션이 실행되면 environment.todoService.fetchTodos()를 호출하여 할 일 목록을 가져오고, 결과에 따라 액션을 생성합니다.

3. Store 생성하기

마지막으로, Store를 생성할 때 우리는 environment를 전달해야 합니다

let todoService = TodoService()
let appEnvironment = AppEnvironment(todoService: todoService)

let store = Store(
    initialState: AppState(),
    reducer: appReducer,
    environment: appEnvironment
)

위의 예제에서 appEnvironment를 생성하고, 이를 Store에 전달합니다. Store는 Reducer와 함께 앱의 상태 및 액션을 관리하며, Reducer는 environment를 사용하여 외부 시스템과 상호작용합니다.

결론

Swift TCA에서 environment는 앱의 외부 시스템과의 상호작용을 처리하는 중요한 요소입니다. 이를 통해 앱의 의존성을 캡슐화하고 테스트 가능한 코드를 작성할 수 있습니다. 위의 예시를 참고하여 TCA와 environment를 사용하여 복잡한 앱을 구축해보세요!

728x90
반응형