dev-sohee 님의 블로그
빌드 자동화 도구: Gradle vs Maven 본문
개발자들은 일반적으로 외부 라이브러리를 많이 활용합니다. 이때 라이브러리를 효율적으로 활용하기 위해서는 의존성 관리를 자동화 해주는 빌드 도구 사용이 필수적입니다. 빌드 도구를 사용하면 라이브러리를 자동으로 다운로드하고 빌드 과정에 포함시켜줌으로써, 개발 작업 효율성을 크게 높일 수 있습니다. 빌드 도구가 없으면 개발 생산성이 크게 떨어질 수 밖에 없기 때문에, 대부분의 자바 프로젝트에서는 ‘Maven’이나 ‘Gradle’ 같은 빌드 도구를 사용합니다. 오늘은 두 빌드 도구의 차이에 대해 알아보겠습니다.
* Maven
* Gradle
Gradle과 Maven을 설명하기 전에 우선 빌드와 빌드 도구가 무엇인지에 대해서 알아보겠습니다. ‘빌드’란 프로그램을 실행 가능 한 배포 파일을 만들어 내는 것을 의미합니다. 즉, 소스 코드를 컴파일하고, 컴파일된 클래스 파일과 리소스 파일 등 프로그램 실행에 관련된 파일들을 패키징하여, 배포 가능한 형태로 만드는 것을 의미합니다.
‘빌드 도구’는 이러한 일련의 빌드 과정을 자동화해주는 소프트웨어입니다. 설정 파일을 통해 필요한 작업을 정의하고 클릭 한 번으로 모든 의존 라이브러리(.jar 파일)를 다운로드해 컴파일하고, 테스트하고, 패키징 하여 배포까지 자동으로 처리해주는 유용한 도구입니다. 그리고 자바로 개발할 때 대표적으로 사용되는 빌드 도구가 Maven과 Gradle입니다.
# Maven
자바 프로젝트는 수 많은 외부 라이브러리를 사용합니다. 이러한 jar 파일 형태의 라이브러리를 예전에는 수동으로 다운로드해서 프로젝트 폴더에 두고 관리했기 때문에, 버전이 변경되면 다시 다운로드해야 하는 등 관리에 불편함이 있었습니다.
Maven은 외부 라이브러리를 자동으로 관리해주고, 표준화된 형태로 빌드할 수 있도록 틀을 제공해주어 빌드 자동화의 편의성을 높여줍니다. 이를 통해 자동으로 빌드 및 테스트, 패키징을 수행하여 개발 생산성이 향상되었습니다.
Maven은 pom.xml이라는 빌드 파일 형식으로 빌드 설정을 관리하는데, pom.xml 파일은 프로젝트의 의존성, 플러그인, 빌드 설정 등을 정의하는 Maven 프로젝트의 핵심 파일입니다. 다음은 간단한 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> //프로젝트의 그룹 ID를 정의합니다.
<artifactId>my-app</artifactId> //프로젝트의 아티팩트 ID를 정의합니다.
<version>1.0-SNAPSHOT</version> //프로젝트의 버전을 정의합니다.
<packaging>jar</packaging>
<name>My Application</name>
<description>A simple Maven project</description>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies> //프로젝트에서 사용할 라이브러리 의존성을 정의합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build> //빌드 관련 설정을 정의합니다.
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.4</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
이 예제를 기반으로 필요에 따라 의존성을 추가하거나 수정할 수 있고 아래와 같이 빌드를 실행할 수 있습니다.
- 프로젝트 빌드: mvn compile
- 테스트 실행: mvn test
- 패키징: mvn package
- 빌드 파일 삭제: mvn clean
Maven의 단점은 빌드 속도가 느리고 유연성이 부족하다는 것인데, 이를 개선하고 보완하기 위해 나온 것이 바로 Gradle입니다.
# Gradle
Gradle은 2007년 JetBrains회사의 Hans Dockter가 개발한 오픈소스 빌드 자동화 도구입니다. Maven은 XML 기반의 빌드 파일을 사용하기 때문에 가독성이 떨어지지만, Gradle은 Groovy기반 스크립트 방식을 사용하여 ‘build.gradle’이라는 빌드 파일을 만들기 때문에 가독성이 좋고, 스크립트를 통해 멀티 프로젝트 빌드, 다양한 플랫폼 지원 등 여러 가지 상황에 적합한 빌드를 만들어 낼 수 있어 유연합니다.
이러한 유연성 덕분에 Gradle은 빌드 과정에서 병렬 처리와 캐싱을 활용하여 Maven보다 10배~100배까지 향상된 성능을 보여줍니다. 그래서 Gradle은 안드로이드 개발을 위한 공식 빌드 도구로 지정되어, 안드로이드 어플리케이션을 빌드하고 관리할 때 대표적으로 사용되고 있습니다.
Gradle은 groovy언어의 build.gradle 파일을 통해 프로젝트의 빌드 설정과 종속성을 설정합니다. 이러한 구조는 Gradle이 빌드 시스템으로서의 유연성과 효율성을 제공할 수 있도록 도와줍니다. 아래는 간단한 build.gradle 파일 예제입니다.
plugins {
//사용할 플러그인을 정의합니다. Spring Boot 및 Java 플러그인을 사용합니다.
id 'org.springframework.boot' version '2.5.4'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example' //프로젝트의 그룹 ID를 정의합니다.
version = '1.0-SNAPSHOT' //프로젝트의 버전을 정의합니다.
sourceCompatibility = '1.8' //소스 호환성을 정의합니다.
repositories {
//의존성을 다운로드할 리포지토리를 설정합니다.
mavenCentral()
}
dependencies {
//프로젝트에서 사용할 의존성을 정의합니다.
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'junit:junit:4.13.2'
}
test {
//테스트 관련 설정을 정의합니다.
useJUnitPlatform()
}
Gradle로는 다음와 같은 명령어로 빌드를 수행할 수 있습니다.
- 프로젝트 빌드: gradlew build
- 컴파일된 클래스 파일 생성: gradlew classes
- 패키징 파일인 jar파일 생성: gradlew jar
- 빌드 파일 삭제: gradlew clean
Maven과 Gradle의 특징을 비교하여 정리하면 다음과 같습니다.
Maven과 Gradle은 각각 뚜렷한 장점과 특성을 지닌 강력한 빌드 도구입니다. Maven은 단순하고 일관된 빌드 생명 주기를 제공하며, 표준화된 프로젝트 관리에 뛰어나기 때문에 간단한 프로젝트나 명확한 구조와 표준화가 요구되는 프로젝트에 적합합니다. 반면, Gradle은 유연한 구성과 뛰어난 성능을 제공하며, Groovy 스크립트 언어를 사용하여 복잡한 빌드 요구사항을 효과적으로 처리할 수 있습니다.
따라서 성능 최적화가 필요하거나 복잡한 빌드 프로세스를 관리해야 하는 경우에는 Gradle을 사용하는 것이 나을 수 있지만, 프로젝트의 특성에 맞게 두가지 도구를 적절히 활용하면 될 것 같습니다.