Maven
- Maven은 Java용 프로젝트 관리도구로 Apache의 Ant 대안으로 만들어졌다.
- 빌드 중인 프로젝트, 빌드 순서, 다양한 외부 라이브러리 종속성 관계를 pom.xml파일에 명시한다.
- Maven은 외부저장소에서 필요한 라이브러리와 플러그인들을 다운로드 한다음, 로컬시스템의 캐시에 모두 저장한다.
- 예를 들어, "Spring Boot Data JPA Starter" 모듈을 사용하여 프로젝트를 개발하고 싶다면 메이븐레포지토리에서 해당 모듈을 검색하여 xml 설정파일에 추가하여 사용할 수 있다. (참고로 maven용 코드 이외에도 gradle용 코드도 탭에 있다.)
Gradle
- Apacahe Maven과 Apache Ant에서 볼수 있는 개념들을 사용하는 대안으로써 나온 프로젝트 빌드 관리 툴이다. (완전한 오픈소스)
- Groovy 언어를 사용한 Domain-specific-language를 사용한다. (설정파일을 xml파일을 사용하는 Maven보다 코드가 훨씬 간결하다.)
- 2007년에 처음 개발되었고, 2013년에 구글에 의해 안드로이드 프로젝트의 빌드 시스템으로 채택되었다.
- 꽤 큰규모로 예상되는 multi-project 빌드를 도울 수 있도록 디자인되었다.
- Gradle은 프로젝트의 어느부분이 업데이트되었는지 알기 때문에, 빌드에 점진적으로 추가할 수 있다.
-> 업데이트가 이미 반영된 빌드의 부분은 즉 더이상 재실행되지 않는다. (따라서 빌드 시간이 훨씬 단축될 수 있다!)
Maven VS Gradle
- 두 시스템이 빌드에 접근하는 방식에는 몇 가지 근본적인 차이점이 있다.
- Gradle은 작업 의존성 그래프를 기반으로하는 반면 Maven은 고정적이고 선형적인 단계의 모델을 기반으로한다고 한다.
- 성능 측면에서는 둘 다 다중 모듈 빌드를 병렬로 실행할 수 있지만, Gradle은 어떤 task가 업데이트되었고 안되었는지를 체크하기 때문에 incremental build를 허용한다. 이미 업데이트된 테스크에 대해서는 작업이 실행되지 않으므로 빌드 시간이 훨씬 단축된다.
-> 빌드 설정 규모가 점점 커지면 커질수록, 빌드시간의 차이도 Maven과 비교하여 꽤 격차가 벌어질 수 있을것같다.
-maven 의 경우 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 하지만 gradle 은 설정 주입 방식을 제공한다.
- 또한 Gradle은 concurrent에 안전한 캐시를 허용한다.
-> 2개 이상의 프로젝트에서 동일한 캐시를 사용할 경우, 서로 overwrite되지 않도록 checksum 기반의 캐시를 사용하고, 캐시를 repository와 동기화시킬 수 있다.
- 고도로 사용자 정의된 빌드를 작성하기 위해서는 커스터마이징이 간편한 Gradle을 사용하는게 훨씬 낫다.
아래 비교 예시 코드를 보면 확실히 와닿는느낌.
위 내용만 보면, 속도나 캐시 사용 안전성에 대하여 당연히 Gradle로 사용하는게 이득이겠다는 생각이 든다.
Maven으로 설정된 프로젝트는 Gradle로 마이그레이션 할 수 있다고 한다.
확실히 와닿지 않은 상태에서는, 아래 코드를 통해 비교해보자.
아래는 Maven 코드이다.
<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.programming.mitra</groupId>
<artifactId>java-build-tools</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
</plugin>
</plugins>
</build>
</project>
프로젝트에 기본으로 테스트 도구인 JUnit 라이브러리를 의존성 리스트에 추가하고 빌드 도구로 maven을 설정하였다.
위 메이븐 설정 정보를 기반으로 JAR file로 빌드하기 위해 위와 같이 Maven 명령어를 실행한다.
이제, Maven에서 추가한 JUnit에 몇가지 플러그인 (Maven CheckStyle, FindBugs 및 PMD)을 추가해보자.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>2.12.1</version>
<executions>
<execution>
<configuration>
<configLocation>config/checkstyle/checkstyle.xml</configLocation>
<consoleOutput>true</consoleOutput>
<failsOnError>true</failsOnError>
</configuration>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>2.5.4</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.1</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
Gradle에선 이러한 복잡하고 장황한 코드에 마법을 일으킨다. (매우 간-결-, 가독성 상승)
apply plugin:'java'
apply plugin:'checkstyle'
apply plugin:'findbugs'
apply plugin:'pmd'
version ='1.0'
repositories {
mavenCentral()
}
dependencies {
testCompile group:'junit', name:'junit', version:'4.11'
}
위의 Gradle 설정에 기반하여 빌드 task를 실행하려면 아래와 같이 gradle 명령을 사용하면 된다.
참고
[Spring] 빌드 관리 도구 Maven과 Gradle 비교하기.
spring에서 초기에 프로젝트를 생성할 때, 빌드 도구를 Maven으로 선택할지, Gradle로 선택할지에 대한 결정이 필요하다. 그냥 나는 항상 익숙한데로, 의심의 여지 없이 spring boot 프로젝트를 진행
jisooo.tistory.com
'백엔드 > 프레임워크' 카테고리의 다른 글
스프링 - 컨테이너 종류 (0) | 2023.04.24 |
---|---|
스프링 - AOP (0) | 2023.01.02 |
스프링 - @Aspect (0) | 2022.12.14 |
스프링 부트 - jar, war 차이 (0) | 2022.12.06 |
스프링 부트 - 스타터 종류 (0) | 2022.12.06 |