[Spring] Maven과 Gradle

ryudjae
|2022. 1. 6. 23:18
728x90

Spring 프로젝트를  시작할 때 빌드 도구를 Maven과 Gradle 중 하나를 선택해서 진행해야 한다. 예전에 스프링을 처음 배울 때는 Maven을 사용하는 사람들이 꽤 많았다. 그러나 요즘은 대부분이 Gradle을 사용한다. 

이 두 종류의 빌드도구를 알아보기 전에 빌드 도구에 대해서 먼저 알아보자.

 

🛠빌드도구

프로젝트에서 작성한 자바 코드와 프로젝트 내에 필요한 각종 설정 파일들을 JVM이나 WAS가 인식할 수 있도록 패키징 해주는 과정을 빌드 도구라고 한다.

예를 들면 어떤 라이브러리를 사용할 때, 만약 빌드 도구가 없다면 번거롭게 개발자가 모두 다운받아서 사용하여야 한다. 그러나 빌드도구가 있으면 설정 파일에 필요한 라이브러리 종류와 버전들, 종속성 정보를 명시하며 필요한 라이브러리들을 설정 파일을 통해 자동으로 다운로드해주고 관리까지 해주는 것이다.

 

⛏Maven

  • Maven은 프로젝트 빌드/관리를 위한 모듈이고, 자바 빌드 도구로서 Apache Ant를 대안으로 나온 것이다.
  • 프로젝트 객체 모델 POM의 개념을 기반으로 Maven은 중앙 정보에서 프로젝트의 빌드, 보고 및 문서를 관리한다.
  • 빌드 중인 프로젝트, 빌드 순서, 다양한 외부 라이브러리 종속성 관계를 pom.xml에 명시한다.
  • Maven은 외부 저장소에서 필요한 라이브러리와 플러그인들을 다운로드 한 다음 , 로컬 시스템의 캐시에 저장한다.

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.example</groupId>
   <artifactId>demo-maven</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

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

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.4.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
   </properties>

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

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


</project>

 

⛏Gradle

  • Maven과 Ant의 장점을 조합해서 만든 빌드 도구이다.
  • 멀티 프로젝트 빌드를 도울 수 있도록 디자인되었다.
  • Gradle은 프로젝트가 어느 부분이 업데이트되었는지 알기 때문에, 빌드에 점진적으로 추가할 수 있다.

Gradle 설정 파일 build.gradle 예제

buildscript {
    ext {
        springBootVersion = '1.5.4.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter')
}

 

🪓Maven VS Gradle

우선 둘 중에는 Gradle이 확실히 우세한 것 같다. Gradle에 보면 Maven과 비교 문서가 있다. 뭐 그만큼 자신 있다는 거 아닐까,,,

그럼에도 불구하고 많은 사람들이 Maven에서 넘어오지 못한 이유는 익숙함 때문이 아닌가 싶다

  • Gradle이 더 늦게 출시했기 때문에 사용성 , 성능 부분에서는 비교적 뛰어난 스펙을 가지고 있다.
  • Maven에서 사용하는 XML로 빌드를 정의하기에는 어려움이 많다. 우선 가독성이  떨어지고, 의존관계가 복잡한 프로젝트를 설정하기에는 부적절하다.
  • Gradle은 groovy를 사용하기 때문에, 동적인 빌드는 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 된다. 
  • Configuration Injection 방식을 사용해 Maven에서 공통 모듈을 상속해서 사용하는 단점을 커버했다. 
  • 설정 주입 시 프로젝트의 조건을 체크할 수 있어서 프로젝트 별로 주입되는 설정을 다르게 할 수 있다.
  • 설정 파일만 보더라도 Gradle이 직관적으로 보기 편하다.

 

그리고 Gradle이 Maven보다 최대 100배 정도 빠르다.

728x90