Spring

[Spring] Maven VS Gradle

cloud-grace 2024. 7. 6. 19:31

자바 프로젝트에서 널리 사용되는 빌드 자동화 도구인 Maven과 Gradle에 대해 알아보고 차이점에 대해 알아보자.

 

1. Maven

  • 과거에는 Apache Ant라는 빌드 도구를 많이 사용하였지만, Ant의 대안으로 출시된 현재는 Maven을 많이 사용한다.
  • XML 기반의 pom.xml을 사용하여 프로젝트 설정을 정의한다.
  • XML 이라서 정형화된 구조를 보이지만, 설정이 길어지면 가독성이 떨어질 수 있다.
  • Apache 라이센스로 배포되는 오픈 소스 소프트웨어이다.

 

POM(Project Object Model)

아래는 pom.xml에 포함된 기능이다.

  • 프로젝트 이름, 라이센스 등의 프로젝트 정보
  • 소스, 리소스, 라이프사이클 마다 실행한 플러그인 등의 빌드 설정
  • 환경마다 달라질 수 있는 프로파일 정보가 담긴 빌드 환경
  • 의존 프로젝트(모듈), 상위 프로젝트, 포함하는 하위 모듈 등의 pom 연관 정보

 

2. Gradle

  • Gradle은 Ant와 Maven의 장점을 모아 개발하여 2012년에 출시된 Groovy를 이용한 빌드 자동화 도구이다.
  • 안드로이드 앱의 공식 빌드 시스템이다.
  • Maven에 비해 빌드 속도가 10~100배나 빠르다.
  • Java, C, C++, Python 등 여러 언어를 지원한다.
  • 별도 빌드 스크립트를 통해 애플리케이션 버전, 라이브러리 등 항목 설정이 가능하다.
  • 빌드 툴(Ant Builder, Groovy) 기반으로 만들어져 기존 Ant 역할과 배포 스크립트 기능을 모두 사용할 수 있다.
  • 스크립트 언어로 작성하기 때문에 변수 선언, if, for 등의 코드 로직 구현이 가능하여 가독성이 좋다.
Groovy는 Java 가상 머신에서 실행되는 스크립트 언어이다.
Java 가상 머신에서 동작하지만 소스 코드 컴파일은 필요 없다.
스크립트 언어이므로 소스 코드 그대로 실행한다.
Java와 호환되며 Java Class 파일을 그대로 Groovy Class로 사용할 수 있다.
Java 문법과 유사하므로 Gradle은 Java 개발자가 사용하기에 적합하다.

 

Maven VS Gradle

  • Ant와 Maven의 장점을 기반으로 만들어진 Gradle이 등장한 이후로 Gradle을 많이 쓰는 추세라고 한다.
  • 설정 내용이 길어지면 가독성이 떨어지고, 의존 관계가 복잡한 프로젝트는 XML로 정의하기에 어려울 수 있다.
  • Groovy를 사용하는 Gradle은 동적 Build를 Groovy 스크립트로 플러그인을 호출하고 코드를 직접 작성할 수 있다.

 

[Maven] Spring Boot 프로젝트 구조

my-spring-boot-app
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── demo
│   │   │               └── DemoApplication.java
│   │   └── resources
│   │       └── application.yml
├── pom.xml
└── .gitignore

 

[Gradle] Spring Boot 프로젝트 구조

my-spring-boot-app
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── demo
│   │   │               └── DemoApplication.java
│   │   └── resources
│   │       └── application.yml
├── build.gradle
└── .gitignore

 

[Maven] Spring Boot pom.xml

<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>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.1</version>
        <relativePath/>
    </parent>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

 

[Gradle] Spring Boot bundle.gradle

plugins {
    id 'org.springframework.boot' version '3.3.1'
    id 'io.spring.dependency-management' version '1.1.5'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

 

정리

  • 코드 길이와 가독성은 gradle이 더 좋다.
  • 빌드 및 테스트 실행 속도는 gradle이 더 빠르다.
  • Maven은 정형화된 구조로 학습하기에 보다 좋을 수 있다.