기술블로그

빌드 관리 도구 Maven 과 Gradle 비교 본문

Spring/Spring 개념 및 핵심

빌드 관리 도구 Maven 과 Gradle 비교

hc_Jo 2021. 9. 2. 20:19

서론

Spring 에서 초기에 프로젝트를 생성할 때, 빌드 도구를 Maven으로 선택할지, Gradle로 선택할지에 대한 결정이 필요하다. 

https://start.spring.io/ 에서 초기화면

 

Spring 을 처음 접할 때 Maven으로 접하여 쭉 사용해왔다. 우아한형제들 개발 팀장이신 김영한님의 강의를 접하고 나서는 Gradle로 사용하고 있다. (요즘은 대부분 Gradle 사용을 권장한다고 하신다.)

 

빌드 관리 도구란?

빌드란 소스코드 파일들을 컴퓨터에서 실행할 수 있는 소프트웨어로 변환하는 일련의 과정으로, 컴파일, 테스팅, 배포 등 모든 과정의 집합이다. 빌드 관리 도구란 이러한 빌드 과정을 자동으로 수행해주는 도구를 의미한다. 

애플리케이션을 개발하면서, 일반적으로 개발에 필요한 다양한 외부 라이브러리들을 다운로드하고, 해당 라이브러리를 사용하여 개발해야하는 상황이 많다.

이 때 각 라이브러리들을 번거롭게 모두 다운받을 필요없이, 빌드도구 설정파일에 필요한 라이브러리 종류와 버전들, 종속성 정보를 명시하여 필요한 라이브러리들을 설정파일을 통해 자동으로 다운로드 해주고 이를 간편히 관리해주는 도구이다.

Maven 이란?

프로젝트를 진행하게 되면 단순히 직접 작성한 코드만으로 개발하는 것이 아니라 많은 라이브러리들을 활용해서 개발을 하게 된다. 이 때 사용되는 라이브러리들의 수가 수십개가 훌쩍 넘어버리는 일이 발생해 수 많은 라이브러리들을 관리하는 것이 힘들어지는 경우가 종종 발생하곤 한다.

Maven은 이러한 문제를 해결해 줄수 있는 도구이다. Maven은 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데 필요한 다른 라이브러리들까지 종속적으로 관리하여 네트워크를 통해 자동으로 다운 받아준다.

Maven 사용하는 방법

https://start.spring.io/ 에서 Maven Project 로 설정하였다면, 프로젝트 최상위 디렉토리에 pom.xml 이라는 파일이 생성된다. (pom: Project Object Model)

pom.xml 은

1) 프로젝트의 전반적인 정보를 태그를 이용해 나타낸다.

2) <dependenceise> 태그를 이용해 해당 프로젝트가 의존하는 여러 가지 라이브러리를 설정한다.

3) <build> 태그를 이용해 빌드와 관련된 정보를 설정할 수 있다.

 

1) 프로젝트의 전반적인 정보를 나타내는 부분을 살펴보자.

<?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.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
	</properties>
  • <modelVersion> : maven의 pom.xml의 모델 버전이다. 여기서는 형식이 4.0.0 버전이라고 이해하면 된다.
  • <groupId> : 패키지를 나타내며 일반적으로 도메인 이름을 사용해 설정한다.
  • <version> : 프로젝트의 버전을 설정한다. 접미사로 SNAPSHOT이 붙으면 아직 개발단계라는 의미이며, Maven에서 라이브러리를 관리하는 방식이 다르다고 한다.
  • <properties> : pom.xml에서 중복해서 사용되는 설정(상수) 값들을 지정해놓는 부분. 다른 위치에서 ${...}로 표기해서 사용할 수 있다.
  • <parent> : 상속관계를 나타낸다. 앞의 이름들과 비슷한 역할을 한다.

2) 라이브러리를 설정하는 <dependencies> 태그 하위 내용 중 일부를 살펴보자.

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
  • <dependency> : 해당 프로젝트에서 의존하는 다른 라이브러리 정보를 기술한다.
  • <groupId> : 의존하는 프로젝트의 큰 틀이다.
  • <artifactId> : 의존하는 프로젝트의 각 기능이다.

3) 빌드와 관련된 정보를 설정하는  태그를 살펴보자.

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

</project>

<bulid> 태그 내에는 빌드를 할 때 사용할 플러그인 목록을 기록한다.

  • <plugin> : 어떠한 액션 하나를 담당하는 것으로 가장 중요하지만 들어가는 옵션은 제 각각이다.

가벼운 내용들을 알아보았고, 자세한 내용은 공식문서를 보면서 학습하면 된다.

 

 

이번에는 Maven 이후에 나온 Gradle에 대해 알아볼 차례이다. 

Gradle 이란?

Gradle 이란 Groovy 언어를 사용한 도메인 특화 언어(Domain-specific-language)를 사용한다. 기본적으로 빌드 배포 도구(Build Tool)이고, 안드로이드 앱을 만들때 필요한 공식 빌드시스템이기도 하며 JAVA, C/C++, Python 등을 지원한다. (설정파일을 xml파일을 사용하는 Maven보다 코드가 훨씬 간결하다.)

Maven Repository를 동일하게 사용할 수 있어서 설정된 서버를 통하여 라이브러리를 다운로드 받아 모두 동일한 의존성을 가진 환경을 수정할 수 있다.

 

Gradle이 Maven보다 좋은점

  • Build라는 동적인 요소를 XML로 정의하기에는 어려운 부분이 많다.
    • 설정 내용이 길어지고 가독성 떨어짐
    • 의존관계가 복잡한 프로젝트 설정하기에는 부적절
    • 상속구조를 이용한 멀티 모듈 구현
    • 특정 설정을 소수의 모듈에서 공유하기 위해서는 부모 프로젝트를 생성하여 상속하게 해야함 (상속의 단점 생김)
  • Gradle은 그루비를 사용하기 때문에, 동적인 빌드는 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 된다.
    • Configuration Injection 방식을 사용해서 공통 모듈을 상속해서 사용하는 단점을 커버했다.
    • 설정 주입시 프로젝트의 조건을 체크할 수 있어서 프로젝트별로 주입되는 설정을 다르게 할 수 있다.

Gradle 공식문서에서는 Gradle Enterprise가 Maven 빌드 속도를 최대 90%까지 높일 수 있다고 한다.

 

Gradle 사용하는 방법

https://start.spring.io/ 에서 Gradle Project 를 설정하였다면, 프로젝트 최상위 디렉토리에 build.gradle 이라는 파일이 생성된다. 

 

앞에서 설정한 Maven 과 같은 작업을 하는 코드이다.

plugins {
	id 'org.springframework.boot' version '2.5.4'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'demo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

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-data-jpa'
	runtimeOnly 'com.h2database:h2'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

Gradle에선 이러한 복잡하고 장황한 코드에 마법을 일으킨다. (매우 간-결-, 가독성 상승)

 


reference

https://maven.apache.org/

 

Maven – Welcome to Apache Maven

Welcome to Apache Maven Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information. If you

maven.apache.org

https://gradle.org/

 

Gradle Build Tool

Accelerate developer productivity. Gradle helps teams build, automate and deliver better software, faster.

gradle.org

https://technologyconversations.com/2014/06/18/build-tools/

http://egloos.zum.com/kwon37xi/v/4747016