[JAVA] Gradle

Gradle이란?

Gradle은 Groovy를 이용한 빌드 자동화 시스템이다. Groovy와 유사한 도메인 언어를 채용하였으며, 현재 안드로이드 앱을 만드는데 필요한 안드로이드 스튜디오의 공식 빌드 시스템이기도하다. Java, C/C++, Python 등과 같은 여러 가지 언어를 지원한다.

Ant와 Maven과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 오픈소스로 공개된 빌드 도구이다.

 

Ant

  • XML 기반으로 빌드 스크립트 작성
  • 자유롭게 빌드 단위를 지정
  • 간단하고 사용하기 쉬움
  • 유연하지만 프로젝트가 방대해지는 경우 스크립트 관리나 빌드 과정이 복잡해짐
  • 생명주기(LifeCycle)를 갖지 않아 각각의 결과물에 대한 의존관계 등을 정의해야 함

 

Maven

  • XML 기반으로 작성
  • 생명주기(LifeCycle)와 프로젝트 객체 모델(POM, Project Object Model) 개념이 도입
  • Ant의 장황한 빌드 스크립트 개선
  • pom.xml에 필요한 라이브러리를 선언하면 자동으로 해당 프로젝트로 불러와 편함
  • 진입장벽이 낮음
  • 라이브러리가 서로 의존하는 경우 복잡해질 수 있음

 

Gradle의 특징

  • 의존성 관리를 위한 다양한 방법을 제공
  • 빌드 스크립트를 XML 언어가 아닌 JVM에서 동작하는 스크립트 언어 'Groovy' 기반의 DSL(Domain Specific Language) 사용
  • Groovy는 자바 문법과 유사하여 자바 개발자가 쉽게 익힐 수 있음, 최근에는 Kotlin DSL의 이용이 가능해져 가독성과 접근성이 높아짐
  • Gradle Wrapper를 이용해 Gradle이 설치 되지 않은 시스템에서도 프로젝트의 빌드 가능
  • Maven의 pom.xml을 Gradle 용으로 변환 가능하며 Maven의 중앙 저장소도 지원하기 때문에 라이브러리를 모두 그대로 사용 가능
  • 다양한 implementation 키워드를 이용해(ex. androidTestImplementations, testImplementation 등) 안드로이드 UI 테스트 용 라이브러리, 일반적인 테스트를 위한 라이브러리 등으로 원하는 Scope 별로 다른 라이브러리를 손쉽게 가져올 수 있도록 해줌
  • 빠른 빌드 속도

 

Gradle의 빌드 속도가 빠른 이유

점진적 빌드(Incremental Build)

Gradle의 점진적 빌드는 이미 빌드된 파일들을 모두 다시 빌드하는 것이 아닌 바뀐 파일들만 빌드하는 것을 뜻한다. 예를 들어 Kotlin 파일이 20개 있는 상태에서 컴파일이 완료되었으면, 이후 파일들 중 5개만 바뀌었을 경우 20개 모두가 아니라 5개만 다시 컴파일 시킨다. 이는 다른 빌드 툴들에 비해 많은 속도 향상을 이루어낸다.

 

Build Cache

만약 두개 이상의 빌드가 돌아가고, 하나의 빌드에서 사용되는 파일들이 다른 빌드들에 사용된다면 Gradle은 빌드 캐시를 이용해 이전 빌드의 결과물을 다른 빌드에서 사용할 수 있다. 이로 인해 다시 빌드하지 않아도 되므로 빌드 시간이 줄어들게 된다.

 

Daemon Process

Gradle은 데몬 프로세스를 지원한다. 데몬 프로세스는 서비스의 요청에 응답하기 위해 오래 동안 살아있는 프로세스인데 Gradle의 데몬 프로세스는 메모리 상에 빌드 결과물을 보관한다. 이로 인해 한번 빌드된 프로젝트는 다음 빌드에서 매우 적은 시간만 소요된다. 안드로이드의 경우 복잡한 프로젝트는 첫 빌드에 많은 시간이 필요하나, 이후 빌드부터는 매우 적은 시간이 소모된다.

gradle build --daemon		// 데몬 프로세스 수행
gradle build --no-daemon	// 데몬 프로세스 수행하지 않음

 

Gradle의 작업 순서

Compile Kotiln 파일이나 Java 파일을 바이트 코드로 변환
Test 어플리케이션을 제대로 동작할 지에 대한 Test 수행(Unit Test, UI 테스트 등)
Packaging 코드를 aab, apk 또는 jar, war와 같은 파일로 패키징
Deploy & Run 패키징된 어플리케이션을 실행

 

Gradle의 사용

Gradle 설치

공통적으로 JDK 또는 JRE 버전이 8 이상이어야 한다.

 

Mac OS

brew install gradle

Windows

아래 링크를 참고하자

https://thecodinglog.github.io/gradle/2019/09/11/install-gradle-in-windows.html

 

Windows에 Gradle 설치하기

Windows에 수작업으로 Gradle 설치하기

thecodinglog.github.io

 

Linux

아래 링크를 참고하자

https://jjeongil.tistory.com/1402

 

build.gradle

build.gradle은 빌드 구성 스크립트(Build Configuration Script) 또는 빌드 스크립트라고 한다.

 

task 작성

task란 Gradle의 실행 작업 단위를 뜻한다.

task 태스크이름 {
	jobs
}

EX.
task helloWorld {
	println 'Hello World'
}

 

task 실행

$ gradle helloWorld

gradle helloWorld

> Configure project:
Hello World

BUILD SUCCESSFUL in 609ms

# -q 옵션을 준 경우
$ gradle -q helloWorld
Hello World

 

추가적인 task 활용법

doFirst, doLast

task 내부에서 순서를 지정하고 싶을 때 사용. doFirst는 가장 처음 수행하는 액션, doLast는 가장 마지막에 수행하는 액션이다.

taks greeting{
	doFirst{
    	println 'hello'
    }
    do Last{
    	println 'bye'
    }
}

# 실행 결과
$ gradle greeting

> Task :greeting
hello
bye
BUILD SUCCESSFUL in 598ms
1 actionable task: 1 executed

 

task와 파라미터

task를 실행할 때 -P{파라미터이름}={값}을 이용하여 파라미터를 전달할 수 있다.

task syaHi {
	def loopCount = coutn.toInteger()
    for(def i in 1..loopCount) {
    	println('LoopCount: ' + i)
    }
}

// 실행 결과
$ gradle -q sayHi -Pcount=3
LoopCount: 1
LoopCount: 2
LoopCount: 3

 

task간 의존성 설정

dependsOn을 이용해 task가 실행될 때 의존성을 지정하여 task의 실행 순서를 지정할 수 있다.

task AAA(dependsOn:['BBB', 'CCC']) {
    doFirst {
        println('doFirst: AAA')
    }
    doLast {
        println('doLast: AAA')
    }
}

task BBB {
    doFirst {
        println('doFirst: BBB')
    }
    doLast {
        println('doLast: BBB')
    }
}

task CCC {
    doFirst {
        println('doFirst: CCC')
    }
    doLast {
        println('doLast: CCC')
    }
}


// 실행 결과
$ gradle AAA

> Task :BBB
doFirst: BBB
doLast: BBB

> Task :CCC
doFirst: CCC
doLast: CCC

> Task :AAA
doFirst: AAA
doLast: AAA

BUILD SUCCESSFUL in 603ms
3 actionable tasks: 3 executed
Bash

 

사용자 정의 메소드

task methodTask {
    printMessage('say Hi')
}
 
String printMessage(String msg) {
    println msg
}

// 실행 결과
$ gradle methodTask

> Configure project :
say Hi

BUILD SUCCESSFUL in 593ms

 

사용자 정의 변수

task someTask {
    ext.message = 'say Hi'
}
 
task sayHi {
    println someTask.message
}

// 실행 결과
$ gradle -q sayHi
say Hi

출처 {

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

https://madplay.github.io/post/what-is-gradle

https://kotlinworld.com/311

}

'Programming > Java' 카테고리의 다른 글

Spring 개념과 express.js와의 차이  (0) 2023.01.24
Maven  (0) 2022.07.13
[JAVA] 람다식  (0) 2022.04.18
[JAVA] 제네릭  (0) 2022.04.11
[JAVA] I/O  (0) 2022.04.05

댓글