Web/Spring

Maven(메이븐)과 Gradle(그래들) 개념, 비교

소이리 2022. 2. 3. 23:32

Spring으로 개발을 하면서 maven과 gradle 둘 다 사용을 해보고 개념을 기반하여 본격적으로 비교를 해 보았다.

 

Maven 메이븐 

개념

  • 정식명칭은 Apache Maven(아파치메이븐)이며, 아파치 사에서 배포한 오픈소스 소프트웨어이다.
  • Apache Ant 의 대안으로 등장했다. 
    Ant는 xml형식이고 빌드 스크립트가 복잡하며 외부 라이브러리 관리가 어려워 유지보수가 힘들다. 
  • 자바 프로젝트를 진행하며 필요한 라이브러리, 빌드와 배포까지 관리해 주는 시스템이다.

특징

  • 설정파일  : pom.xml 
  • 균일한 빌드 시스템(스크립트)을 제공한다. (POM)
  • 쉽게 의존성 관리를 할 수 있다. (dependency)
  • 플러그인이 다양하다. 
  • 멀티 프로젝트에 적용 시, 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야만 한다.
  • 프로젝트에 필요한 라이브러리가 늘어나면 빌드 스크립트가 길어지고 가독성이 떨어진다.  

POM 이란 Project Object Model 을 의미하는 프로젝트 개체 모델이다.

프로젝트 내 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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.main</groupId> <!-- 프로젝트 조직ID -->
	<artifactId>hello</artifactId>  <!-- 프로젝트 식별ID -->
	<name>projectsname</name>
	<packaging>war</packaging> <!-- 배포형식 -->
	<version>1.0.0-BUILD-SNAPSHOT</version>	
	<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>4.3.14.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
    
      <!-- 라이브러리추가 부분. dependecy태그로 감싼 형태 -->
	<dependencies>
		<dependency>
			<groupId>net.sf.sociaal</groupId>
			<artifactId>xmlpull-xpp3</artifactId>
			<version>3.0.0.20130526</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

 

maven 라이브러리를 관리하는 사이트가 있다. 이곳에서 필요한 라이브러리를 찾아 추가(의존성주입) 해준다.

https://mvnrepository.com/

 

Gradle 그래들

개념

  • maven과 ant의 장점을 조합하여 Groovy 언어를 활용한 빌드 시스템
  • 안드로이드 스튜디오의 공식 빌드 시스템

특징

  • 설정파일 :  build.gradle
  • Java, C, C++, Python, Scala, kotlin 등을 지원함
  • 캐싱을 하기 때문에 빌드 속도가 maven에 비해 훨씬 빠르다.
  • 상속을 하지 않고 설정 주입 방식을 사용하므로 멀티프로젝트 빌드가 훨씬 수월하다.

Groovy 란?

  • Java 가상머신에서 실행되는 스크립트 언어
  • 소스 컴파일 할 필요 없고 소스코드 그대로 실행된다.
  • Java 클래스 파일을 Groovy 클래스 파일로 활용할 수 있다. 
  • Groovy 를 Java의 방언이라고 생각하는 의견도 있을 정도로 Java와 문법적으로 유사하다.
  • 정적인 xml과 달리 변수선언, if, else, for 등을 통해 동적인 로직을 구성할 수 있다.

build.gradle 기본예시

plugins {
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
	//라이브러리 적용
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}

test {
    useJUnitPlatform()
}

1세대인 ant에 비하면 분명 maven도 빌드관리가 편한 것은 사실이다.

gradle 을 사용하면 코드 자체도 훨씬 간단하고 짧은데, 캐시까지 사용하기 때문에 maven과 실행속도 면에서 차이가 크다. 이 부분은 프로젝트 규모가 커질수록 더 크게 체감될 것이다.

무엇보다 java와 호환성도 좋고 컴파일도 없으니 사용하지 않을 이유는 없지않을까 싶다!  

 

 

References

https://maven.apache.org/what-is-maven.html

https://docs.gradle.org/current/userguide/what_is_gradle.html

https://www.javatpoint.com/gradle-build

https://www.javatpoint.com/gradle-vs-maven

https://dawoonjeong.com/spring-maven-vs-gradle/