티스토리 뷰

최근 담당한 앱(A)과 유사한 버전의 또 다른 앱(B)를 출시하게 되었다. 

두 앱은 기능적으로는 거의 유사하지만, 그렇다고 또 완전히 스킨만 다른 같은 앱은 아니었다. 

 

아이콘, 스플래시등만 다른 스킨의 앱이었다면 productFlavor 로 관리 했겠지만, 

A, B앱 둘다 서로 유사하다가도 언제 어느쪽으로 코드가 갈라질지 모르는 상황이었다. 

 

먼저, A앱을 출시한 상태에서 B앱을 개발할때 아래와 같이 관리를 했었다. 


1. 두개의 repository 로 각각 관리

이 관리 방식은 가장 명확했지만, 

관리에 어려움을 겪었다. 

 

예를들어 A.MainActivity 가 변경된다면, B.MainActivity 도 똑같이 변경해줘야 했고, 

변경점이 작다면 큰 문제없이 처리할 수 있었지만 대규모 변경에서는 휴먼 에러가 날 가능성이 높았다. 

 

처음에는 이런 대규모 변경이 일어날 때면,  A앱의 src 폴더를 하드카피 해서 B앱으로 옮기고 패키지명을 변경해 주는 방식으로 했었다. 

개발 외적으로 피로도가 너무 심했고, 다른 방법을 고심해 보기로 했다. 


2. Mono repository 관리 

매번 프로젝트를 달리열어서 변경점을 수정해주고, 하드카피하고.. 이런 방식은 너무 피로도가 있다고 느껴져서, 

위와 같은 방식으로 일단 A app 과 B app 을 모노레포로 합쳐버렸다. 

 

일단, 프로젝트를 열었다 닫았다 해야하는 번거로움을 줄어들었지만, 대규모 변경에는 취약하다는걸 계속 느끼고 있었다. 

 

어차피 A app 에서 변경점이 일어나면 같은 feature 를 이용하는 B app 도 동일하게 변경되어야 했다.

 

A app 과 B app 의 같은 부분을 재사용할 필요성을 느끼고 있었다. 


3. Mono Repo + Multi module 관리 

결국 현재 위와 같은 방법으로 관리하고 있다. 

 

각각의 feature (UI 가 포함된 기능) 을 android module 로 묶고. 

A app 과 B app 은 각각 필요한 feature 들만 가져와서 앱을 배포하는 방식이다.

 

위에서 보이는 pose feature 가 추후 A app 과 B app 이 달라질 가능성이 있는데, 

이때는

    - pose-A feature

    - pose-B feature

    - pose-core feature 

방식으로 세분화 할 계획이다. 

 

여전히 익숙하지 않은 것은 있다.

A app 인줄 알고 열심히 MainActivity 를 고치고있었는데 알고보니 B app 의 MainActivity 였던것..

생각없이 하다보면 종종 실수할 우려가 있다


** 번외 1 : build-logic 관리 ** 

모듈이 늘어나게 되면 build.gradle.kts 도 엄청나게 많아지고, 

이에 따른 보일러 플레이트 코드도 많아진다. 

 

이들을 하나로 묶어야 할 필요성을 느꼈고, 

custom-plugin 으로 처리할 수 있었다. 

 

아래와 같이 build-logic 을 구성했고, 

이제는 feature 나 core 모듈이 새로 생성되어도, build.gradle 에는 plug-in 만 적용하면 되게 되었다. 

 

많은 예제들을 봤었는데

 

dependency 까지 묶어버리는 예가 대부분 이었지만, 

나는 디펜던시 관리는 각 모듈에서 명시적으로 직접 관리하는게 더 낫겠다는 생각에 

의미없이 복붙해야 하는 코드만 플러그인으로 구성했다. 

 

 

 

 

 

/**
 * core-* module 에서 공통으로 사용할 plug-in
 */
class CoreDefaultPlugIn: Plugin<Project> {
    override fun apply(target: Project) {

        with(target) {
            with(pluginManager) {
                apply("com.android.library")
                apply("org.jetbrains.kotlin.android")
            }


            extensions.configure<BaseExtension> {
                compileSdkVersion(libs.findVersion("compileSdk").get().toString().toInt())

                defaultConfig {
                    minSdk = libs.findVersion("minSdk").get().toString().toInt()
                    targetSdk = libs.findVersion("targetSdk").get().toString().toInt()

                    testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
                    vectorDrawables.useSupportLibrary = true
                }


                buildTypes {
                    getByName("debug") {
                        isDebuggable = true

                        buildConfigField("boolean", "IS_DEBUG", "true")
                    }

                    getByName("release") {
                        isDebuggable = false
                        isMinifyEnabled = false

                        proguardFiles(
                            getDefaultProguardFile("proguard-android-optimize.txt"),
                            "proguard-rules.pro"
                        )

                        buildConfigField("boolean", "IS_DEBUG", "false")
                    }
                }

                buildFeatures.buildConfig = true

                compileOptions {
                    sourceCompatibility = JavaVersion.VERSION_17
                    targetCompatibility = JavaVersion.VERSION_17
                }
            }

            target.tasks.withType<KotlinCompile>().configureEach {
                compilerOptions {
                    jvmTarget.set(JvmTarget.JVM_17)
                }
            }
        }
    }
}

 


** 번외 2 : 배포 자동화 ** 

앱이 두개니, 같은 변경점에 대해서 배포가 되어야 하면 두 앱을 항상 동시에 배포해야 했다. 

기존에도 github action 을 이용해서 배포를 하고 있었지만, 모노레포에서 두개의 앱의 배포자동화 경험이 없어서 많은 시행착오를 겪었다. 

 

아래와 같이 A app(debug, release) B app(debug, release) 로 구성했다. 

 

 

a-app release 배포 간단 예..

on:
  push:
    branches: [release/a-app]

env:
  startColor: "#0000ff"    # 파란색
  successColor: "#2eb886"  # 초록색
  failColor: "#ff0000"     # 빨간색

jobs:
  setting:
    name: Setting
    runs-on: ubuntu-latest

    steps:......

 

 

특정 브랜치로 푸시하면, A-app 과 B-app 의 자동배포를 구성했고, 

slack 에 webhook 도 연동해서 이제는 배포도 힘들이지 않고 할수 있게 되었다. 

 

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함