Maven Gradle 비교

Chunbae·2025년 2월 2일
0

개발이론

목록 보기
6/6
post-thumbnail

오늘은 MavenGradle을 비교하며, 왜 많은 프로젝트가 Maven에서 Gradle로 전환하고 있는지 정리해보려고 합니다.

Spring을 학습하면서 많은 책과 강의에서 Maven을 사용하고 있지만 현재 Spring 공식 문서에서는 Gradle을 기본 빌드 도구로 권장하고 있습니다.
저는 Maven을 경험하지 않고 처음부터 Gradle을 사용해 왔기 때문에 "왜 기존에 오랫동안 사용되던 Maven 대신 Gradle이 선택되고 있을까?" 라는 궁금증이 생겨 이것에 대한 정리해보려고 합니다.




Maven이란?

Maven은 2004년에 Apache에서 개발한 Java기반 프로젝트 관리 및 빌드 도구이며, XML기반의 설정파일인 pom.xml 를 사용하여 프로젝트를 정의합니다.

  • 프로젝트 진행시 사용되는 라이브러리를 관리하는 도구이며, Maven의 특징으로는 라이브러리와 라이브러리를 연동해 관리한다는 점이 있습니다.



POM - Project Object Model

Maven의 기능을 수행하기 위해 사용되는 파일 pom.xml 의 약자로 Maven에서 사용되는 파일을 정의하고 관리하는 파일입니다.
주요 정보는 다음과 같습니다.

  • 프로젝트 정보 : 프로젝트 명, 라이센스 등등
  • 빌드 설정 : 소스, 리소스, 라이프사이클, 플러그인등 설정
  • 빌드 환경 : 프로파일정보
  • 연관 정보 : 의존 프로젝트, 상위/하위 모듈 등등



특징

  • XML 기반 설정 : 프로젝트의 기본 설정 및 의존성 설정을 모두 pom.xml 에 정의합니다.
  • 의존성 관리 용이 : 필요 라이브러리를 pom.xml에 명시하면 자동으로 다운로드 및 관리가 가능합니다.
  • 플러그인 중심
  • 중앙 저장소 지원 : Maven Central Repository를 통한 외부 라이브러리를 관리할수 있습니다.
  • 안전성 : 오랜 기간 유지되며 검증된 도구로서 많은 프로젝트에 활용되어 검증되었습니다.
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.6.2</version>
    </dependency>
</dependencies>



Gradle이란?

Gradle은 2012년에 등장한 빌드도구로 Groovy & Kotlin DSL 을 기반으로하는 설정파일을 작성하며, 주요 특징으로는 안드로이드 공식 빌드 시스템으로 채택되어있고 Java, Kotlin, Scala등 다양한 언어를 지원합니다.

특징

  • DSL(Domain Specific Language) 기반 설정 : Groovy & Kotlin를 사용해 간결하고 가독성 높은 설정 파일을 작성합니다.
  • Incremental Build : 변경된 부분만 다시 빌드하여 빌드속도가 빠릅니다.
  • 유연한 플러그인 시스템
  • 다양한 언어 지원
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web:2.6.2'
}



정리

비교MavenGradle
설정 파일 형식XML기반의 pom.xml을 사용하여 설정.
규모가 커지만 가독성이 떨어질 수 있음.
Groovy&Kotlin을 사용해 build.gradle을 생성.
설정이 간결하고 가독성이 좋음.
빌드 성능모든 작업을 순차적으로 실행.
대규모 프로젝트에서는 빌드시간이 길어짐.
증분 빌드와 빌드 캐시를 활용하여 변경부분만
재 빌드를 진행하고,
멀티스레딩을 지원하여 빌드속도가 빠름
유연성 및 확장성정적인 XML 구조로 인해 복잡한 빌드 로직을 구현하거나 커스터마이징에 한계가 있음.DSL을 통해 빌드 로직을 유연하게 구현할수 있으며, 플러그인 시스템을 통한 기능 확장이 용이



Maven에서 Gradle로 전환된 주요 이유


1. 빌드 속도의 향상 - 성능

  • Maven은 XML을 기반으로 순차적으로 실행되기 때문에 빌드 속도가 느리다는 단점이 있습니다.
  • Gradle은 Task기반 빌드 시스템으로 이전 빌드 결과를 "캐싱"하여 변경된 부분만 다시 빌드하여 빌드 속도가 빠르다는 특징이 있습니다.
    - 추가로 멀티스레딩을 지원하여 빌드 속도 최적화가 가능합니다.

출처 : Gradle | Gradle and Maven Comparison

Gradle이 속도가 빠른 이유

  1. Task Graph를 통해 필요 작업만 수행.
  2. 캐싱을 활용하여 동일한 결과가 필요한 경우 다시 실행하지 않음.
  3. 멀티스레딩 지원으로 여러 작업을 동시에 수행.




2. 설정파일의 유지보수 용이

  • Maven은 설정이 복잡
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.6.2</version>
    </dependency>
</dependencies>
  • Gradle은 Maven보다 간결하고 직관적인 설정이 가능하다.
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web:2.6.2'
}
  • XML이 아닌 DSL를 사용해 설정이 간결함.
  • 의존성 관리가 단순화 되어 유지보수에 용이함.
  • 설정변경이 빠르고 유연하게 동작하기에 생산성 증가.



3. 멀티 프로젝트 빌드 지원 및 확장성 강화

멀티모듈 프로젝트?

  • 하나의 프로젝트 안에 여러개의 서브모듈을 독립적으로 관리하는 구조를 의미합니다.
  • 재사용성을 높이고 유지보수에 용이함.
my-project/
 ├── build.gradle  (루트 프로젝트 설정)
 ├── settings.gradle (모듈 설정)
 ├── core/        (공통 기능을 제공하는 모듈)
 │    ├── build.gradle
 ├── api/         (API 관련 모듈)
 │    ├── build.gradle
 ├── service/     (비즈니스 로직을 처리하는 모듈)
 │    ├── build.gradle


멀티모듈 설정


**Maven** ```xml com.myproject core 1.0-SNAPSHOT ``` Maven은 각 모듈마다 개별적으로 pom.xml을 설정해야함.



Gradle

allprojects {
    repositories {
        mavenCentral()
    }
}

subprojects {
    apply plugin: 'java'
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter'
    }
}
  • allprojects {} -> 모든 모듈에 공통적으로 적용한 설정
  • subprojects {} -> 각 서브 모듈에 적용한 공통된 빌드 설정

서브 모듈 (api/build.gardle)
API 모듈은 core 모듀을 의존성으로 추가하여 재사용

dependencies {
    implementation project(':core') // 'core' 모듈을 참조
}

Maven의 경우에는 모든 모듈에 공통적으로 적용할 설정을 작성후 개별 설정까지 포함하여 모듈별로 모두 작성해야합니다.
=> 반복적인 코드가 많음.

Gradle의 경에는 공통사용 설정은 루트디렉토리 내에 build.gradle에 선언 후 세부 설정은 각 모듈에 들어가 설정만 하면 됩니다.
=> 세부적으로 필요한 설정만 추가하면 됌.




4. CI / CD 환경에서의 Gradle의 이점

앞서 살펴봐온 내용으로 간단하게 정리하고 넘어가면 Gradle은 Maven보다 빌드속도가 빠르다는 것을 계속해서 나타내고 있습니다.

CI / CD에서는 빠르게 빌드하여 배포하는 것이 가장 중요한 포인트로 빠르게 빌드되지않고 빌드 시간이 오래걸린다면 배포가 지연이 생기게되고 예상치못한 배포실패라는 결과를 초래할 수 있습니다.
해서 maven에서도 CI/ CD를 사용할때 빌드 최적화를 중요하게 여기고 있습니다.

주로 CI/CD는 Github Action / Jenkins등과 연동하여 사용하는데 Gradle은 DSL을 활용한 간결한 빌드 스크립트를 제공하여 쉽게 연동이 가능합니다.

  • Jenkins
pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/myrepo.git'
            }
        }
        stage('Build') {
            steps {
                sh './gradlew build'
            }
        }
        stage('Deploy') {
            steps {
                sh 'scp build/libs/*.jar user@server:/deploy'
            }
        }
    }
}

  • Github Action
name: CI/CD with Gradle

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: 코드 가져오기
        uses: actions/checkout@v2

      - name: JDK 설정
        uses: actions/setup-java@v2
        with:
          distribution: 'temurin'
          java-version: '17'

      - name: Gradle 빌드 실행
        run: ./gradlew build

+ Docker

Gradle을 이용한 이미지 빌드

FROM openjdk:17
COPY build/libs/myapp.jar myapp.jar
ENTRYPOINT ["java", "-jar", "/myapp.jar"]
비교MavenGradle
빌드 속도느림빠름(증분 빌드, 캐싱)
병렬 빌드기본 지원 x ( -T옵션)기본 지원
의존성네트워크 접속 필요로컬 캐시 활용
CI/ CD자동화XML설정으로 복잡함스크립트를 활용하여 간결하게 설정 가능
Docker 연동별도 플러그인 필요DockerFile을 활용해 사용

5. 마무리

Maven은 오랫동안 안정적인 빌드 도구로 사용되어 왔지만 설정이 복잡하고 빌드 속도가 느리다는 한계가 있었습니다. 반면, Gradle은 "증분 빌드, 캐싱, 병렬 실행을 지원하여 더 빠르고 유연한 빌드 환경을 제공"하기 때문에 많은 프로젝트가 Gradle로 전환하고 있습니다.

특히, Spring 공식 문서에서도 Gradle을 기본 빌드 도구로 권장하고 있고 CI/CD 및 대규모 프로젝트 환경에서 더 효율적인 선택이 되고 있습니다.





Reference

Gradle | Gradle and Maven Comparison

profile
말하는 감자

0개의 댓글