모바일 애플리케이션 개발은 팀의 규모와 관계없이 복잡한 작업이 될 수 있습니다. 특히 여러 브랜드의 앱을 관리하고 각각의 사용자 경험을 제공해야 할 때, 기존의 방법론으로는 한계가 있습니다. 이러한 문제를 해결하기 위해 0x1-company/ios-monorepo 프로젝트가 주목받고 있습니다. 이 프로젝트는 비즈니스 로직을 공유하고 UI를 별도로 구현하는 방식으로, 작은 팀이 여러 앱을 효율적으로 개발하고 운영할 수 있게 해줍니다.

이 프로젝트의 주요 특징

ios-monorepo는 네 개의 브랜드 앱을 관리하는 시스템입니다. 각 앱은 고유한 UI를 가지고 있지만, 모두 동일한 핵심 비즈니스 로직을 공유합니다. 이를 통해 팀은 개발 및 관리의 복잡성을 줄일 수 있습니다. 아래는 이 프로젝트의 주요 구성 요소입니다:
  • MatchCore: 모든 브랜드에서 공유하는 비즈니스 로직을 구현한 패키지입니다. 주로 TCA(Composable Architecture) 방식으로 리듀서를 작성하여, 각 앱 UI 패키지에서 이를 참조합니다.
  • 비즈니스 로직과 UI의 분리: 비즈니스 로직은 MatchCore에서 관리하고, 각 브랜드의 UI는 별도의 패키지로 분리하여 유지합니다. 예를 들어, RecommendationReducer를 구현하면 각 브랜드에서 이에 맞는 RecommendationView를 생성할 수 있습니다.
  • 재사용성: 이 구조 덕분에 서로 다른 제품을 개발할 때도 기존의 종속성 코드와 유틸리티 코드를 재사용할 수 있습니다.
  • 설치 및 기본 사용법

    이 프로젝트를 시작하기 위해서는 다음 단계를 따르면 됩니다:

    1. GitHub Repository 클론

    먼저, GitHub에서 이 프로젝트를 클론합니다:

    git clone https://github.com/0x1-company/ios-monorepo.git
    cd ios-monorepo

    2. 의존성 설치

    Swift 패키지 관리자를 통해 필요한 의존성을 설치합니다. 아래 명령어를 사용하여 의존성을 업데이트합니다:

    swift package update

    3. Xcode에서 열기

    이제 Xcode에서 Package.swift 파일을 열고, 원하는 앱의 UI 패키지를 선택하여 개발을 시작할 수 있습니다.

    기본 코드 예제

    여기서는 MatchCore에서 리듀서를 정의하고, UI에서 이를 사용하는 간단한 예제를 살펴보겠습니다.

    MatchCore의 리듀서 예제

    import ComposableArchitecture
    
    struct RecommendationState: Equatable {
        var recommendations: [String] = []
    }
    
    enum RecommendationAction {
        case fetchRecommendations
    }
    
    struct RecommendationEnvironment {
        var fetchRecommendations: () -> Effect<[String], Never>
    }
    
    let recommendationReducer = Reducer<RecommendationState, RecommendationAction, RecommendationEnvironment> { state, action, environment in
        switch action {
        case .fetchRecommendations:
            return environment.fetchRecommendations()
                .receive(on: DispatchQueue.main)
                .catchToEffect()
                .map { recommendations in
                    state.recommendations = recommendations
                    return .none
                }
        }
    }

    UI에서 리듀서 사용하기

    UI 패키지에서는 다음과 같이 리듀서를 사용하여 추천 목록을 표시할 수 있습니다.

    import SwiftUI
    import ComposableArchitecture
    
    struct RecommendationView: View {
        let store: Store<RecommendationState, RecommendationAction>
    
        var body: some View {
            WithViewStore(store) { viewStore in
                List(viewStore.recommendations, id: \.self) { recommendation in
                    Text(recommendation)
                }
                .onAppear {
                    viewStore.send(.fetchRecommendations)
                }
            }
        }
    }

    실무에서의 활용 시나리오

    이 구조는 특히 여러 브랜드를 운영하는 스타트업이나 중소기업에서 큰 장점을 제공합니다. 예를 들어, 한 팀이 다양한 사용자 그룹을 겨냥한 여러 앱을 동시에 운영할 때, 비즈니스 로직을 공유함으로써 개발자들은 중복된 작업을 줄이고 서로 다른 제품의 특성에 맞게 UI를 조정할 수 있습니다. 또한, 새로운 브랜드나 기능을 추가할 때도 기존의 로직을 그대로 재사용할 수 있어 빠른 개발이 가능합니다.

    비슷한 도구와의 비교

    이와 유사한 도구로는 MonoRepo 구조를 따른 다른 프로젝트들이 있습니다. 예를 들어, Lerna는 JavaScript 생태계에서 잘 알려진 MonoRepo 관리 도구입니다. 하지만 ios-monorepo는 Swift와 TCA를 기반으로 한 맞춤형 설계로, iOS 앱 개발에 더욱 최적화되어 있습니다.

    추천 대상

  • 여러 브랜드의 앱을 개발 및 운영하고 있는 스타트업
  • 비즈니스 로직을 재사용하고 싶은 중소기업
  • Swift와 TCA에 관심이 있는 iOS 개발자

이 프로젝트는 GitHub에서 확인할 수 있습니다: 0x1-company/ios-monorepo

이상으로 ios-monorepo 프로젝트에 대한 소개를 마칩니다. 작은 팀으로도 여러 앱을 효율적으로 관리할 수 있는 이 방법을 활용해 보세요!