Maven과 Gradle의 차이점
빌드
빌드는 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정과 결과를 말합니다. 즉 우리가 작성한 소스코드, 프로젝트에서 쓰인 각각의 파일 및 자원을 JVM
이나 Tomcat
같은 WAS
가 인식할 수 있도록 패키징하는 과정 및 결과물을 말합니다. 이를 쉽게 생각하면 빌드는 프로그램을 실행 가능한 배포 파일을 만들어 내는 것이라고 생각하면 될 것 같습니다.
예를 들어서, Java Project
를 진행하면 개발자가 작성한 A.java
와 여러 가지 정적 파일 등에 해당하는 resource
가 존재합니다.
빌드를 한다면 소스코드를 컴파일해서 .class
로 변환하고 resource
를 .class
가 참조할 수 있는 적절한 위치로 옮기고 META-INF
와 MANIFEST.MF
들을 하나로 압축하는 과정을 의미합니다.
빌드 관리 도구
빌드 도구란 빌드 과정을 자동화해주는 소프트웨어입니다.
빌드 도구란, 소스코드에서 애플리케이션을 생성하면서 여러가지 외부 라이브러리를 사용하는데, 빌드 관리 도구는 사용자가 관리할 필요 없이 필요한 라이브러리들을 자동으로 관리합니다.
모든 의존 라이브러리(jar 파일)을 다운로드해 컴파일하고, 테스트하고, 패키징 하여 배포까지 다동으로 처리할 수 있었습니다.
빌드 관리 도구는 아래와 같은 작업을 하게 됩니다.
- 종속성 다운로드 - 전처리
(Preprocessing)
- 소스코드를 바이너리 코드로 컴파일
(Compile)
- 바이너리 코드를 패키징
(Packaging)
- 테스트 실행
(Testing)
- 프로덕션 시스템에 배포
(distribution)
빌드 툴로는 Ant
, Maven
, Gradle
이 있습니다.
Maven의 정의
Maven
은 Java
전용 프로젝트 관리 도구로, Lifecycle 관리 목적 빌드 도구이며, Apache Ant
의 대안으로 만들어졌으며 아파치 라이센스로 배포되는 오픈 소스 소프트웨어입니다. Ant
의 단점을 보완해서 외부 라이브러리를 자동으로 관리해줍니다.
Maven이 등장하기 전에는
자바 프로젝트는 수많은 외부 라이브러리를 사용합니다. 이러한 jar
파일 형태의 라이브러리를 예전에는 수동으로 다운로드해서 프로젝트 폴더에 두고 관리하지만, 버전이 변경되면 다시 다운로드해야 하는 등 관리가 불편해졌습니다.
Maven
이 등장하기 전 Ant
라는 빌드 도구를 사용했는데, Ant
는 빌드에 필요한 외부 라이브러리를 관리해 주지 않았습니다.
Maven의 특징
Maven
의 가장 큰 특징은 Lifecycle
관리 도구로, 정해진 Lifecycle
에 의하여 작업을 수행하며, 전반적인 프로젝트 관리 기능을 포함하고 있다.
clean - validate - compile - test - package - verify - install - site - deploy의 라이프 사이클을 가진다.
-
clean
: 빌드 시 생성되어 있었던 파일들을 삭제한다.mvn clean
-
validate
: 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인한다.mvn validate
-
compile
: 프로젝트 소스코드를 컴파일 하는 단계mvn compile
-
test
: 단위 테스트를 수행하는 단계. 테스트 실패 시 빌드 실패로 처리하며, 스킵이 가능하다.mvn test
-
package
: 실제 컴파일된 소스 코드와 리소스들을 jar, war 등의 파일의 배포를 위한 패키지로 만든다.mvn package
-
verify
: 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인한다.mvn verify
-
deploy
: 만들어진 package를 원격 저장소에 release하는 단계mvn deploy
Maven
의 두번째 특징은 필요한 라이브러리를 pom.xml
에 정의하는 것입니다. 이를 프로젝트 모델링이라고 합니다.
pom
은Project Object Model
의 약자로, 프로젝트 정보(프로젝트 이름, 라이센스), 빌드 설정(소스, 리소스, 라이프 사이클 별 실행한 plugin 등 빌드 관련 설정), 빌드 환경(사용자 환경 별로 달라질 수 있는 프로필 정보), pom 연관 정보(의존 프로젝트, 모듈, 상위 프로젝트 등)을 담고 있다.
Apache Ant vs Maven
Apache Ant
는 비교적 자유도가 높은 편이고, Maven
은 정해진 라이프사이클에 의하여 작업을 수행하며, 전반적인 프로젝트 관리 기능까지 포함하는 차이점이 있다. (Maven은 Build Tool + Project Management)
Gradle
Maven
을 대체할 수 있는 프로젝트 구성 관리 및 범용 빌드 툴이며,Ant builder
와Groovy script
를 기반으로 구축되어 기존Ant
의 역할과 배포 스크립의 기능을 모두 사용가능하며 스프링부트와 안드로이드에서 사용합니다.
빌드 속도가 Maven
에 비해 10~100배 가량 빠르며, Java, C/C++, Python 등을 지원한다.
Groovy
Groovy
는JVM
에서 실행되는 스크립트 언어이다.JVM
에서 동작하지만 소스코드를 컴파일할 필요 없다.Java
와 호환되며,Java class file
들을Groovy class
로 사용 가능하다.Java
문법과 유사하여 빌드 처리를 관리할 수 있다.
Gradle 특징
- 코딩에 의한 간결한 정의가 가능하므로 가독성이 좋습니다.
- 설정 주입 방식을 사용하므로 재사용에 용이합니다.
- Build Script를 Groovy 기반의 DSL(Domail Specific language)를 사용하여 코드로서 설정 정보를 구성하므로 구조적인 장점이 있습니다.
- Gradle 설치 없이 Gradle wrapper를 이용하여 빌드를 지원합니다.
- Gradle은 멀티 프로젝트 빌드를 지원하기 위해 설계된 빌드 관리 도구입니다.
- Maven을 완전 지원합니다.
Maven vs Gradle
- 스크립트 길이와 가독성 면에서 gradle이 우세합니다 - gradle 승
- 빌드와 테스트 실행 결과 Gradle이 더 빠릅니다. - gradle 승
gradle
은 캐시를 사용하므로 테스트 반복 시 실행 결과 시간의 차이가 더 커집니다.
- 의존성이 늘어날 수록 스크립트 품질의 차이가 커진다. - gradle 승
Maven
은 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야하지만,gradle
은 설정 주입 방식을 사용하므로 멀티 프로젝트에 더 적합합니다.
우리 Maven 놀리지 마세요. 이런 아이에요.
Maven
은 단순하고 일관된 빌드 생명 주기를 제공하며, 표준화된 프로젝트 관리에 뛰어나기 때문에 간단한 프로젝트나 명확한 구조와 표준화가 요구되는 프로젝트에 적합합니다.
하지만! 성능 최적화가 필요하거나 복잡한 빌드 프로세스를 관리해야 하는 경우에는 Gradle
을 사용하는 것이 더 나은 선택일 수 있습니다. 하지만 아직까지 오래된 회사들은 Maven
을 많이 사용합니다. 주의해주세요