Spring

[Spring] 빌드 관리 도구 Maven vs Gradle

s_ih_yun 2025. 6. 4. 00:13
728x90

 

 

재직 중에 Maven만 사용하다가 요즘은 Gradle이 더 간결하고 많이 쓰인다길래 써보면서 차이점을 기록하려고 합니다

 

 

 

 

1. 빌드 관리 도구 (Build Tool)

  • Maven과 Gradle은 모두 빌드 관리 도구
  • 작업
    • 종속성 다운로드
    • 소스코드를 바이너리 코드로 컴파일
    • 바이너리 코드를 패키징
    • 테스트 실행
    • 프로덕션 시스템에 배포

 

 


2. Maven vs Gradle 차이

 

2.1. Maven vs Gradle 차이

  Gradle Maven
스크립트 적은 양의 스크립트로 짧고 간결한 작성 가능 프로젝트가 커질수록 길고 가독성 떨어짐
동적 빌드 동적 빌드는 Groovy 스크립트로 플러그인 호출하거나 직접 코드 작성 가능 정적 형태의 XML 기반이라 동적 빌드 적용 어려움
멀티 프로젝트 설정 주입 방식 사용 → 멀티 프로젝트에 적합 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속 받아야 함
속도 빌드와 테스트가 더 빠름 상대적으로 느림
  • 스크립트 길이와 가독성 : Gradle 우세
  • 빌드와 테스트 실행 : Gradle이 빠름
  • 의존성이 늘어날 수록 성능과 스크립트 품질 차이가 심해질 것

 

 

2.2. 주요 명령어 차이

  Gradle Maven
빌드 ./gradlew build mvn package
실행 ./gradlew bootRun mvn spring-boot:run
테스트 ./gradlew test mvn test
의존성 확인 ./gradlew dependencies mvn dependency:tree
클린 ./gradlew clean mvn clean
  • ./gradlew : Gradle Wrapper 실행 파일

 

2.3. 프로젝트의 root / Module 정의

  • Maven
    • pom.xml 만 있으면 루트 프로젝트로 자동 인식
    • 다중 모듈의 경우, pom.xml 안에 <modules> 태그로 하위 모듈 명시
  • Gradle
    • setting.gradle(.kts) 파일이 있어야 프로젝트를 루트로 인식
    • 이 파일 안에 프로젝트 이름과 모듈 구조 설정 가능
      • ex.
        rootProject.name = "MyAwesomeApp"
        nclude("core", "web", "api")
  • 이 외에 Spring 프로젝트에서 Maven → Gradle로 변경해도 디렉토리 구조는 거의 동일!

 

2.4. 의존성/빌드 파일 예시

  • Maven : pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>Project2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Project2</name>
    <description>Project2</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <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-web-services</artifactId>
        </dependency>

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

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

</project>

 

  • Gradle : build.gradle(.kts)
plugins {
    java
    id("org.springframework.boot") version "3.5.0"
    id("io.spring.dependency-management") version "1.1.4"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"
description = "Project2"

java {
    sourceCompatibility = JavaVersion.VERSION_17
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-web-services")
    implementation("org.springframework.boot:spring-boot-starter-validation")

    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.test {
    useJUnitPlatform()
}

 

 

 

 

 

 

📌  References

https://hesh1232.tistory.com/156

 

Maven과 Gradle 차이 및 프로젝트 설정

1. Maven과 Gradle 우리는 스프링 프로젝트를 생성할 때 Maven을 선택할 것인지 Gradle을 선택할 것인지 선택할 것입니다. 이전엔 책에서 하란대로 따라만 했지 둘이 어떤 차이가 있는지 잘 모르고 개발

hesh1232.tistory.com

 

https://dev-coco.tistory.com/65

 

메이븐(Maven)과 그래들(Gradle)의 개념 및 비교

스프링과 스프링부트를 공부 하려던 중 maven과 gradle을 알게되었습니다. maven과 gradle이 빌드관리도구인 것은 알고있지만 자세한 개념은 모르기에 maven과 gradle 각각의 개념과 정확한 차이점을 알

dev-coco.tistory.com

 

 

 

 

 

 

728x90