왜 Gradle? Gradle과 Maven의 차이점

 

목차

    왜 Gradle?

    스프링 부트를 통해 스프링 프로젝트를 만들고자 하면 다음과 같이 프로젝트 빌드를 어떤 빌드 도구를 사용해 빌드할 것인지 물어본다.

    https://start.spring.io/

    유명한 스프링 개발자인 김영한 님의 설명을 빌리자면 원래는 스프링은 Maven을 기반으로 만들어졌지만 현재는 기존 레거시 프로젝트나 원래 메이븐을 쓰던 프로젝트가 아니라면 모두 Gradle로 옮기는 추세라고 한다. 또한 Google에서도 안드로이드를 위한 공식 빌드 도구로 Gradle을 선택했다! (https://developer.android.com/studio/build?hl=ko)

     

    하지만 토이 프로젝트를 시작하면서 왜 Gradle로 다들 옮겨갈까라고 생각하면서 왜 Gradle을 쓸까 문득 궁금해졌다. 둘의 차이점과 왜 Gradle을 쓰는지 알아보기 전에 Maven과 Gradle에 대해 알아보자!

     

     

    Maven이란?

    Apache Maven

    Maven은 기존의 자바 개발자들이 많이 사용하던 빌드 도구인 Ant를 대체하기 위해서 만들어졌다. 기존의 빌드 도구인 Ant는 XML을 사용해서 코드 빌드 과정을 만들고 의존성을 정의한다. Ant는 JRE가 돌아갈 수 있는 모든 시스템에서 동작할 수 있도록 유연하게 만들어진 빌드 도구였는데, XML로 빌드 과정을 만들어서 때로는 장황하고 복잡한 코드를 가지고 있었다. 이에 따라 빌드 파일은 감당할 수 없을 정도로 커질 때도 있었고 무엇보다 배우기 어려웠다. 이런 진입 장벽은 한때 많이 쓰이던 Ant 대신에 새로운 빌드 도구의 필요성을 불러왔고 이에 따라서 Maven이 개발되었다.

     

    Maven은 Yiddish에서 따왔는데, 지식의 저장소(accumulator of knowledge)라는 뜻을 가지고 있다. 필자가 아는 Yiddish는 이것밖에 없긴 한데...

    "Like a new man, Yingele, a new man. Oh, look at you, I'm so happy you're back."
    Set to BJ, giving his new Body, Wolfenstein II : The New Colossus

    새로운 몸을 얻게된 Maven.... 아니 Ant..

    각설하고 Maven은 Ant와 같이 빌드 도구인데 다양한 언어에서의 빌드 자동화를 위해 만들어졌다. Ant와 같이 아파치 소프트웨어 재단에서 진행했던 자카르타 프로젝트의 일부인데. Ant와는 달리 관습에 따른 코딩(convention over configuration)을 사용한다.

    관습에 따른 코딩 혹은 설정 보다 관습은 소프트웨어 프레임워크를 디자인할 때 이벤트나 리소스에 배정되는 클래스를 맵핑할 때 표준 네이밍 컨벤션을 지켜서 하도록 하는 디자인 패러다임이다. 개발자로 하여금 네이밍 컨벤션을 지켜서 통일성을 추구하고 유연성을 지키되 선택해야 하는 가짓수를 줄여 쉽게 하는 방법이다. 또한 새로운 개발자로 하여금 네이밍 컨벤션만 이해하면 시스템을 쉽게 배울 수 있도록 한다.
    https://web.archive.org/web/20100124145107/http://softwareengineering.vazexqi.com/files/pattern.html

     

    Ant를 사용할때는 각자 빌드 파일을 적어야 했으므로 개발자마다 조금씩 다를 수밖에 없었다. 그래서 Maven의 개발자는 표준화된 프로젝트 구성 방식을 통해 빌드를 쉽게 하고 더 나은 프로젝트 구성에 대한 정보를 얻을 수 있도록 Maven을 개발했다. 특히 POM(Project Object Model)이라는 방식을 택했는데 이는 Maven이 프로젝트를 빌드할 때 쓰이는 설정과 프로젝트에 대한 정보를 포함하는 XML 파일이다. Maven은 각 디렉터리에 있는 POM(XML 파일)을 참조하여 빌드에 필요한 설정을 불러오고 실행한다. 개발자가 원하면 커스터마이징이 가능하지만 POM은 XML 파일이다. 프로젝트가 커지면 커질수록 POM 또한 복잡해져야 하며, 이는 이전에 사용되던 빌드 도구인 Ant와 별반 다르지 않다.

     

     

    그래서 Gradle은 뭔데?

    우리의 귀여운 코끼리씨.. 아니 Gradle

    Gradle은 빌드 자동화, 여러 언어에서의 개발을 지원하는 빌드 도구이다. 자바에 다른 언어들의 특징을 더한 Groovy를 기반으로 만들어졌다. Maven과 마찬가지로 관습에 따른 코딩을 추구하며 JVM을 통해서 실행되기 때문에 표준 자바 API들을 사용할 수 있다. 또한 높은 확장성과 이전 빌드에서의 결과물 뿐만 아니라 빌드 캐시 공유를 통해 다른 컴퓨터에서의 결과물도 사용할 수 있다. 여기에 더해서 하나의 빌드 설정 파일인 build.gradle을 사용하기 때문에 각 디렉토리에 있는 POM을 참조하는 방식을 사용하는 Maven 보다 편리하다.

     

     

    그래서 왜 Gradle을 사용해야할까?

    • 유연성(Flexibility) : 앞서 Maven을 설명할 때 커스텀마이징이 다소 힘들 수 있다고 했다. 이는 XML 파일로 구성되어  있는 Maven의 빌드 설정때문인데 , 따라서 Maven의 구조를 커스터마이징하기 까다롭게 만들고 어떤 경우에는 아예 불가능할 수도 있다. 이는 Maven으로 빌드된 프로젝트를 이해하는데 쉽게 만들지만, 많은 빌드 자동화 문제로부터 자유롭지 못하게 된다. Gradle은 빌드 설정이 코드로 되어 있을 뿐만 아니라 확장성을 중점적으로 만들어졌고 C/C++에서의 개발 및 다른 언어에서의 개발도 지원한다. 
    • 성능(Performance) : Gradle과 Maven은 둘다 병렬으로 프로젝트를 구성하고 Dependency Resolution (새로운 의존성이 추가 되었을 때 어떤 의존성이 추가 되어야 하는지 결정하는 과정)을 지원한다. Gradle과 Maven의 큰 차이점은 증분(incrementality)에 있고 다음 세가지가 Gradle이 Maven보다 빠르게 만든다.
      1. 증분(Incrementality): Gradle은 input과 output을 추적해서 필요한 작업만 실행하고 바뀐 파일들만 가능할때 처리한다. 
      2. Build Cache: 같은 input을 사용하는 다른 Gradle 빌드의 output을 사용한다. (다른 머신에서의 결과물도 사용가능하다.
      3. Gradle Daemon: 오랫동안 지속되는 프로세스를 만들어 메모리에서 빌드 정보를 계속 잔류하게 한다
    • 사용자 경험: Maven은 오랜 기간 동안 사용되었기 때문에 IDE를 통한 지원이 많다. 하지만 Gradle의 IDE 지원은 빠르게 발전하고 있으며 최신 CLI 기반의 gradle tasks와 같은 더 나은 검색 방법, 개선된 로그, 커맨드 라인 자동완성을 지원한다. 또한 Build Scan이라는 웹 기반의 UI를 통해 빌드 히스토리, 추세 분석, 디버깅을 위한 빌드 비교 및 빌드 시간 최적화를 도와준다. 

    Gradle과 Maven의 성능 비교 벤치마크

     

    출처

    Gradle vs Maven comparison. Gradle. (n.d.). Retrieved April 12, 2023, from https://gradle.org/maven-vs-gradle/