본문 바로가기
ETC

Gradle vs Maven

by 배털 2022. 3. 31.

제 글에 문제가 있다면 댓글로 알려주시면 감사하겠습니다! 🙇‍♂️

 

Gradle과 Maven은 모두 빌드 관리 도구이다.

빌드 관리 도구란?

우리가 작성한 Java 코드와 프로젝트 내에 필요한 각종 설정 파일(xml, properties, jar, yml etc...)들을

JVM이나 WAS가 인식할 수 있도록 패키징 해주는 도구를 말한다.

빌드는 코드를 사용 or 실행 가능한 형태로 컴파일링, 링킹, 패키징 하는 것을 포함하며

프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램이라 할 수 있다.

애플리케이션을 개발하면서 개발에 필요한 외부 라이브러리들을 다운로드하고,

또한 모든 라이브러리들을 번거롭게 모두 다운로드 받을 필요 없이, 빌드 도구 설정 파일에 필요한 라이브러리 종류와 버전들,

종속성 정보를 명시하여 필요한 라이브러리들을 설정 파일을 통해 자동으로 다운로드 해주고

이를 간편히 관리해주는 도구이다.

 

Gradle

프로젝트 빌드 관리 툴이며 오픈소스이다.

Groovy 언어를 사용한 Domain-specific-language(도메인 특화 언어)를 사용하며

build.gradle 파일에 명시한다.
(설정 파일을 xml파일을 사용하는 Maven보다 코드가 훨씬 간결하다.)

2007년에 처음 개발되었고, 2013년에 구글에 의해 안드로이드 프로젝트의 빌드 시스템으로 채택되었다.

(안드로이드는 gradle이 기본값)

꽤 큰 규모로 예상되는 multi-project 빌드를 도울 수 있도록 디자인되었다.

Gradle은 프로젝트의 어느 부분이 업데이트 되었는지 알기 때문에, 빌드에 점진적으로 추가할 수 있다.

업데이트가 이미 반영된 빌드의 부분은 더 이상 재실행되지 않는다.

(따라서 빌드 시간이 훨씬 단축된다.)

 

Gradle 코드 예시
implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // data jpa

 

Maven

Java용 프로젝트 관리 도구로 Apache의 Ant 대안으로 만들어졌다.

빌드 중인 프로젝트, 빌드 순서, 다양한 외부 라이브러리 종속성 관계를 pom.xml파일에 명시한다.

Maven은 외부 저장소에서 필요한 라이브러리와 플러그인들을 다운로드 한 다음, 로컬 시스템의 캐시에 모두 저장한다.

 

Maven 코드 예시
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.4.RELEASE</version>
</dependency>

 

Gradle vs Maven

두 시스템이 빌드에 접근하는 방식에는 몇 가지 근본적인 차이점이 있다.

 

Gradle은 작업 의존성 그래프를 기반으로 하는 반면

Maven은 고정적이고 선형적인 단계의 모델을 기반으로 한다.

 

성능 측면에서는 둘 다 다중 모듈 빌드를 병렬로 실행할 수 있지만,

Gradle은 어떤 task가 업데이트 되었고 안되었는지를 체크하기 때문에 incremental build를 허용한다.

(증분 빌드, clean build가 아닌 변경된 곳만 빌드)

이미 업데이트된 task에 대해서는 작업이 실행되지 않으므로 빌드 시간이 훨씬 단축된다.

 

Maven의 경우 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 하지만 Gradle은 설정 주입 방식을 제공한다.

 

또한 Gradle은 concurrent에 안전한 캐시를 허용한다.

2개 이상의 프로젝트에서 동일한 캐시를 사용할 경우, 서로 overwrite 되지 않도록 checksum 기반의 캐시를 사용하고, 

캐시를 repository와 동기화시킬 수 있다.

 

고도로 사용자 정의된 빌드를 작성하기 위해서는 커스터마이징이 간편한 Gradle을 사용하는게 훨씬 낫다.

Maven은 코드가 너무 난잡할뿐더러 한눈에 보이지도 않는 것 같다.

속도나 캐시 사용 안정성에 대해서도 당연히 Gradle을 사용하는게 이득인 것 같다.

 

Maven으로 설정된 프로젝트는 Gradle로 마이그레이션 할 수 있다고 하니

자신의 프로젝트가 Maven이라면 이참에 Gradle로 마이그레이션 해보고 Gradle의 편함을 경험해봤으면 한다.

Maven의 사용 예시들을 보니 Gradle의 편리함이 더 확 와닿았기 때문에...

 

빌드 명령어

Gradle 빌드에 관한 명령어
./gradlew clean       // build 패키지를 제거하여 빌드를 하지 않은 상태로 만든다
./gradlew build       // 일반적인 gradle build (변경된 사항만 build)
./gradlew clean build // clean 하게 build하며 jar file 생성

 

gradlew로 명령어를 입력하면 사용자가 프로젝트를 만든 사람과 동일한 버전으로 빌드를 할 수 있으며,
심지어 gradle이 설치되지 않아도 빌드가 가능하다.
gradlew가 아닌 gradle로 명령어를 실행하고 싶다면 gradle이 설치되어있는 환경이어야 한다.

 

Maven 설정 정보를 기반으로 JAR file로 빌드하기 위해선 아래와 같은 Maven 명령어를 실행해야 한다.
mvn package

댓글