[F-Lab 모각코 챌린지] 36일차 - Maven vs Gradle
F-Lab 모각코 챌린지 36일차 학습 기록 Maven 과 Gradle 의 공통점과 차이를 알아보고 기록 하였다
![[F-Lab 모각코 챌린지] 36일차 - Maven vs Gradle](/content/images/size/w1200/2023/07/---_---_---.png)
같은점
두 도구는 모두 프로젝트의 빌드, 패키징, 종속성 관리를 도와주는 도구이다
둘은 공통적인 기능이 존재한다
- 빌드 자동화
개발자가 반복적인 작업을 수행하지 않도록 빌드 자동화를 지원한다 - 종속성 관리
중앙 레포지토리에서 종속성을 다운로드 하고 프로젝트에 추가하는 기능을 제공한다 - 다중 프로젝트 지원
프로젝트를 여러 모듈로 구성할 수 있다.
각 모듈은 서로 다른 종속성을 가질 수 있고 설정을 상세히 관리할 수 있다 - 플러그인 확장성
플러그인 시스템을 통해 기능 확장을 간편하게 할 수 있다. - 멀티 플랫폼 지원
JVM 기반의 언어 및 다른 언어를 사용하는 프로젝트에서도 사용 할 수 있다
Maven
![](https://blog.pollra.com/content/images/2023/07/image.png)
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년) 부터 캐싱을 지원했으니 말 다했지않은가..