[F-Lab 모각코 챌린지] 36일차 - Maven vs Gradle

F-Lab 모각코 챌린지 36일차 학습 기록 Maven 과 Gradle 의 공통점과 차이를 알아보고 기록 하였다

[F-Lab 모각코 챌린지] 36일차 - Maven vs Gradle

같은점

두 도구는 모두 프로젝트의 빌드, 패키징, 종속성 관리를 도와주는 도구이다

둘은 공통적인 기능이 존재한다

  • 빌드 자동화
    개발자가 반복적인 작업을 수행하지 않도록 빌드 자동화를 지원한다
  • 종속성 관리
    중앙 레포지토리에서 종속성을 다운로드 하고 프로젝트에 추가하는 기능을 제공한다
  • 다중 프로젝트 지원
    프로젝트를 여러 모듈로 구성할 수 있다.
    각 모듈은 서로 다른 종속성을 가질 수 있고 설정을 상세히 관리할 수 있다
  • 플러그인 확장성
    플러그인 시스템을 통해 기능 확장을 간편하게 할 수 있다.
  • 멀티 플랫폼 지원
    JVM 기반의 언어 및 다른 언어를 사용하는 프로젝트에서도 사용 할 수 있다

Maven

https://maven.apache.org/ref/3.9.3/

Maven 은 빌드, 종속성 관리, 문서 작성, 배포 등의 자동화를 지원하는 개발 관리 도구이다

  • Apache Software Foundation 에서 개발된 오픈 소스 빌드 도구
  • XML 기반 설정을 이용하여 프로젝트를 관리
  • 빌드 라이프사이클을 중심으로 프로젝트를 구성하며 미리 정의된 빌드 단계를 수행
  • 중앙 저장소에서 종속성을 다운로드 하고 관리
  • 다양한 플러그인을 사용하여 작업을 자동화 할 수 있다

Maven lifecycle

라이프사이클 단계 설명
validate 프로젝트의 유효성 검증
initialize 빌드 작업을 위한 초기화 수행
generate-sources 소스 코드 생성
process-sources 소스 코드를 처리하고 컴파일
generate-resources 리소스 파일을 생성
process-resources 리소스 파일 처리
compile 소스 코드 컴파일
process-classes 컴파일된 클래스 파일 처리
generate-test-sources 테스트용 소스 코드 생성
process-test-sources 테스트용 소스 코드 처리 후 컴파일
generate-test-resources 테스트용 리소스 파일 생성
process-test-resources 테스트용 리소스 파일 처리
test-compile 테스트용 소스 코드 컴파일
process-test-classes 컴파일된 테스트 클래스 파일 처리
test 단위 테스트 실행
prepare-package 패키징 작업 준비
package 프로젝트 패키징
pre-integration-test 통합 테스트 전에 수행할 작업 정의
integration-test 통합 테스트 실행
post-integration-test 통합 테스트 이후에 수행할 작업 정의
verify 빌드 검증
install 빌드 결과를 로컬 저장소에 설치
deploy 빌드 결과를 원격 저장소에 배포

Gradle

Gradle 은 Apache Ant 와 Apache Maven 의 단점을 극복하고 개발자들에게 더 유연하고 강력한 빌드 도구를 제공하기 위해 만들어졌다

  • 높은 성능 (High performance)
    입력 혹은 출력이 수정되어 작업이 수행되어야 할 경우에만 작업을 실행함으로써 불필요한 작업을 피한다
    Gradle 은 다양한 캐시를 사용하여 이전 빌드의 결과를 재사용한다
    공유 빌드 캐시를 사용하면 다른 머신의 출력을 재사용 할 수도 있다
  • JVM 기반 (JVM foundation)
    Gradle 은 JVM 에서 실행되며 빌드 로직은 Java API 를 사용할 수 있다.
  • 컨벤션 (Conventions)
    Gradle 은 일종의 컨벤션을 통해 프로젝트를 쉽게 빌드 할 수 있도록 도와주며, 플러그인을 통해 빌드 스크립트를 최소화 할 수 있다
  • 확장성 (Extensibility)
    사용자 정의 빌드 로직이 필요한 경우 플러그인을 개발하여 빌드 로직을 추가할 수 있다
  • IDE 지원 (IDE support)
    여러 IDE 를 공식적으로 지원하며 사용이 간편하다
  • 인사이트 (Insight)
    빌드에 대한 상세한 정보를 제공한다
    Build scan 을 사용하여 빌드 성능 문제 파악, 디버깅 요청을 위해 정보를 공유 할 수도 있다

마무리

공식 문서에 대한 차이도 너무 심하고 성능 차이까지 명확하다

최근 업데이트 에서는 더 많은 Maven 빌드를 변환할 수 있는 옵션까지 제공하는 것을 보면 Maven 은 점점 새로운 프로젝트에 적용되기는 힘들어보인다

반면에 Maven 은 하위 호환성 문제를 해결하기 위한 옵션들의 업데이트가 이루어지고 있다. 20년에 3.6.0 에서 성능에 대한 업데이트가 이루어져서 이제 캐싱을 태운다는 것 같지만 Gradle 을 따라오기엔 멀어보인다.

Gradle 은 4.0 부터 병렬 처리를 지원하고 3.5(2017년) 부터 캐싱을 지원했으니 말 다했지않은가..