Backend/Java

공통 lib -> spring-boot-starter로 바꾸기(2)

비비빅B 2023. 3. 20. 21:31

gradle로 마이그레이션 하기

현재 프로젝트는 maven으로 구성되어있다. 꼭 필요한 작업은 아니지만 maven보다는 gradle을 사용하면 이점이 많기 때문에, gradle로 전환하고 spring-starter 프로젝트로 변환하려 했었다. 마이그레이션 공식문서도 있고 툴도 있어서, 손쉽게 전환할 수 있을지 알았지만 생각보다 많은 삽질이 있었고, 그 과정을 공유해본다.

 

maven 프로젝트 구성

프로젝트는 아래와 같이 구성되어 있다. master 프로젝트가 서브 모듈 worker를 가지는 구조로 하나의 라이브러리 프로젝트를 구성하고 있다. 그리고 이 라이브러리 프로젝트를 사용하는 별도의 빌드 프로세스를 가지는 외부 프로젝트가 있다.

  • 멀티모듈 프로젝트1(라이브러리) -> master-worker
  • 외부 프로젝트1(라이브러리를 사용하는 클라이언트) -> slave

좀 더 자세한 구조를 보고 싶다면, 이전 글을 참고하면 된다.

2023.02.13 - [Backend/Java] - 공통 lib -> spring-boot-starter로 바꾸기(1)


gradle 마이그레이션 툴

gradle에서 마이그레이션 툴 기능을 제공하는데 크게 2가지가 있다. 단, 이 툴을 사용하기 위해서는 gradle이 로컬 컴퓨터에 설치돼있어야 한다.

 

build scan

빌드 과정에서 발생하는 정보를 보고서로 작성해서 보여준다. 이 기능을 활용해서 마이그레이션 과정에서 생략된게 없는지, 성능은 얼마나 향상됐는지 확인할 수 있다.

gradle build --scan

 

maven 프로젝트의 경우 별도의 `extension`이 필요한데 프로젝트 루트 경로에서 `.mvn/extensions.xml`에 파일을 생성 후 아래 내용을 입력하고 install 하면 된다.

<extensions>
    <extension>
        <groupId>com.gradle</groupId>
        <artifactId>gradle-enterprise-maven-extension</artifactId>
        <version>1.16.5</version>
    </extension>
</extensions>
mvn install

build scan으로 생성된 빌드 보고서

gradle init

 gradle은 시작 명령을 하면 maven 프로젝트가 있는지 확인하고, maven 설정을 gradle 설정으로 자동 변환시켜준다. 물론 완벽하게 마이그레이션하지는 못하지만, 어느정도 틀을 만들어준다는 점에서 상당히 편리한 기능이다. maven 프로젝트 루트 경로(pom.xml 경로)에서 아래 명령어를 입력하면 된다.

gradle init

 

마이그레이션 툴을 사용해서 maven 프로젝트를 gradle 프로젝트로 바꾸고 난 후의 디렉토리 구성이다.

├── master
│   ├── buildSrc
│   │   ├── build.gradle
│   │   └── src
│   │       └── main
│   │           └── groovy
│   │               └── me.bbbicb.java-conventions.gradle
│   ├── gradle
│   │   └── wrapper
│   ├── gradlew
│   ├── gradlew.bat
│   ├── settings.gradle
│   └── worker
│       ├── build.gradle
│       └── src
│           └── main
│               ├── java
│               │   └── me
│               │       └── bbbicb
│               │           └── worker
│               │               └── MasterProperty.java
│               └── resources
│                   └── application.yml
└── slave
    ├── build.gradle
    ├── gradle
    │   └── wrapper
    ├── gradlew
    ├── gradlew.bat
    ├── settings.gradle
    └── src
        ├── main
        │   ├── java
        │   │   └── me
        │   │       └── bbbicb
        │   │           └── slave
        │   │               └── SlaveApplication.java
        │   └── resources
        │       └── application.properties
        └── test
            └── java
                └── me
                    └── bbbicb
                        └── slave
                            └── SlaveApplicationTests.java

별개의 로컬 project import 하기

 

저렇게 자동으로 변환시켜준대로 잘 동작하면 좋겠지만, 바로 문제가 생겼다. 라이브러리 프로젝트(master-worker)를 사용하는 클라이언트 웹 프로젝트(slave)에서 컴파일 오류가 발생했다.

오류의 내용은 worker 프로젝트를 제대로 import하지 못하는 것이었다. maven에서는 별 무리없이 동작했는데, 당황스러웠다.

라이브러리 프로젝트의 public class 가 import 되지 않음

 

// slave project build.gradle
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.0.2'
    id 'io.spring.dependency-management' version '1.1.0'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'me.bbbicb:worker:0.0.1-SNAPSHOT'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

group = 'me.bbbicb'
version = '0.0.1-SNAPSHOT'
description = 'slave'
java.sourceCompatibility = JavaVersion.VERSION_17

dependencyManagement {
    imports {
        mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
    }
}

test {
    useJUnitPlatform()
}

dependencies 구역을 보면 worker 프로젝트를 명시했지만, local project에서는 못찾는 것이 문제였다. master-worker 프로젝트를 배포하지 않았으니, 당연히 mavenCentral에서는 찾지 못한다.

의존성 관리에서 프로젝트 중에 로컬 디렉토리에서 찾을 수 있다면, 그 로컬 프로젝트를 바라보게 해야한다. 

Composing Builds

빌드 프로세스에서 임의의 프로젝트도 같이 빌드하는 기능이다. 기본적으로 gav(groupId, artifactId, version)이 같은 프로젝트가 로컬에 있다면 해당 프로젝트 소스로 빌드한다. 

내 경우에는 slave 프로젝트가 로컬에 있는 별도의 worker 프로젝트를 import해야하므로 아래와 같이 작성했다.

// slave project settings.gradle
rootProject.name = 'slave'
includeBuild '../master'

간단하게 `includeBuild`로 slave 빌드 과정에 로컬에 있는 master 프로젝트를 의존하게 만들 수 있다.

위의 방식은 간단하지만 gradle에서 추천하지는 않는 방법이라고 하는데, 이유는 좀 더 찾아봐야할 듯 하다.

정상적으로 worker 프로젝트를 import


gradle은 공부하면서 느끼는 점은, 문서도 많고 생각보다 어렵다는 점이다.

그래도 빌드툴을 공부해야겠다고 많이 느끼고 있기 때문에, 차근차근 공부해나갈 생각이다.

 

자세한 소스는 아래 깃허브 링크에서 확인할 수 있다.

https://github.com/HyoJip/start-gradle/tree/gradle-migration


 

 

Getting started with Build Scan™ for Gradle and Apache Maven™ | Gradle Inc.

Create a Build Scan™ with the quickstart sample project, or follow the steps below with your project. Run your build with the --scan option. gradle build --scan 1. Apply the plugin Add this code snippet to the top of the build.gradle file of the root pro

scans.gradle.com

 

Composing builds

By default, Gradle will configure each included build in order to determine the dependencies it can provide. The algorithm for doing this is very simple: Gradle will inspect the group and name for the projects in the included build, and substitute project

docs.gradle.org