Gradle 소개 및 Maven 프로젝트를 Gradle로 변경하기

작성: 2022.04.23

수정: 2022.04.23

읽는시간: 00 분

Programming/Java

반응형

Gradle

소개

Gradle은 다양한 프로그래밍 언어를 지원하는 빌드 자동화 도구 입니다. 빌드는 소스코드로 작성된 파일을 컴퓨터나 휴대폰 등 에서 실행가능한 소프트웨어 가공물로 변환하는 과정을 말하는데요, 자바의 예를 들면 아래의 과정을 거칩니다.

  • 소스 코드 작성
  • 자바 컴파일러가 소스코드.java를 -> 바이트코드.class로 컴파일
  • 테스트 소스 컴파일
  • 테스트 실행(유닛테스트, 통합테스트 등)
  • jar 혹은 war 파일로 패키징
  • 헬스체크 후 빌드 결과 출력

Apache Ant 및 Apache Maven의 컨셉을 기반으로 하지만, XML로 설정파일을 작성하는 Maven과는 대조적으로 훨씬 간단한 Groovy 언어를 사용 합니다.

또한 Gradle은 Apache License 2.0 기반의 오픈소스 이며 JVM(자바 가상 머신) 위에서 실행됩니다

Maven과의 비교

출처: https://gradle.org/maven-vs-gradle/

  • 유연성: Gradle과 Maven 모두 설정파일 작성을 통해 규칙을 정합니다. 다만 메이븐이 굉장히 엄격한 모델을 제공함으로서 커스터마이징이 굉장히 지루하고 때로는 불가능한 것 과는 대조적으로 Gradle은 책임감있고 권한있는 사용자를 전제로 빌드되어 훨씬 유연합니다.
  • 속도: 빌드 타임을 줄이는건 생산성을 향상시키는 가장 직관적인 방법 중 하나 입니다. Gradle과 Maven 모두 병렬 처리를 지원하지만 가장 큰 차이는 Gradle의 작업 회피 및 Incrementality(증분 메카니즘)입니다. Gradle은 작업들의 input과 output을 추적함으로서 불필요한 작업들을 회피하고 가능한 한 변경이 일어난 파일들만을 처리하려고 합니다. 또한 같은 input의 다른 Gradle 빌드 결과를 Cache(캐시) 해두고 재사용 합니다. 아래의 사진은 Apache Commons Lang3의 빌드에 걸린 시간을 비교한 차트 입니다.

image-20220423200818475

Ref: https://gradle.org/maven-vs-gradle/

  • 사용자 친화: Gradle 팀은 IDE 제작사들과의 긴밀한 협업을 통해 IDE에서의 다양한 지원을 꾸준히, 그리고 매우 빠르게 계속해서 개선하고 있습니다. 그 뿐만 아니라 Build Scan™을 통해 web 기반 UI에서 디버깅 및 빌드 최적화를 지원합니다.

Build Scan™

Build Scan

아래의 표를 통해 확인 할 수 있는 것 처럼 주기적인 업데이트가 진행되었고, 지금은 7.0 버전이 널리 사용되고 있습니다.

image-20220423201553701

https://en.wikipedia.org/wiki/Gradle

Gradle 설치

Windows

* https://gradle.org/releases/ 에서 binary 파일 다운로드
* C:\Gradle 로 이동
* 환경변수 설정에서 Path에 C:\Gradle\gradle-7.4.2\bin 추가 후 저장
* 터미널을 켜고 gradle -v 를 실행해 잘 설치되었는지 확인

Debian

sudo apt-get install gradle

MacOS

brew install gradle

image-20220423201902821

Gradle 설치 후 gradle -v 로 버전을 확인 하니, 7.4.2 버전이 설치 되었습니다.

Maven 프로젝트를 Gradle로 변환

image-20220423202439106

저는 shaneutils 라는 메이븐으로 빌드 하고 있던 프로젝트를 변경 할 예정입니다.

gradle init

일단 작업에 앞서 해당 프로젝트의 pom.xml 파일이 있는 경로로 이동합니다.

image-20220423202552738

pom.xml 이 보이는 경로

해당 경로에서 gradle init을 명령을 실행 해 줍니다.

gradle init

image-20220423202705844

그러면 Maven 빌드를 찾았다며, 그걸 기반으로 빌드 할 건지 물어봅니다. yes 를 입력 해 줍니다.

image-20220423202744307

Groovy와 Kotlin 중 스크립트 언어 DSL(Domain Specific language)를 선택하라고 합니다. 아직 코틀린에 충분히 익숙하지 않은 상태라서 Groovy를 선택 하였습니다.

image-20220423203008135

빌드가 완료되었습니다.

이제 빌드가 완료 되었는데요.

image-20220423203049219

파일 목록을 보니 gradle 파일들과 pom.xml 파일이 함께 있습니다. 이제 pom.xml 파일은 삭제 해 줍니다.

image-20220423203510290

pom.xml 파일을 제거 하고 나서, Maven Change를 새로 불러옵니다.

image-20220423203543444

그러면 이제 Gradle script를 찾았다고 나오는데요, Load Gradle Project를 클릭 합니다.

image-20220423203846130

이제 Gradle로 새로 빌드 합니다.

자동 생성된 build.gradle 파일을 확인 해 보니 아래와 같습니다.

/*
 * This file was generated by the Gradle 'init' task.
 *
 * This project uses @Incubating APIs which are subject to change.
 */

plugins {
    id 'java'
    id 'maven-publish'
}

repositories {
    mavenLocal()
    maven {
        url = uri('https://repo.maven.apache.org/maven2/')
    }
}

dependencies {
    testImplementation 'org.springframework.boot:spring-boot-starter-test:2.6.6'
    compileOnly 'org.projectlombok:lombok:1.18.22'
}

group = 'com.tistory.shanepark'
version = '1.0-SNAPSHOT'
description = 'shaneutils'
java.sourceCompatibility = JavaVersion.VERSION_1_8

publishing {
    publications {
        maven(MavenPublication) {
            from(components.java)
        }
    }
}

테스트

  1. 일단 빌드후 테스트를 진행하는데 에러가 발생합니다.

image-20220423212420596

생성자에서는 int 타입을 요구하는데 no arguments constructor가 없다고 하는데요

image-20220423212551174

보이는 것 처럼 @NoArgsConstructor 를 적용 해 둔 상태 입니다.

일단 Lombok 플러그인이 적용 되지 않고 있는 것 으로 보입니다. 일단 IntelliJ 에서 Annotation Processor 설정을 보니 잘 적용 되고 있는 상태기에 이번에는 build.gradle 파일을 확인 해 보니 annotationProcessor에 대한 내용이 빠져 있습니다.

아래의 내용을 build.gradle의 dependencides 블럭에 추가 해 줍니다.

annotationProcessor 'org.projectlombok:lombok:1.18.22'
  1. 이번에는 No tests found for given includes 에러가 발생합니다.

image-20220423204822976

gradle 에서 테스트 관련 설정까지는 자동으로 해주지 않았기 때문인데요, build.gradle에 아래의 내용을 추가 해 주면 됩니다.

test {
    useJUnitPlatform()
}

두 가지 에러를 모두 해결 한 뒤의 build.gradle 파일 내용은 아래와 같습니다.

plugins {
    id 'java'
    id 'maven-publish'
}

repositories {
    mavenLocal()
    maven {
        url = uri('https://repo.maven.apache.org/maven2/')
    }
}

dependencies {
    testImplementation 'org.springframework.boot:spring-boot-starter-test:2.6.6'
    compileOnly 'org.projectlombok:lombok:1.18.22'
    annotationProcessor 'org.projectlombok:lombok:1.18.22'
}

group = 'com.tistory.shanepark'
version = '1.0-SNAPSHOT'
description = 'shaneutils'
java.sourceCompatibility = JavaVersion.VERSION_1_8

publishing {
    publications {
        maven(MavenPublication) {
            from(components.java)
        }
    }
}

test {
    useJUnitPlatform()
}

image-20220423205252448

설정 후에는 무사히 테스트가 실행 됩니다.

배포

이제 배포까지 진행 해서 이전처럼 문제 없이 작동 하는지 확인 할 차례 입니다.

저는 jitpack을 통해 배포 하고 있었는데, 이에 대한 자세한 내용은 나만의 라이브러리 만들어 jitPack으로 배포하고 Maven/Gradle 에서 사용하기 를 참고 해 주세요.

image-20220423205946169

일단 변경 내용을 commit 및 push 해 줍니다.

image-20220423210126734

https://jitpack.io/com/github/Shane-Park/shaneutils/-0faa93d459-1/build.log

커밋 후 jitpack에서의 로그를 확인 해 보니 문제 없이 빌드 되었습니다.

해당 패키지를 가져다 쓰는 프로젝트도 shaneutils의 새로운 버전으로 새로 빌드 해 봅니다.

implementation 'com.github.Shane-Park:shaneutils:-SNAPSHOT'

image-20220423213958000

이전처럼 정상적으로 작동하는 것이 확인됩니다.

이상으로 Maven 프로젝트를 Gradle로 변경하는 방법에 대한 글을 마치겠습니다. 대부분의 작업이 자동 화 되어 있기 때문에 gradle init 만 실행 후 몇가지 누락된 부분만 입력 해 주면 되어 간단합니다. 수고하셨습니다.

반응형