본문 바로가기

Backend Study/Server

[Server] Maven과 Gradle의 차이

1. Maven이란? 

개발 프로젝트를 진행하면 많은 라이브러리를 사용하게 되는데, 이를 일일이 관리하는 것은 매우 어려운 일이다. Maven은 이러한 문제를 해결해주는 도구라고 생각하면 된다. 라이브러리도 해당 라이브러리 기능을 수행하기 위해 또 다른 라이브러리를 필요로 하기도 하는데, 이런것 까지 모두 고려하여 관리해주고, 네트워크를 통해 자동으로 다운받아주는 역할을 한다.

 

 

실행을 위해 여러가지 단계를 거치는데 이를 Lifecycle이라고한다. 

아마 많이 본 용어일 것이다. 빌드 단계라고 보면 된다. 

- Clean: 이전 빌드에서 생성된 파일들을 삭제하는 단계

- Validate: 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계

- Compile: 프로젝트의 소스코드를 컴파일하는 단계 

- Test: 유닛 테스트를 수행하는 단계 

- Package: 실제 컴파일된 소스 코드와 리소스들을 jar등의 배포를 위한 패키지로 만드는 단계

- verify: 통합테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인하는 단계

- Install: 패키지를 로컬 저장소에 설치하는 단계

- Site: 프로젝트 문서를 생성하는 단계

- Deploy: 만들어진 Package를 원격 저장소에 release하는 단계 

 

1-1 ) POM (pom.xml) 이란? 

pom은 Project Object Model의 약자로 프로젝트의 정보를 담고있는 파일이다. 이 파일에서 주요하게 다루는 기능들이다.

- 프로젝트 정보: 프로젝트의이름, 개발자 목록, 라이센스 등

- 빌드 설정: 소스, 리소스, 라이프 사이클 별 실행한 플러그인 등

- 빌드 환경: 사용자 환경 별로 달라질 수 있는 프로파일 정보

- POM 연관 정보: 의존 프로젝트, 상위 프로젝트 등 

 

ex.

 

<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.blidkaga.group</groupId>
    <artifactId>group-test</artifactId>
    <name>test</name>
    <packaging>war</packaging>
    <version>1.0.0-SNAPSHOT</version>
</project>
<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>
    <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>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${org.springframework-version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${org.springframework-version}</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

 

참고) https://wikidocs.net/18340

 

2. Gradle이란? 

Gradle이란 기본적으로 빌드 배포 도구이며, 안드로이드 앱의 공식 빌드 시스템이다. JAVA, C/C++, Python 등을 지원하고 있다.  

메이븐은 XML로 라이브러리를 정의하고 활용하도록 되어 있으나, Gradle의 경우 별도의 빌드 스크립트를 통하여 사용할 어플리케이션의 버전, 라이브러리 등의 항목을 설정할 수 있다. 

 

2-1 ) POM (pom.xml) 이란? 

 

ex. 

 

plugins {
	id 'org.springframework.boot' version '2.7.5'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
	id 'java'
	id 'war'
}

war {
	baseName("elasticsearch-api")
}

group = 'com.tree'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	
}

tasks.named('test') {
	useJUnitPlatform()
}

bootWar.enabled = false
war.enabled = true
jar.enabled = false

 

 

2-2 )  장점

- 빌드 속도가 Maven에 비해서 10 ~ 100배 빠르다.

- Groovy 스크립트 언어로 구성되어 있기에 XML과 달리 변수 선언, if, else, for 등이 로직이 구현 가능하고 훨씬 간결하다. 

- maven의 경우 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야하지만, gradle은 설정 주입 방식을 사용하기 때문에 멀티 프로젝트에 매우 적합하다. 

 

참고) https://juntcom.tistory.com/137

https://dev-coco.tistory.com/65