Spring boot 프로젝트를 Gradle 과 Maven 모두 진행해봤는데 딱히 선택한 기준은 없었다.
Gradle 이 더 빠르고 권장한다는 얘기만 들었지, 왜인지는 생각해보지 않아서 정리해보려한다.
Maven과 Gradle 정의
Maven 이란 ?
Java 개발에 사용되는 프로젝트 관리 빌드 도구로, Apache Software Foundation에서 호스팅하는 Maven은 Jakarta 프로젝트의 일부로 시작됨.
Gradle 이란 ?
Gradle은 그루비를 이용한 빌드 자동화 시스템으로, 거의 모든 유형의 소프트웨어를 빌드할 수 있을 만큼 유연한 오픈 소스 빌드 자동화 도구.
라이브러리 관리
그래서 Maven 장점이 뭐가 있을까 찾아보니 가장 중복되는 내용이 '편리한 의존성 라이브러리 관리' 였다.
그렇다면, Gradle은 불편한가에 대한 고민이 생겼다.
Maven은 XML이라 너무 길어서 하나의 dependency 에 대해서만 비교해봤다.
maven은 <scope></scope> 로, gradle 은 implementation 등으로 해당 dependency가 포함되는 범위를 나타내는데 그 구조에 대해서는 따로 정리할 예정이다.
Gradle 사이트의 Maven과 Gradle을 비교하는 내용에서, Dependency Management 문단을 보자.
두 빌드 시스템 모두 리포지토리에서 종속성을 해결하는 기본 제공 기능을 제공하며 둘 다 종속성을 로컬로 캐시하고 병렬로 다운로드할 수 있다.
또한 Maven은 버전별로만 종속성을 재정의할 수 있는데,
Gradle은 한 번의 선언으로 프로젝트 전체에서 원하지 않는 종속성을 처리할 수 있는 사용자 정의 가능한 종속성 선택 및 대체 규칙을 제공한다.
이런 경우를 겪어본 적이 없어 솔직히 무슨 말 하는 지 잘 모르겠다.
프로젝트를 진행 및 적용하면서 다시 봐야 할 내용이다.
성능 비교
아래 내용은, Gradle에서 제공 하는 테스트 시나리오 및 결과이다.
모델 : 마이크로서비스와 유사한 10개의 모듈 다중 프로젝트 빌드에 대한 일반적인 작업으로, 각 하위 프로젝트에는 50개의 소스 파일과 50개의 테스트 소스 파일이 있다.
결론 : Gradle은 클린 빌드의 경우 2~3배, 증분 변경의 경우 약 7배, Gradle 작업 출력이 캐시되는 경우 최대 14배 빠르다.
( 다른 시나리오를 살펴봐도 Gradle이 더 빠르다는 결론이다. )
Gradle이 더 빠른 이유
Gradle이 Maven보다 빠른 이유 3가지는 아래와 같다.
1. Incrementality
- Gradle은 증분 빌드를 제공하여 필요에 따라 작업이 실행되므로 빌드 시간이 단축된다.
2. Build Cache
- Gradle 작업의 출력을 로컬에서 재사용하고 컴퓨터 간에 작업 출력을 공유함으로써, 대부분 평균 빌드 시간이 단축된다.
3. Gradle Daemon
- Daemo은 빌드를 실행하는 데 걸리는 시간을 줄이는 백그라운드 프로세스로, Gradle의 초기화 (시작) 시간을 줄인다.
**최근 올라온 글을 보면 Maven 역시 Maven Build Cache Extension 으로 증분 빌드를 제공한다고 한다.
정리
개인적으로 Maven은 XML 태그로 작성되어있어 dependency 가 늘어남에 따라 가독성이 떨어진다는 점에서 나는 Gradle을 쓰는 것이 더 좋지않을까 생각한다.
또한, 성능상의 이점을 확인해보기 위해 좀 귀찮겠지만 직접 서비스를 만들어 테스트해보는 것도 좋을 것 같다.
차이가 날 정도의 규모를 잘 가늠해봐야겠다.
참고
https://www.techtarget.com/searchapparchitecture/definition/Maven
https://maven.apache.org/maven-features.html
https://gradle.org/maven-vs-gradle/
https://www.mortega.dev/posts/exploring-maven-build-cache-extension/
'Web' 카테고리의 다른 글
[Spring] Exception Handling 에 대해서 (3) | 2023.07.03 |
---|---|
[Spring] @Builder 와 Builder 패턴 (0) | 2023.06.25 |
[Spring] @Email 과 이메일 정규식 표현 (0) | 2023.06.24 |
[Spring] HikariCP 와 Pool Size에 대해서 (0) | 2023.06.18 |
[Spring] Spring Security 로 CSRF 처리하기 (0) | 2023.06.15 |