오늘은 Maven
과 Gradle
을 비교하며, 왜 많은 프로젝트가 Maven에서 Gradle로 전환하고 있는지 정리해보려고 합니다.
Spring을 학습하면서 많은 책과 강의에서 Maven을 사용하고 있지만 현재 Spring 공식 문서에서는 Gradle을 기본 빌드 도구로 권장하고 있습니다.
저는 Maven을 경험하지 않고 처음부터 Gradle을 사용해 왔기 때문에 "왜 기존에 오랫동안 사용되던 Maven 대신 Gradle이 선택되고 있을까?" 라는 궁금증이 생겨 이것에 대한 정리해보려고 합니다.
Maven은 2004년에 Apache에서 개발한 Java
기반 프로젝트 관리 및 빌드 도구이며, XML기반의 설정파일인 pom.xml
를 사용하여 프로젝트를 정의합니다.
Maven의 기능을 수행하기 위해 사용되는 파일 pom.xml
의 약자로 Maven에서 사용되는 파일을 정의하고 관리하는 파일입니다.
주요 정보는 다음과 같습니다.
pom.xml
에 정의합니다.pom.xml
에 명시하면 자동으로 다운로드 및 관리가 가능합니다.<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
Gradle은 2012년에 등장한 빌드도구로 Groovy
& Kotlin DSL
을 기반으로하는 설정파일을 작성하며, 주요 특징으로는 안드로이드 공식 빌드 시스템으로 채택되어있고 Java, Kotlin, Scala등 다양한 언어를 지원합니다.
Groovy
& Kotlin
를 사용해 간결하고 가독성 높은 설정 파일을 작성합니다.dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:2.6.2'
}
비교 | Maven | Gradle |
---|---|---|
설정 파일 형식 | XML 기반의 pom.xml 을 사용하여 설정.규모가 커지만 가독성이 떨어질 수 있음. | Groovy &Kotlin 을 사용해 build.gradle 을 생성.설정이 간결하고 가독성이 좋음. |
빌드 성능 | 모든 작업을 순차적으로 실행. 대규모 프로젝트에서는 빌드시간이 길어짐. | 증분 빌드와 빌드 캐시를 활용하여 변경부분만 재 빌드를 진행하고, 멀티스레딩을 지원하여 빌드속도가 빠름 |
유연성 및 확장성 | 정적인 XML 구조로 인해 복잡한 빌드 로직을 구현하거나 커스터마이징에 한계가 있음. | DSL을 통해 빌드 로직을 유연하게 구현할수 있으며, 플러그인 시스템을 통한 기능 확장이 용이 |
XML
을 기반으로 순차적으로 실행되기 때문에 빌드 속도가 느리다는 단점이 있습니다.출처 : Gradle | Gradle and Maven Comparison
Gradle이 속도가 빠른 이유
- Task Graph를 통해 필요 작업만 수행.
- 캐싱을 활용하여 동일한 결과가 필요한 경우 다시 실행하지 않음.
- 멀티스레딩 지원으로 여러 작업을 동시에 수행.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:2.6.2'
}
- XML이 아닌 DSL를 사용해 설정이 간결함.
- 의존성 관리가 단순화 되어 유지보수에 용이함.
- 설정변경이 빠르고 유연하게 동작하기에 생산성 증가.
멀티모듈 프로젝트?
- 하나의 프로젝트 안에 여러개의 서브모듈을 독립적으로 관리하는 구조를 의미합니다.
- 재사용성을 높이고 유지보수에 용이함.
my-project/
├── build.gradle (루트 프로젝트 설정)
├── settings.gradle (모듈 설정)
├── core/ (공통 기능을 제공하는 모듈)
│ ├── build.gradle
├── api/ (API 관련 모듈)
│ ├── build.gradle
├── service/ (비즈니스 로직을 처리하는 모듈)
│ ├── build.gradle
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
에 선언 후 세부 설정은 각 모듈에 들어가 설정만 하면 됩니다.
=> 세부적으로 필요한 설정만 추가하면 됌.
앞서 살펴봐온 내용으로 간단하게 정리하고 넘어가면 Gradle은 Maven보다 빌드속도가 빠르다는 것을 계속해서 나타내고 있습니다.
CI / CD에서는 빠르게 빌드하여 배포하는 것이 가장 중요한 포인트로 빠르게 빌드되지않고 빌드 시간이 오래걸린다면 배포가 지연이 생기게되고 예상치못한 배포실패라는 결과를 초래할 수 있습니다.
해서 maven에서도 CI/ CD를 사용할때 빌드 최적화를 중요하게 여기고 있습니다.
주로 CI/CD는 Github Action / Jenkins등과 연동하여 사용하는데 Gradle은 DSL을 활용한 간결한 빌드 스크립트를 제공하여 쉽게 연동이 가능합니다.
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'
}
}
}
}
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
Gradle을 이용한 이미지 빌드
FROM openjdk:17
COPY build/libs/myapp.jar myapp.jar
ENTRYPOINT ["java", "-jar", "/myapp.jar"]
비교 | Maven | Gradle |
---|---|---|
빌드 속도 | 느림 | 빠름(증분 빌드, 캐싱) |
병렬 빌드 | 기본 지원 x ( -T옵션) | 기본 지원 |
의존성 | 네트워크 접속 필요 | 로컬 캐시 활용 |
CI/ CD자동화 | XML설정으로 복잡함 | 스크립트를 활용하여 간결하게 설정 가능 |
Docker 연동 | 별도 플러그인 필요 | DockerFile을 활용해 사용 |
Maven은 오랫동안 안정적인 빌드 도구로 사용되어 왔지만 설정이 복잡하고 빌드 속도가 느리다는 한계가 있었습니다. 반면, Gradle은 "증분 빌드, 캐싱, 병렬 실행을 지원하여 더 빠르고 유연한 빌드 환경을 제공"하기 때문에 많은 프로젝트가 Gradle로 전환하고 있습니다.
특히, Spring 공식 문서에서도 Gradle을 기본 빌드 도구로 권장하고 있고 CI/CD 및 대규모 프로젝트 환경에서 더 효율적인 선택이 되고 있습니다.