Tools

Gradle 겉 핥기

비비빅B 2023. 3. 6. 21:00

왜 maven을 두고 gradle을 배워야 할까?

Gradle는 주로 Java 프로젝트에 사용되는 강력한 빌드 자동화 도구다. 소스 코드 컴파일, 테스트 실행, 애플리케이션 패키징 및 배포 과정을 자동화한다.

 

정의부터 살펴보면 어플리케이션을 배포하기 위해 개발자들이 했던 작업들을 자동화해 주는 툴이다. 이전에는 개발자들이 터미널에서 명령어로 한땀한땀했던 일련의 반복적인 작업들을 빌드 툴이 자동으로 컴파일해주고 테스트코드를 실행시켜 주고 참조하는 라이브러리 파일을 관리해주는 것이다.

// 컴파일 후 테스트

// 빌드툴 X
$ javac -d /absolute/path/for/compiled/classes -cp /absolute/path/to/junit-4.12.jar /absolute/path/to/TestClassName.java
$ java -cp /absolute/path/for/compiled/classes:/absolute/path/to/junit-4.12.jar:/absolute/path/to/hamcrest-core-1.3.jar org.junit.runner.JUnitCore your.package.TestClassName

// 빌드툴 O
$ mvn clean test

 

요즘 신규로 진행하는 프로젝트는 gradle로 진행하는 추세라고 한다. 상대적으로 최근에 나온 기술인 만큼, maven에 비해 성능이 좋고 커스텀하기 좋기 때문이다.

 

그럼 모든 경우에 maven이 좋은 걸까? 그렇지는 않다고 한다.

maven은 여전히 좋은 빌드 툴로, 쉬운 방법으로 프로젝트에 의존하는 라이브러리 설정을 할 수 있다. 따라서 간단하고(monolithic) 작은 프로젝트의 경우, 굳이 gradle을 고집할 필요는 없고 추후에 gradle로 마이그레이션해도 좋다고 설명하고 있다.

gradle을 사용하고 커스텀하기 위해서는 작성법을 따로 공부해야 하고, 공식 문서 또한 생각보다 많아서 러닝커브가 좀 있다고 생각한다.

다만, gradle이 익숙하지 않아 설정이 어렵다는 이유를 제외하면 성능, 유연성 측면에서 gradle이 더 좋은 선택이다.


gradle 성능이 좋은 이유

 

gradle 공식 문서에 의하면 maven에 비해 최대 100배 정도 빠른 빌드 속도를 자랑한다고 한다. 뭐가 다르길래 빌드 속도가 그렇게나 차이나는 걸까?

 

  • Incrementality(증분)
    • input 혹은 ouput이 달라졌을 때만 task 실행
  • Build Cache
    • 같은 input에 대한 캐시 공유 `.gradle/caches/`
    • 다른 개발자가 먼저 빌드한 파일을 캐싱할 수 있음
  • Gradle Daemon
    • 빌드 시작 시 데몬프로세스로 띄워놓고 사용

 

goal을 작업단위로써 순차적 파이프라인을 구성하는 maven과 달리, gradle은 task를 하나의 작업단위로 의존그래프를 구성한다.

task 내부에서 다른 task를 호출할 수 있으며 gradle이 명령을 실행하기 전에 Directed Acyclic Graph(DAG)를 만들어 중복 실행하지 않도록 한다.

각 task 마다 input과 ouput을 명시할 수 있는데, gradle은 이를 스냅샷 찍어놓고 변한 게 없다면 해당 task를 skip 함으로써 빌드 시간을 단축시킨다(Incrementality).

또한 캐시에 동일한 task와 input이 실행된 output이 있다면 캐싱된 결괏값을 이용해 빌드시간을 단축시킨다(Build Cache). 추가로 단순한 로컬 캐시뿐만 아니라 remote cache도 지원해 줘서, 다른 컴퓨터에서 빌드된 결과 값을 사용할 수 캐싱해서 사용할 수 있다고 한다. 그럼 다른 개발자가 먼저 빌드한 jar를 캐싱해서 사용할 수 있어 여러 개발자들이 참여하는 프로젝트에서는 효과를 극대화시킬 수 있다.

gradle task tree

 

또한 gradle은 한번 실행하면 기본적으로 30분 정도 데몬 프로세스에서 활성화된 상태를 유지한다고 한다(Gradle Daemon).

멀티 모듈로 구성된 프로젝트의 경우, 여러 번 gradle이 실행되어야 하므로 백그라운드에서 실행된 gradle을 재사용함으로써 빌드시간을 단축시킬 수 있다.

 


성능 이외의 장점, gradle 사용성

 

단순히 gradle의 성능 외에도 maven에 비해 사용성이 좋다는 장점도 가지고 있다.

 

  • 가독성
    • xml 형식의 maven에 비해, groovy와 kotlin을 지원하는 DSL 언어를 사용해 읽기 쉬움
  • 유연성
    • DSL 언어를 이용해 IDE 자동완성기능을 지원받아 동적으로 빌드 스크립트 작성 가능
  • Gradle Wrapper
    • Gradle 실행스크립트(gradlew.sh, gradlew.bat)
    • 실행하기 위해서 설치가 필요한 maven과 달리, gradle은 wrapper를 제공함으로써 설치 없는 실행환경 제공
    • 로컬 환경에서 발생하는 버전 충돌 문제 해결

서버에서 소스를 로컬에 다운받아 사용하는 구조

 


빌드시간을 줄이는 게 중요한가?

 

사실 maven에 익숙하다 보니, 좋다고 듣기는 했지만 크게 필요성을 못 느껴서 계속해서 gradle 공부를 미뤄두고 있었다. 성능 이외의 장점을 제외하면 maven을 그대로 사용하는 경험도 크게 나쁘지 않았기 때문에다. 그러다 최근에 컨퍼런스 영상을 보다가 gradle을 제대로 배워보기로 마음먹었다.

빌드와 배포 같은 반복적인 작업들을 자동화시켜, 배포 시간과 주기를 단축시켜야 성공적인 서비스를 만들 수 있기 때문에 DevOps가 중요하다고 말하는 영상이었다. 단순히 빌드 툴을 교체함으로써, 손쉽게 빌드 시간을 줄일 수 있음에도 계속 maven을 고집하는 건 아집이라는 생각이 들었다.

 

이 글을 기점으로 gradle을 적극적으로 사용해 봐야겠다.

 


 

Gradle User Manual

 

docs.gradle.org

 

Maven vs. Gradle in-depth comparison

This in-depth comparison helps you decide whether to use the Maven or Gradle build tool, so you can pick the right tool to support your project's growth.

tomgregory.com

'Tools' 카테고리의 다른 글

Vim 입문  (0) 2023.06.26