개발/Spring
[Spring] 메이븐(Maven) vs 그래들(Gradle)
yhyuk
2021. 10. 6. 23:44
728x90
반응형
메이븐(Maven) vs 그래들(Gradle)
기존에 메이븐(Maven)은 자바를 사용한 프로젝트에서 쓰는 것 이라는 추상적으로 알고 있었는데, 규모에 따라 프로젝트에서 사용하는 메이븐 같은 관리도구가 그래들(Gradle)이라는 관리도구도 사용한다는 것을 알게되어서 직접 공부한 내용을 정리해보려 합니다.
Maven 이란?
- 아파치에서 제공하는 메이븐은 자바용 프로젝트 관리 도구 이다.
- 아파치 앤트의 불편함을 해결하고자 만들었으며, 프로젝트를 진행하면서 사용할 수 많은 라이브러리들을 관리해주는 도구이다.
Maven의 장점 및 특징
- 라이브러리들과 연관된 라이브러리까지 거미줄 처럼 다 연동 되어서 관리가 된다.
- pom.xml을 이용한 정형화된 빌드 시스템(필요한 라이브러리를 정의 해두면 알아서 네트워크를 통하여 자동으로 다운로드를 해준다.)
- 간단한 설정을 통한 배포 관리가 가능하다.
Maven의 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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo-maven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo-maven</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project
Gradle 이란?
- 그래들은 Groovy를 이용한 빌드 자동화 시스템이다.
- Groovy와 유사한 도메인 언어를 채용하였으며, 현재 안드로이드 앱을 만드는데 필요한 안드로이드 스튜디오의 공식 빌드 시스템이기도 하다.
- Java, C/C++, Python 등과 같은 여러 가지 언어를 지원한다.
Gradle의 장점 및 특징
- Maven과 Ant의 장점을 조합하여 만든 빌드 도구이다.
- *build.gradle을 이용한 정형화된 빌드 시스템이다. (*build.gradle: 메이븐의 pom.xml과 비슷한 플러그인, 의존성 추가를 위한 파일이다.)
- 멀티 프로젝트에 용이하다.
Gradle의 build.gradle 예시
buildscript {
ext {
springBootVersion = '1.5.4.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
Maven vs Gradle
Gradle이 시기적으로 늦게 나온만큼 사용성, 성능 등 비교적 뛰어난 스펙을 가지고있다.
Maven보다 Gradle이 좋은점은 아래와 같다.
- Build라는 동적인 요소를 XML로 정의하기에는 어려운 부분이 많다.
- 설정 내용이 길어지고 가독성 떨어짐
- 의존관계가 복잡한 프로젝트 설정하기에 부적절하다.
- 상속구조를 이용한 멀티 모듈 구현
- 특정 설정을 소수의 모듈에서 공유하기 위해서는 부모 프로젝트를 생성하여 상속하게 해야 함 (상속의 단점 생김)
- Gradle은 Groovy를 사용하기 때문에, 동적인 빌드는 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 된다.
- Configuration Injection 방식을 사용해서 공통 모듈을 상속해서 사용하는 단점을 커버했다.
- 설정 주입 시 프로젝트의 조건을 체크할 수 있어서 프로젝트별로 주입되는 설정을 다르게 할 수 있다.
결론
- 현재는 분명히 Maven의 점유율이 더 높고 익숙한 사람이 많은 상황이지만, Gradle의 추격이 더 빨라지고 있어서 조만간 상황이 역전될 가능성이 더 높다고 하는 사람이 많아 지고 있다.
- Gradle이 조금 더 빠른 성능과 간결한 설정의 매력을 보유하고 있어 인기도가 상승 중이며, 소규모 프로젝트에서는 큰 차이가 없어서 익숙한 Maven을 사용해도 무방하지만 규모가 커질수록 Gradle을 사용하는 것이 체감상 더욱 유리하다고 한다.
- gradle 의 빌드 스크립트는 groovy 라는 언어로 작성해야 하므로 maven 의 xml 에 비하면 친숙하진 않지만 확장성이 뛰어나다.
- maven 은 프로젝트가 커질수록 빌드 스크립트의 내용이 길어지고 가독성이 떨어지는 반면, gradle 은 훨씬 적은 양의 스크립트로 짧고 간결하게 작성할 수 있다.
- maven 의 경우 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 하지만 gradle 은 설정 주입 방식으로 이를 해결한다.
- gradle 은 멀티 프로젝트에 매우 적합하며, 빌드 속도는 다양한 시나리오 상에서 10~100배 가량이 빠르다.
reference
https://gradle.org/maven-vs-gradle/
https://mylupin.tistory.com/39#recentComments
https://okky.tistory.com/179
http://dawoonjeong.com/spring-maven-vs-gradle/
728x90
반응형