Gradle 이란?
- 모든 유형의 소프트웨어를 빌드할 수 있을 만큼 유연한 오픈 소스 빌드 자동화 도구
빌드 자동화 도구
- 소프트웨어 개발 프로세스에서 소스 코드를 컴퓨터에서 실행 가능한 소프트웨어로 변환하는 작업인 빌드 과정을 자동화하는 도구
- 소스코드를 컴파일하고 링크하고 패키징하여 실행 가능한 애플리케이션, 라이브러리, 혹은 배포 가능한 파일로 만드는 작업임
- 소스 코드 컴파일과 링크
- 의존성 관리
- 단위 테스트 실행
- 코드 정적 분석과 검사
- 리소스 복사 및 패키징
- 릴리즈 빌드 생성
- 배포 가능한 파일 생성과 배포
- 대표적인 도구들로 Apache Maven, Gradle, Ant 등이 있음
Maven과 Gradle의 차이
- 자바 진형에서 주로 사용되는 빌드 도구들로 간략한 차이에 대해 설명하겠음
차이점 |
Maven |
Gradle |
빌드 스크립트 언어 |
XML 기반의 빌드 스크립트를 사용하며 XML 형식으로 프로젝트 구조와 의존성 관리를 정의함 |
Groovy 또는 Kotlin DSL을 사용하는 유여한 빌드 스크립트를 지원하며 DSL은 더 간결하고 가독성이 높은 빌드 스크립트를 작성 가능하게 함 |
선언적 vs 명령적 빌드 |
선언적 방식으로 빌드를 정의함, 개발자는 빌드 과정을 명시적으로 작성하지 않고 Maven이 미리 정의된 빌드 라이프사이클과 플러그인을 사용하여 빌드를 수행함 |
명령적인 방식으로 빌드를 정의함, 개발자는 빌드 스크립트에서 더 자세한 제어를 할 수 있으며 필요한 작업을 직접 구성하거나 커스텀할 수 있음 |
성능 |
빌드의 기본 동작에 초점을 두고 있으며 대규모 프로젝트에서 성능이 다소 저하될 수 있음 |
빌드 캐시와 증분 빌드 등 성능 최적화 기능을 강화하여 더 큰 프로젝트에서도 빠른 빌드를 지원함 |
생태계와 플러그인 |
오랜 기간 사용된 오픈소스 생태계로 많은 라이브러리와 플러그인을 갖추고 있음 |
빠르게 성장하는 생태계이며 Maven과 호환되는 의존성 관리 및 플러그인 사용이 가능함 |
멀티 프로젝트 빌드 |
멀티 모듈 빌드를 지원하며 상대적으로 간단한 멀티 프로젝트 구성을 제공함 |
멀티 프로젝트 빌드를 훨씬 더 유연하게 지원하고 각 프로젝트에 대한 별도의 빌드 스크립트를 작성하는 것이 가능함 |
Gradle의 특징
- High performance(고성능)
- input 또는 output이 변경되어 작업을 수행해야 하는 작업만 실행하여 불필요한 작업을 방지함
- 다양한 캐시를 사용하여 이전 빌드의 outputs을 재사용함
- 공유 빌드 캐시를 사용하면 다른 시스템의 outputs을 재사용할 수도 있음
- JVM foundation(JVM 기반)
- JVM에서 실행됨
- 빌드 논리는 표준 Java API를 사용 가능
- 다양한 플랫폼에서 Gradle을 쉽게 실행 가능
- Conventions(컨벤션)
- 규칙을 통해 일반적인 유형의 프로젝트를 쉽게 빌드 가능
- 플러그인은 빌드 스크립트를 최소한으로 유지하기 위해 합리적인 기본값을 설정하며 이러한 규칙은 사용자를 제한하지 않음
- 빌드에서 설정을 구성하고 고유한 작업(tasks)을 추가하고 다른 많은 customizations을 수행 가능함
- Extensibility(확장성)
- 빌드에는 사용자 지정 빌드 로직이 필요한 경우가 있으며 Gradle은 쉽게 확장하여 customizations 및 플러그인으로 자체 빌드 로직을 제공 가능함
- IDE support(IDE 지원
- Android Studio, IntelliJ IDEA, Eclipse, VSCode 및 NetBeans를 포함하여 Gradle 빌드와의 상호 작용을 제공
- Visual Studio에 프로젝트를 로드하는 데 필요한 솔루션 파일도 생성 가능
용어 정리
Projects(프로젝트)
- Gradle이 빌드하는 것
- 프로젝트에는 일반적으로 build.gradle 또는 build.gradle.kts라는 프로젝트의 루트 디렉터리에 있는 파일인 빌드 스크립트가 포함되어 있음
- 빌드 스크립트는 해당 프로젝트에 대한 작업, 종속성, 플러그인 및 기타 구성을 정의함
- 단일 빌드는 하나 이상의 프로젝트를 포함할 수 있으며 각 프로젝트는 자체 하위 프로젝트를 포함 가능함
Task(작업)
- 코드 컴파일, 테스트 실행 또는 소프트웨어 배포와 같은 일부 작업을 실행하기 위한 논리가 포함되어 있음
- 대부분의 사용 사례에서 기존 작업을 사용
- 테스트를 실행할 수 있는 Test task와 같이 많은 일반적인 빌드 시스템 요구 사항을 구현하는 작업을 제공
- 작업의 구성 요소
- 실행(Actions) : 파일 복사 또는 소스 컴파일과 같은 작업을 수행하는 작업
- 입력(Inputs) : 작업이 사용하거나 작동하는 값, 파일 및 디렉터리
- 출력(Outputs) : 작업이 수정하거나 생성하는 파일 및 디렉터리
Plugins(플러그인)
빌드 단계(bulid life cycle)
- 초기화(Initialization)
- 빌드 환경을 설정하고 참여할 프로젝트를 결정함
- 구성(Configuration)
- 빌드에 대한 작업 그래프를 설계하고 구성함, 사용자가 실행하려는 작업에 따라 실행해야 하는 작업과 순서를 결정함
- 실행(Excecution)
빌드
- Gradle 프로젝트에서 작업 모음을 실행하는 것
- 작업 선택기를 지정하여 명령줄 인터페이스(CLI) 또는 IDE를 통해 빌드를 실행
- Gradle은 빌드를 구성하고 실행할 작업을 선택
- 요청된 작업과 종속성을 기반으로 가장 작은 전체 작업 세트를 실행
빌드 스크립트 사용 예제
Groovy DSL
// 프로젝트 속성 설정
group 'com.example'
version '1.0.0'
// 플러그인 적용
plugins {
id 'java' // Java 플러그인 적용
}
// 의존성 관리
dependencies {
implementation 'org.slf4j:slf4j-api:1.7.32'
testImplementation 'junit:junit:4.13.2'
}
// 사용자 정의 태스크
task myCustomTask {
doLast {
println 'Hello from my custom task!'
}
}
// Configurations 정의
configurations {
myCustomConfig // 사용자 정의 Configuration 추가
}
// Configuration에 의존성 추가
dependencies {
myCustomConfig 'org.apache.commons:commons-lang3:3.12.0'
}
// 빌드 라이프사이클 설정
// 빌드 실행 시 자동으로 myCustomTask를 실행하도록 설정
build {
dependsOn myCustomTask
}
Kotlin DSL
// 프로젝트 속성 설정
group = "com.example"
version = "1.0.0"
// 플러그인 적용
plugins {
kotlin("jvm") version "1.5.21" // Kotlin 플러그인 적용
}
// 의존성 관리
dependencies {
implementation("org.slf4j:slf4j-api:1.7.32")
testImplementation("junit:junit:4.13.2")
}
// 사용자 정의 태스크
tasks {
val myCustomTask by registering {
doLast {
println("Hello from my custom task!")
}
}
}
// Configurations 정의
configurations {
create("myCustomConfig") // 사용자 정의 Configuration 추가
}
// Configuration에 의존성 추가
dependencies {
"myCustomConfig"("org.apache.commons:commons-lang3:3.12.0")
}
// 빌드 라이프사이클 설정
// 빌드 실행 시 자동으로 myCustomTask를 실행하도록 설정
tasks.named("build") {
dependsOn("myCustomTask")
}