꾸준한 개발일기

Spring:: 메이븐(Maven)과 그래들(Gradle)의 개념 설명 및 비교하기 본문

Programing/스프링

Spring:: 메이븐(Maven)과 그래들(Gradle)의 개념 설명 및 비교하기

꾸개일 2022. 9. 6. 09:05
반응형

 

 

 

메이븐(Maven)이란?

  • 프로젝트를 진행하면서 사용하는 수 많은 라이브러리들을 관리해주는 도구
  • 메이븐의 장점은 라이브러리들과 연관된 라이브러리까지도 모두 연동되어 관리된다는 점

즉, 메이븐은 네트워크를 통해 연관된 라이브러리까지 같이 업데이트를 해주기 때문에 사용이 편리하다.

 

POM(Project Object Model)

Maven의 기능을 이용하기 위해 pom이 사용된다.

 

pom.xml에서 주요하게 다루는 기능들은 아래와 같다.

 

  • 프로젝트 정보: 프로젝트의 이름, 라이센스 등
  • 빌드 설정: 소스, 리소스, 라이프사이클별 실행한 프로그인 등 빌드와 관련된 설정
  • 빌드 환경: 사용자 환경 별로 달라질 수 있는 프로파일 정보
  • pom 연관 정보: 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등

 

 

 

그래들(Gradle)이란?

  • 빌드, 프로젝트 구성/관리, 테스트 배포 도구
  • 스프링부트, 안드로이드에서 사용
  • 빌드 속도가 Maven에 비해 10~100배 빠름
  • JAVA, C/C++M Python 등을 지원
  • 빌드툴인 Ant Builder와 Groovy 스크립트 기반으로 만들어져 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용 가능
Groovy란?
Java 가상 머신에서 실행되는 스크립트 언어이다. Java 가상머신에서 동작하지만, Groovy는 스크립트 언어이기 때문에 소스코드를 컴파일 할 필요가 없고, 그대로 실행한다. 또한, Java와 호환되고, Java 클래스 파일을 그대로 Groovy 클래스로 사용할 수 있다. Java문법과 유사하여 빌드 처리를 관리할 수 있다는 면에서 Gradle은 Java 개발자가 사용하기에 최고의 빌드관리도구이지 않을까 싶다.

 

기존 메이븐의 경우 xml로 라이브러리를 정의·활용하고 있으나,

Gradle의 경우 별도의 빌드 스크립트를 통하여 어플리케이션 버전, 라이브러리 등의 항목을 설정할 수 있다.

 

Groovy 스크립트 언어로 구성되어 있기 때문에 xml과 달리

변수선언, if, else, for 등의 로직이 구현가능하며 간결하게 구성 가능하다.

 

 

 

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

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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>app.com</groupId>
	<artifactId>model</artifactId>
	<name>testPrj</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<java-version>1.6</java-version>
		<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	<dependencies>
		 <!-- PostgreSQL 9.4 -->

	    <dependency>
	        <groupId>org.postgresql</groupId>
	        <artifactId>postgresql</artifactId>
	        <version>42.2.20</version>
	    </dependency>
	
	    <!-- MyBatis 3.4 -->
	
	    <dependency>
	        <groupId>org.mybatis</groupId>
	        <artifactId>mybatis</artifactId>
	        <version>3.4.1</version>
	    </dependency>
	
	    <!-- MyBatis-Spring 1.3-->
	
	    <dependency>
	        <groupId>org.mybatis</groupId>
	        <artifactId>mybatis-spring</artifactId>
	        <version>1.3.0</version>
	    </dependency>
	
	    <!-- Spring-JDBC -->
	
	    <dependency>
	        <groupId>org.springframework</groupId>
	        <artifactId>spring-jdbc</artifactId>
	        <version>${org.springframework-version}</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>
		
		<!-- jackson-databind 라이브러리 추가 -->
		<dependency>
	        <groupId>com.fasterxml.jackson.core</groupId>
	        <artifactId>jackson-databind</artifactId>
	        <version>2.9.6</version>
	    </dependency>
	    <dependency>
	        <groupId>org.codehaus.jackson</groupId>
	        <artifactId>jackson-mapper-asl</artifactId>
	        <version>1.9.13</version>
	    </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>

 

build.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.jojoldu.book'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    implementation('org.springframework.boot:spring-boot-starter-data-jpa') // 스프링부트용 spring data jpa 추상화 라이브러리, 스프링 부트 버전에 맞춰 자동으로 jpa관련 라이브러리들의 버전을 관리
    // implementation('com.h2database:h2') // 인메모리 관계형 데이터베이스, 프로젝트 의존성만으로 관리 가능
    implementation('org.springframework.boot:spring-boot-starter-mustache') // 머스테치
    implementation('org.springframework.boot:spring-boot-starter-oauth2-client') // 클라이언트 입장에서 소셜 기능 구현시 필요한 의존성
    implementation('org.springframework.boot:spring-boot-starter-tomcat')
    implementation('org.springframework.session:spring-session-jdbc')
    implementation('mysql:mysql-connector-java')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
    testImplementation('org.springframework.security:spring-security-test')
}

 

  • 스크립트 길이와 가독성 면에서 gradle이 우세
  • 빌드와 테스트 실행 결과 gradle이 더 빠름
  • 의존성이 늘어날 수록 성능과 스크립트 품질의 차이가 심해짐

 

maven이 정적인 형태의 XML 기반으로 작성되어 동적인 빌드를 적용할 경우 어려움이 많다면,

gradle은 Groovy를 사용하기 때문에 동적인 빌드는 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 된다.

 

maven의 경우 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 하지만,

gradle은 설정 주입 방식을 사용하기 때문에 멀티 프로젝트에 매우 적합하다.

 

과거에는 maven을 많이 사용했었지만 요즘은 gradle로 넘어오는 추세라고 한다.

새로 배우는 입장에 maven과 gradle 둘 중 택1을 해야 한다면 gradle을 추천한다.

 

 

 

 

 

참고자료

반응형
Comments