프리 정보 컨텐츠

그래들(Gradle)과 메이븐(Maven) 개념과 차이점 본문

JAVA/Spring

그래들(Gradle)과 메이븐(Maven) 개념과 차이점

쏜스 2021. 7. 2. 00:58

스프링과 스프링부트를 통해서 프로젝트를 하던 경험 중 메이븐, 그래들로 각각의 프로젝트를 했던 경험이 있는데 자세한 개념없이 절차에 의해서만 했던 경험이 있기에 간단한 정리를 통해 알아보겠습니다.

메이븐(Maven)이란??

아파치 메이븐

메이븐은 아파치 메이븐(Apache Maven)이라 불리는 자바용 프로젝트 관리 도구이다.

그래들과 메이븐은 빌드 관리 도구라고 일컫으며, 프로젝트내에 작성한 java코드와 xml, properties, jar파일들을

JVM이나 WAS가 인식할 수 있도록 해주는 빌드 과정이라 말할 수 있다.

즉, 프로젝트 생성, 테스트 빌드, 배포 및 외부 라이브러리를 간편한 설정을 통해 설정하고 도와주는 도구이다.


그래들(Gradle)이란??

그래들

그래들은 그루비를 이용한 빌드 자동화 시스템이며 메이븐과 같은 빌드 관리 도구로써 현재는 안드로이드 앱을 만드는데 필요한 안드로이드 스튜디오의 공식 빌드 시스템이기도 하다. Maven은 java만 지원하는 반면, Gradle은 Java, C/C++, Python등 다양한 언어를 지원한다.


둘의 차이점은 무엇이며 어떻게 사용하는건가요??

개인적으로 두 가지 빌드 관리 도구를 사용하며 느낀점은 메이븐보다 그래들의 사용방식과 코드가 가독성이 좋고 간결하다는 장점이 있었다. 추가적으로 구글링을 통해서 알아봤을 때는 그래들이 아래와 같은 장점들을 가지고 있었다.

  • 그래들은 메이븐보다 속도가 10~100배가량 빠르다.
  • 그래들이 가독성이 좋다
  • 그래들은 의존관계가 복잡한 프로젝트 설정에 용이하다.(규모가 큰 프로젝트에 적합하다)
  • 그래들은 concurrent에 안전한 캐시를 허용한다.

구글링을 통해 정리하다보니 그래들이 최신에 나온 기술답게 메이븐에 비해 많은 장점을 가지고 있었다. 하지만 아직 여러 기업에서는 익숙함 때문에 Maven을 사용하거나 Gradle을 사용하기에 모든 팀원이 Groovy문법을 익혀야하기에 아직까지 Maven을 선호하는 기업도 있다는 사실을 알 수 있다.

그래들과 메이븐 구글 트랜드

구글 트랜드에서도 볼 수 있듯이 처음에는 Maven이 월등히 높은 선호도를 가지고 있으나 점차 시간이 갈수록 Gradle도 사용하고 있다는 사실을 알 수 있다. 후에는 Gradle을 사용하는 기술이 많아질 것 같으니 Gradle 사용법을 잘 익혀보도로하자.

Gradle, Maven 사용방법??

Maven 코드 예제

<?xml version="1.0" encoding="UTF-8"?>

-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0">

<modelVersion>4.0.0</modelVersion>

<groupId>com.spring</groupId>

<artifactId>ezen_work</artifactId>

<name>ezen_work</name>

<packaging>war</packaging>

<version>1.0.0-BUILD-SNAPSHOT</version>


-<properties>

<java-version>11</java-version>

<org.springframework-version>5.3.5</org.springframework-version>

<org.aspectj-version>1.6.10</org.aspectj-version>

<org.slf4j-version>1.6.6</org.slf4j-version>

</properties>


-<dependencies>


-<dependency>

<groupId>com.oracle.ojdbc</groupId>

<artifactId>ojdbc8</artifactId>

<version>19.3.0.0</version>

</dependency>


-<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-jdbc</artifactId>

<version>5.3.5</version>

</dependency>


-<dependency>

<groupId>commons-dbcp</groupId>

<artifactId>commons-dbcp</artifactId>

<version>1.4</version>

</dependency>


-<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis</artifactId>

<version>3.5.6</version>

</dependency>


-<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis-spring</artifactId>

<version>2.0.6</version>

</dependency>


-<dependency>

<groupId>commons-fileupload</groupId>

<artifactId>commons-fileupload</artifactId>

<version>1.4</version>

</dependency>


-<dependency>

<groupId>commons-io</groupId>

<artifactId>commons-io</artifactId>

<version>2.8.0</version>

</dependency>

<!-- Spring -->



-<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${org.springframework-version}</version>


-<exclusions>

<!-- Exclude Commons Logging in favor of SLF4j -->



-<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>

<!-- AspectJ -->



-<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjrt</artifactId>

<version>${org.aspectj-version}</version>

</dependency>

<!-- Logging -->



-<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-api</artifactId>

<version>${org.slf4j-version}</version>

</dependency>


-<dependency>

<groupId>org.slf4j</groupId>

<artifactId>jcl-over-slf4j</artifactId>

<version>${org.slf4j-version}</version>

<scope>runtime</scope>

</dependency>


-<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-log4j12</artifactId>

<version>${org.slf4j-version}</version>

<scope>runtime</scope>

</dependency>


-<dependency>

<groupId>log4j</groupId>

<artifactId>log4j</artifactId>

<version>1.2.15</version>


-<exclusions>


-<exclusion>

<groupId>javax.mail</groupId>

<artifactId>mail</artifactId>

</exclusion>


-<exclusion>

<groupId>javax.jms</groupId>

<artifactId>jms</artifactId>

</exclusion>


-<exclusion>

<groupId>com.sun.jdmk</groupId>

<artifactId>jmxtools</artifactId>

</exclusion>


-<exclusion>

<groupId>com.sun.jmx</groupId>

<artifactId>jmxri</artifactId>

</exclusion>

</exclusions>

<scope>runtime</scope>

</dependency>

<!-- @Inject -->



-<dependency>

<groupId>javax.inject</groupId>

<artifactId>javax.inject</artifactId>

<version>1</version>

</dependency>

<!-- Servlet -->



-<dependency>

<groupId>javax.servlet</groupId>

<artifactId>servlet-api</artifactId>

<version>2.5</version>

<scope>provided</scope>

</dependency>


-<dependency>

<groupId>javax.servlet.jsp</groupId>

<artifactId>jsp-api</artifactId>

<version>2.1</version>

<scope>provided</scope>

</dependency>


-<dependency>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

<version>1.2</version>

</dependency>

<!-- Test -->



-<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.7</version>

<scope>test</scope>

</dependency>

</dependencies>


-<build>


-<plugins>


-<plugin>

<artifactId>maven-eclipse-plugin</artifactId>

<version>2.9</version>


-<configuration>


-<additionalProjectnatures>

<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>

</additionalProjectnatures>


-<additionalBuildcommands>

<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>

</additionalBuildcommands>

<downloadSources>true</downloadSources>

<downloadJavadocs>true</downloadJavadocs>

</configuration>

</plugin>


-<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>2.5.1</version>


-<configuration>

<source>1.6</source>

<target>1.6</target>

<compilerArgument>-Xlint:all</compilerArgument>

<showWarnings>true</showWarnings>

<showDeprecation>true</showDeprecation>

</configuration>

</plugin>


-<plugin>

<groupId>org.codehaus.mojo</groupId>

<artifactId>exec-maven-plugin</artifactId>

<version>1.2.1</version>


-<configuration>

<mainClass>org.test.int1.Main</mainClass>

</configuration>

</plugin>

</plugins>

</build>

</project>

Gradle코드 예제

buildscript {
    ext {
        springBootVersion = '2.1.7.RELEASE'
    }
    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies { 
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group 'com.son.book'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.projectlombok:lombok')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('com.h2database:h2')
    compile('org.springframework.boot:spring-boot-starter-mustache')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

위의 두 코드 예제는 실제 프로젝트에서 설정했던 Maven과 Gradle입니다. 

프로젝트의 덩치는 달라서 Maven이 많은 코드를 가지고있지만 설정하는 방식에서도 한 눈에 볼 수 있듯이 

Gradle의 코드가 간결하고 편리합니다.

Comments