이번 포스팅에선 빌드 관리 도구(Build Tool)인 Maven과 Gradle에 대해 알아본다.
빌드란 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정 및 결과를 말한다. 쉽게 말해, 개발자가 작성한 소스코드(.java 파일)와 프로젝트에서 쓰인 각각의 파일 및 자원(.xml, .jpa, .jpg, properties)을 JVM이나, 톰캣 같은 WAS가 인식할 수 있도록 패키징하는 과정 및 결과를 말한다.
즉, 소스코드를 컴파일 해서 바이트코드 파일로 변환하고, resource를 바이트코드 파일이 참조할 수 있는 적절한 위치로 옮기며 META-INF와 MANIFEST.MF들을 하나로 압축하는 과정을 의미한다.
빌드 관리 도구는 소스코드에서 애플리케이션을 생성할 때 여러가지 외부 라이브러리들을 사용하는데, 빌드 관리 도구는 사용자가 관리할 필요 없이 필요한 라이브러리들을 자동으로 관리해준다.
빌드 관리 도구는 다음과 같은 작업을 수행한다.
1. 종속성 다운로드: 전처리(Preprocessing)
2. 소스코드를 바이너리 코드로 컴파일(Compile)
3. 바이너리 코드를 패키징(Packaging)
4. 테스트 실행(Testing)
5. 프로덕션 시스템에 배포(Distribution)
대규모 프로젝트에서 빌드 프로세스를 수동으로 호출하는 것은 비효율적이다. 무엇을 빌드할지, 어떤 순서로 할지, 어떤 의존성을 가지는지 모두 추적하는 건 쉽지 않기 때문이다. 빌드 관리 도구를 사용하면 이를 일관되게 할 수 있다.
빌드 툴에는 Ant, Maven, Gradle 등이 있다.
LifeCycle 관리 도구이기 때문에, 정해진 LifeCycle에 의하여 작업을 수행하며, 전반적인 프로젝트 관리 기능을 포함하고 있다.
필요한 라이브러리들을 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>
다음은 실제 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()
}