Maven과 Gradle

Jiwon Jung·2025년 8월 31일

스프링(Spring)

목록 보기
5/20

이번 포스팅에선 빌드 관리 도구(Build Tool)인 Maven과 Gradle에 대해 알아본다.


📖 빌드(Build)

빌드란 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정 및 결과를 말한다. 쉽게 말해, 개발자가 작성한 소스코드(.java 파일)와 프로젝트에서 쓰인 각각의 파일 및 자원(.xml, .jpa, .jpg, properties)을 JVM이나, 톰캣 같은 WAS가 인식할 수 있도록 패키징하는 과정 및 결과를 말한다.

즉, 소스코드를 컴파일 해서 바이트코드 파일로 변환하고, resource를 바이트코드 파일이 참조할 수 있는 적절한 위치로 옮기며 META-INF와 MANIFEST.MF들을 하나로 압축하는 과정을 의미한다.


📖 빌드 관리 도구(Build Tool)

빌드 관리 도구는 소스코드에서 애플리케이션을 생성할 때 여러가지 외부 라이브러리들을 사용하는데, 빌드 관리 도구는 사용자가 관리할 필요 없이 필요한 라이브러리들을 자동으로 관리해준다.

빌드 관리 도구는 다음과 같은 작업을 수행한다.

1. 종속성 다운로드: 전처리(Preprocessing)
2. 소스코드를 바이너리 코드로 컴파일(Compile)
3. 바이너리 코드를 패키징(Packaging)
4. 테스트 실행(Testing)
5. 프로덕션 시스템에 배포(Distribution)

⭐ 빌드 관리 도구를 사용하는 이유

대규모 프로젝트에서 빌드 프로세스를 수동으로 호출하는 것은 비효율적이다. 무엇을 빌드할지, 어떤 순서로 할지, 어떤 의존성을 가지는지 모두 추적하는 건 쉽지 않기 때문이다. 빌드 관리 도구를 사용하면 이를 일관되게 할 수 있다.

빌드 툴에는 Ant, Maven, Gradle 등이 있다.


📖 Maven

  • Maven은 Java 전용 프로젝트 관리 도구로, LifeCycle 관리 목적 빌드 도구이다.
  • Apache Ant의 대안으로 만들어졌다.
  • 아파치 라이센스로 배포되는 오픈 소스 소프트웨어이다.
  • 프로젝트를 진행하면서 사용하는 수많은 라이브러리들을 관리해준다.

LifeCycle 관리 도구이기 때문에, 정해진 LifeCycle에 의하여 작업을 수행하며, 전반적인 프로젝트 관리 기능을 포함하고 있다.

⭐ pom.xml

  • POM(Project Object Model)은 말 그대로 Project Object Model의 정보를 담고 있는 파일이다.
  • Maven의 기능을 이용하기 위해서 pom.xml이 사용된다.
  • XML 기반이어서 계층적이고 정형화된 구조를 가지며, 선언적이고 정적인 문서이다.

필요한 라이브러리들을 pom.xml에 정의해 놓으면, 해당 라이브러리는 물론 라이브러리가 작동하는데 필요한 다른 라이브러리까지 관리한다.

다음은 실제 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>2.5.2</version>
        <relativePath/>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo-maven</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo-maven</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</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

  • 빌드, 프로젝트 구성/관리, 테스트, 배포 도구이다.
  • 빌드 속도가 Maven에 비해 빠르다.
  • 빌드 툴인 Ant Builder와 Groovy 스크립트 기반으로 만들어져 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용 가능하다.

⭐ build.gradle

  • 기존의 Maven은 XML로 라이브러리를 정의하고 사용하도록 되어 있는 반면, Gradle은 별도의 빌드 스크립트를 통하여 사용할 애플리케이션 버전, 라이브러리 등의 항목을 설정할 수 있다.
  • JVM에서 실행되는 Groovy 언어를 기반으로 하기 때문에 XML과 달리 변수 선언, if, else, for 등의 로직이 구현 가능하며 간결하게 구성할 수 있다.
  • 스크립트로 작성하는 동적인 소스 파일이다.

다음은 실제 build.gradle 설정 파일의 모습이다.

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

group = 'hello'
version = '0.0.1-SNAPSHOT'
description = 'Demo project for Spring Boot'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    runtimeOnly 'com.h2database:h2'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
    developmentOnly("org.springframework.boot:spring-boot-devtools")
}

tasks.named('test') {
	useJUnitPlatform()
}

📖 Maven vs Gradle

  1. 스크립트 길이와 가독성 면에서 Gradle이 뛰어나다.
  2. 빌드와 테스트 실행 결과 Gradle이 더 빠른 경우가 많다. 이는 Gradle은 캐시를 사용하기 때문에 테스트 반복 시 차이가 더 커진다.
  3. 의존성이 늘어날수록 성능과 스크립트 품질의 차이가 심해진다.
  4. Maven은 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속 받아야하지만, Gradle은 설정 주입 방식을 사용하므로 멀티 프로젝트에 적합하다.

0개의 댓글