SW/Gradle

Gradle: subproject 빌드 로직 한 번에 정리, 예제, 방법

얇은생각 2025. 2. 18. 07:30
반응형

시작하면서

Gradle, 처음 쓸 땐 꽤 편하지만 프로젝트가 커지면 관리가 점점 골치 아파지죠? 서브프로젝트가 많아질수록 build.gradle 파일도 여기저기 생기고, duplication된 configuration이 반복되면서 maintenance가 점점 힘들어집니다. "이거 좀 더 쉽게 관리할 방법 없을까?"라는 고민이 들 때가 많을 거예요. 그래서 오늘은 common build logic을 root project로 옮겨서 깔끔하게 정리하는 방법을 알려드리려고 합니다!

보통 규모가 있는 프로젝트에서는 Service Layer, Data Layer, Integration Layer 같은 여러 서브프로젝트가 만들어집니다. 그런데 각각의 build.gradle 파일이 거의 똑같다면? 하나하나 따로 관리하는 대신 공통 설정을 한 곳에 모아두면 훨씬 효율적으로 프로젝트를 운영할 수 있습니다. 이제, 이 작업을 어떻게 하면 좋을지 하나씩 살펴볼까요?

 

Gradle: subproject 빌드 로직 한 번에 정리, 예제, 방법

 

빌드 로직을 공유하면 뭐가 좋을까?

먼저, 이렇게 하면 뭐가 좋은지부터 얘기해볼게요!

  • 일관성 유지: 모든 서브프로젝트가 동일한 빌드 설정을 따르게 됩니다.
  • 유지보수 편리: 한 번만 변경하면 전체 프로젝트에 반영되니까 관리가 훨씬 수월해져요.
  • code 간소화: build.gradle 파일이 짧고 심플해지면서 readability이 확 좋아집니다.
  • 생산성 향상: 반복적인 작업이 줄어들면서 개발에 더 집중할 수 있어요.

 

이제 직접 적용해볼까요?

 

1단계: 현재 빌드 로직 살펴보기

대부분의 Gradle 프로젝트에서는 서브프로젝트별로 build.gradle 파일이 따로 존재하죠. 예를 들어, 서비스 레이어의 build.gradle을 한번 보면:

plugins {
    id 'java'
    id 'application'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
}

repositories {
    jcenter()
}

application {
    mainClassName = 'com.example.Application'
}

 

이런 설정이 데이터 레이어나 통합 레이어에서도 계속 반복되고 있다면? 개별적으로 따로따로 관리하는 것보다는 공통된 설정을 루트 build.gradle로 옮겨서 한 번에 관리하는 게 훨씬 좋습니다.

 

2단계: 서브프로젝트 build.gradle 파일 정리하기

각 서브프로젝트의 build.gradle 파일을 깔끔하게 정리해야 합니다. 중복된 설정을 줄이고, 꼭 필요한 부분만 남겨보죠. 예를 들어, 서비스 레이어의 build.gradle을 이렇게 정리할 수 있어요:

plugins {
    id 'java'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
}

repositories {
    mavenCentral()
}

 

여기서 바뀐 점을 보면:

  • 불필요한 주석 제거
  • jcenter() 대신 mavenCentral() 사용 (JCenter는 이제 잘 안 쓰입니다)
  • 중복된 설정 삭제
  • application 블록 삭제 (서비스 레이어를 독립적으로 실행할 필요가 없다면 굳이 남겨둘 필요 없음)

 

이렇게 정리한 후, 다른 서브프로젝트도 같은 방식으로 간결하게 만들어 주세요.

 

3단계: 공통 로직을 루트 build.gradle로 이동하기

이제, 서브프로젝트에서 삭제한 공통 설정을 루트 프로젝트로 옮겨야 합니다. 그러면 모든 서브프로젝트가 자동으로 이 설정을 따르게 됩니다.

 

루트 build.gradle 수정하기

루트 프로젝트의 build.gradle을 열고, subprojects 블록을 추가해서 공통 빌드 로직을 적용해 보세요.

subprojects {
    apply plugin: 'java'
    apply plugin: 'application'

    repositories {
        mavenCentral()
    }

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web'
        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    }
}

 

이제 모든 서브프로젝트는 자동으로 javaapplication plugin을 적용하고, 동일한 dependencies과 repository 설정을 사용하게 됩니다. 완전 깔끔해졌죠?

 

4단계: 플러그인 적용 방식 개선하기

Gradle에서는 subprojects 블록 내에서 플러그인을 적용할 때 이렇게 쓰는 걸 권장합니다:

subprojects {
    plugins.apply('java')
    plugins.apply('application')
}

 

이 방식이 Gradle 최신 버전과 더 잘 맞고 안정적이기 때문입니다.

 

5단계: 변경 사항 확인하기

설정을 다 했으면, 이제 제대로 동작하는지 확인해 봐야겠죠?

 

프로젝트 정리하기

터미널에서 루트 디렉터리로 이동한 후 다음 명령어를 실행하세요:

gradle clean

 

이 명령어를 실행하면, 모든 서브프로젝트에서 build 폴더가 삭제됩니다.

 

프로젝트 다시 빌드하기

이제 프로젝트를 다시 빌드해 봅시다:

gradle build

 

정상적으로 설정이 반영됐다면, 서브프로젝트들이 문제없이 빌드될 거예요.

 

마무리하면서

이렇게 공통 빌드 로직을 루트 build.gradle로 옮기면 유지보수도 편해지고 코드도 깔끔해지면서 관리가 쉬워집니다. 한 번 설정해 두면, 새로운 서브프로젝트를 추가할 때도 정말 간단해져요.

반응형