Maven 보다 Gradle을 선호하는 이유를 알아보자!

Karim·2022년 8월 27일
5
post-thumbnail

1. 서론

💬

  • 어쩌다 보니 각 각 다른 회사에서 maven과 gradle 둘 다 접하게 되었고 두 가지의 차이점과 내가 느낌점을 적어보려고 한다.
  • 둘 중 이걸 꼭 사용해라! 는 아니지만, 스펙상 gradle이 더 좋긴 한건 사실

2. 빌드 관리 도구 ?

빌드 관리 도구 ?

  • 프로젝트에서 작성한 java 코드와 프로젝트 내에 필요한 각정 설정 파일들을 jvm이나 was인식할 수 있도록 패키징 해주는 빌드 과정을 도와주는 도구
  • 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램
  • 프로젝트 내에서 다양하게 외부 라이브러리로컬 레포지토리에서도 라이브버리 별로 버전 관리를 해야할 때 용이

3. Maven ?

Maven ?

  • java8용 프로젝트 관리 도구로 apache의 ant 대안으로 만들어졌다.
  • 빌드 중인 프로젝트, 빌드 순서, 다양한 외부 라이브러리 종속성 관계를 pom.xml 파일에 명시
  • maven은 외부 저장소에서 필요한 라이브러리와 플러그인들을 다운로드 한 다음, 로컬 시스템의 캐시에 모두 저장 (.m2)
  • 고정적이고 선형적인 단계 모델을 기반으로 한다.

💡 pom.xml

  • maven 프로젝트 완전 기본에 gson, junit dependency 2개 추가한 상태
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>maventTest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.9.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.0</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>

4. Gradle ?

Gradle ?

  • maven과 ant에서 볼 수 있는 개념들을 사용하는 대안으로 나온 프로젝트 빌드 관리 툴 (완전한 오픈소스)
  • groovy 언어를 사용한 Domain-specific-language를 사용한다. (설정파일을 xml파일을 사용하는 Maven보다 코드가 훨씬 간결)
  • multi-project 빌드를 도울 수 있도록 디자인
  • Gradle은 프로젝트의 어느 task업데이트되었는지 체크하기 때문에, 빌드에 점진적으로 추가할 수 있다.
    • 업데이트가 이미 반영된 빌드의 부분더이상 재 실행되지 않는다. (따라서 빌드 시간이 훨씬 단축될 수 있다!)
  • 작업 의존성 그래프 기반이다.

💡 build.gradle

  • gradle 프로젝트 완전 기본에 gson, junit dependency 2개 추가한 상태
plugins {
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'

    // https://mvnrepository.com/artifact/com.google.code.gson/gson
    implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.1'
}

test {
    useJUnitPlatform()
}

6. pom.xml vs build.gradle

🥊 설정 파일 vs

  • 위에 각 각의 설정 파일들 보면 기본에 디펜던시 2개 추가한거라 가독성의 차이점을 잘 못 느낄 수도 있다.
  • 해당 위 파일은 같은 역할을 하고 있는 중이다.
  • 이제 저기서 nexus 설정 그리고 build/jar 시 manifest 설정 등이 추가 되면 가독성의 큰 차이점을 느낄 수 있다.

5. Performance Maven vs Gradle

  • maven 공식 문서에는 서로 비교 문서가 없지만, gradle 측 공식 문서에는 비교문서가 존재한다. (자신있는 모습)
  • 더 자세히 알고 싶으면 아래 링크로 들어가봐도 좋을 것 같다. (gradle 공식 문서에서 maven과 비교한 자료이다.)
  • 🥊 maven vs gradle

🥊 성능 vs

  • Gradle은 작업 의존성 그래프를 기반으로하는 반면 Maven은 고정적이고 선형적인 단계의 모델을 기반
  • 성능 측면에서는 둘 다 다중 모듈 빌드병렬로 실행할 수 있지만, Gradle은 어떤 task가 업데이트되었고 안되었는지를 체크하기 때문에 incremental build를 허용
    • 이미 업데이트된 테스크에 대해서는 작업이 실행되지 않으므로 빌드 시간이 훨씬 단축된다.
    • 빌드 설정 규모가 점점 커지면 커질수록, 빌드시간의 차이도 Maven과 비교하여 꽤 격차가 벌어진다.
      • Gradle은 테스트를 실행할 때 1.7배 더 빠르고 빌드 캐시를 사용할 때 최대 30배 더 빠르게 빌드한다.
  • 멀티 프로젝트에서 maven의 경우 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 하지만 gradle 은 설정 주입 방식을 제공한다.
  • Gradle은 concurrent에 안전한 캐시를 허용
    • 2개 이상의 프로젝트에서 동일한 캐시를 사용할 경우, 서로 overwrite되지 않도록 checksum 기반의 캐시를 사용하고, 캐시를 repository와 동기화시킬 수 있다.

📌 여담

  • maven 도 gradle도 아직 안 접한 분들이시라면, maven 보단 gradle로 시작하는 것을 꼭 추천하고 싶다.!

📚 참고

profile
나도 보기 위해 정리해 놓은 벨로그

2개의 댓글

comment-user-thumbnail
2023년 9월 6일

잘보고 갑니다 (__)

1개의 답글