Gradle
소개
Gradle은 다양한 프로그래밍 언어를 지원하는 빌드 자동화 도구 입니다. 빌드는 소스코드로 작성된 파일을 컴퓨터나 휴대폰 등 에서 실행가능한 소프트웨어 가공물로 변환하는 과정을 말하는데요, 자바의 예를 들면 아래의 과정을 거칩니다.
- 소스 코드 작성
- 자바 컴파일러가 소스코드
.java
를 -> 바이트코드.class
로 컴파일 - 테스트 소스 컴파일
- 테스트 실행(유닛테스트, 통합테스트 등)
- jar 혹은 war 파일로 패키징
- 헬스체크 후 빌드 결과 출력
Apache Ant 및 Apache Maven의 컨셉을 기반으로 하지만, XML로 설정파일을 작성하는 Maven과는 대조적으로 훨씬 간단한 Groovy 언어를 사용 합니다.
또한 Gradle은 Apache License 2.0 기반의 오픈소스 이며 JVM(자바 가상 머신) 위에서 실행됩니다
Maven과의 비교
- 유연성: Gradle과 Maven 모두 설정파일 작성을 통해 규칙을 정합니다. 다만 메이븐이 굉장히 엄격한 모델을 제공함으로서 커스터마이징이 굉장히 지루하고 때로는 불가능한 것 과는 대조적으로 Gradle은 책임감있고 권한있는 사용자를 전제로 빌드되어 훨씬 유연합니다.
- 속도: 빌드 타임을 줄이는건 생산성을 향상시키는 가장 직관적인 방법 중 하나 입니다. Gradle과 Maven 모두 병렬 처리를 지원하지만 가장 큰 차이는 Gradle의 작업 회피 및 Incrementality(증분 메카니즘)입니다. Gradle은 작업들의 input과 output을 추적함으로서 불필요한 작업들을 회피하고 가능한 한 변경이 일어난 파일들만을 처리하려고 합니다. 또한 같은 input의 다른 Gradle 빌드 결과를 Cache(캐시) 해두고 재사용 합니다. 아래의 사진은 Apache Commons Lang3의 빌드에 걸린 시간을 비교한 차트 입니다.
- 사용자 친화: Gradle 팀은 IDE 제작사들과의 긴밀한 협업을 통해 IDE에서의 다양한 지원을 꾸준히, 그리고 매우 빠르게 계속해서 개선하고 있습니다. 그 뿐만 아니라 Build Scan™을 통해 web 기반 UI에서 디버깅 및 빌드 최적화를 지원합니다.
Build Scan
아래의 표를 통해 확인 할 수 있는 것 처럼 주기적인 업데이트가 진행되었고, 지금은 7.0 버전이 널리 사용되고 있습니다.
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
Gradle 설치 후 gradle -v 로 버전을 확인 하니, 7.4.2 버전이 설치 되었습니다.
Maven 프로젝트를 Gradle로 변환
저는 shaneutils 라는 메이븐으로 빌드 하고 있던 프로젝트를 변경 할 예정입니다.
gradle init
일단 작업에 앞서 해당 프로젝트의 pom.xml 파일이 있는 경로로 이동합니다.
pom.xml 이 보이는 경로
해당 경로에서 gradle init을 명령을 실행 해 줍니다.
gradle init
그러면 Maven 빌드를 찾았다며, 그걸 기반으로 빌드 할 건지 물어봅니다. yes 를 입력 해 줍니다.
Groovy와 Kotlin 중 스크립트 언어 DSL(Domain Specific language)를 선택하라고 합니다. 아직 코틀린에 충분히 익숙하지 않은 상태라서 Groovy를 선택 하였습니다.
빌드가 완료되었습니다.
이제 빌드가 완료 되었는데요.
파일 목록을 보니 gradle 파일들과 pom.xml 파일이 함께 있습니다. 이제 pom.xml 파일은 삭제 해 줍니다.
pom.xml 파일을 제거 하고 나서, Maven Change를 새로 불러옵니다.
그러면 이제 Gradle script를 찾았다고 나오는데요, Load Gradle Project를 클릭 합니다.
이제 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)
}
}
}
테스트
- 일단 빌드후 테스트를 진행하는데 에러가 발생합니다.
생성자에서는 int 타입을 요구하는데 no arguments constructor가 없다고 하는데요
보이는 것 처럼 @NoArgsConstructor 를 적용 해 둔 상태 입니다.
일단 Lombok 플러그인이 적용 되지 않고 있는 것 으로 보입니다. 일단 IntelliJ 에서 Annotation Processor 설정을 보니 잘 적용 되고 있는 상태기에 이번에는 build.gradle 파일을 확인 해 보니 annotationProcessor에 대한 내용이 빠져 있습니다.
아래의 내용을 build.gradle의 dependencides 블럭에 추가 해 줍니다.
annotationProcessor 'org.projectlombok:lombok:1.18.22'
- 이번에는 No tests found for given includes 에러가 발생합니다.
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()
}
설정 후에는 무사히 테스트가 실행 됩니다.
배포
이제 배포까지 진행 해서 이전처럼 문제 없이 작동 하는지 확인 할 차례 입니다.
저는 jitpack을 통해 배포 하고 있었는데, 이에 대한 자세한 내용은 나만의 라이브러리 만들어 jitPack으로 배포하고 Maven/Gradle 에서 사용하기 를 참고 해 주세요.
일단 변경 내용을 commit 및 push 해 줍니다.
https://jitpack.io/com/github/Shane-Park/shaneutils/-0faa93d459-1/build.log
커밋 후 jitpack에서의 로그를 확인 해 보니 문제 없이 빌드 되었습니다.
해당 패키지를 가져다 쓰는 프로젝트도 shaneutils의 새로운 버전으로 새로 빌드 해 봅니다.
implementation 'com.github.Shane-Park:shaneutils:-SNAPSHOT'
이전처럼 정상적으로 작동하는 것이 확인됩니다.
이상으로 Maven 프로젝트를 Gradle로 변경하는 방법에 대한 글을 마치겠습니다. 대부분의 작업이 자동 화 되어 있기 때문에 gradle init
만 실행 후 몇가지 누락된 부분만 입력 해 주면 되어 간단합니다. 수고하셨습니다.
'Programming > Java' 카테고리의 다른 글
JAVA) Private method를 테스트 하는법 (0) | 2022.05.09 |
---|---|
Java) new int[Integer.MAX_VALUE] (0) | 2022.04.29 |
java) 래퍼 클래스의 동등 연산자 사용을 피해야 하는 이유 (0) | 2022.04.10 |
java) 151개의 포켓몬을 모두 모으려면 몇개의 포켓몬빵을 사먹어야 하는가 (0) | 2022.03.20 |
Java) 클립보드에 텍스트 복사 / 붙여넣기 (0) | 2022.02.26 |