Maven에서 Gradle로 전환시 고려사항

겔로그·2023년 8월 12일
0
post-thumbnail

안녕하세요. 오늘은 프로젝트의 빌드 관리 도구인 Maven을 Gradle로 변경할 때 고려해야 될 내용에 대해 공유햐는 시간을 가지고자 합니다.

Maven과 Gradle은 빌드 프로세스를 단순화하기 위해 만들어진 빌드 관리 도구입니다. 우리는 이러한 빌드 관리 도구를 통해 프로젝트에 사용되는 수많은 라이브러리를 자동으로 관리하고, 빌드 및 배포를 손쉽게 진행할 수 있습니다.

현재 제가 운영하고 있는 서비스에서는 빌드 관리 도구로 Maven을 채택하여 사용하고 있습니다. 그러나 이 글을 쓰는 시점에서 서비스의 모든 빌드 도구를 Maven에서 Gradle로 전환하였습니다.

Maven과 Gradle은 동일한 빌드 관리 도구이며 동일한 역할을 수행하는데 왜 전환을 진행했을까요?

Maven 에서 Gradle로 전환한 이유 

Maven에서 Gradle로 전환하게 된 이유 중 가장 큰 배경은 multi-module빌드 및 테스트 속도에 있습니다.

현재 제가 담당하는 Email 서비스는 크게 5개의 프로젝트로 분리되어 관리되고 있습니다. 각각의 프로젝트는 각기 다른 역할을 수행하지만 Email이라는 동일한 분야를 구현한 것이기에 중복 로직이 굉장히 많았습니다. 

발송 성능 및 서비스 운영을 효과적으로 하고자 서비스 아키텍쳐를 일부 개선하는 과정에서 이러한 중복 로직이 많다는 것을 인지하고 개선 이전에 중복 로직을 최소화 해보자는 목표를 가지게 되었습니다. 여러 내용을 찾아보던 도중, 다음 글을 읽고 multi-module 도입을 확정짓게 되었습니다.

https://techblog.woowahan.com/2637/

 [멀티모듈 설계 이야기 with Spring, Gradle | 우아한형제들 기술블로그

{{item.name}} 멀티 모듈 설계 이야기 안녕하세요. 배달의민족 프론트 서버를 개발하고 있는 권용근입니다. 멀티 모듈의 개념을 처음알게 되었을 때부터 현재까지 겪었던 문제점들과 그것을 어떻게

techblog.woowahan.com](https://techblog.woowahan.com/2637/)

Maven과 Gradle은 둘 다 multi-module에 대해 지원하고 있었지만 Maven은 애초에 multi-module을 고려하여 만들어진 도구가 아니었으며 Gradle은 Maven 보다 빌드간 다양한 설정 기능을 제공하였기에 Gradle을 채택하게 되었습니다.

이 뿐만 아니라, 빌드 속도 및 테스트 속도에서도 Gradle이 압도적인 성능을 보였으며 설정시 Maven에 비해 적은 코드 라인 수로 구성할 수 있다는 점도 Gradle 도입에 힘을 실어줬습니다.

이제 Maven에서 Gradle로 전환시 고려사항을 알아볼까요?

Maven에서 Gradle로 전환시 고려사항

1. 종속성 관리

Maven과 Gradle의 가장 큰 차이점은 종속성 선택에 있습니다.

[##Image|kage@yZQ8S/btshypCpXUF/vRRoWpf050MsKen6ze1VkK/img.png|CDM|1.3|{"originWidth":1984,"originHeight":688,"style":"alignCenter"}##]

Maven: 종속성 충돌시 가장 가까운 계층의 종속성 선택. 동일 계층일 경우 첫번째 선택(설정간 순서 중요!)

Gradle: 종속성 충돌시 모든 종속성 수집 후 최고 버전 선택(설정시 변경 가능)

프로젝트를 처음부터 구축을 시작할 경우 해당 문제는 거의 발생하지 않지만 몇 년동안 운영해온 대규모 서비스에서는 다양한 종속성을 이용하는 만큼 해당 내용이 가장 큰 영향을 미치는 요소로 판단되었습니다.

이 문제를 위해 Gradle을 통해 Maven과 동일한 설정을 할 수 있을 방법을 찾아보았지만, 하나하나 설정해주지 않는 이상 Maven과 동일한 버전 선택을 하기에는 구조적으로 어려움이 있다고 결론지었습니다.

 빌드 후 자동화 테스트에서 버전 변경으로 인한 영향도를 체크하자.

또한 Semantic Versioning에 따르면 MINOR 버전은 이전 버전을 호환하고 있었기에 이러한 부분을 고려하면 전환간 바뀐 일부 종속성 버전들이 큰 이슈가 없을 것으로 판단되어 '전환간 빌드 및 실행이 완료될 경우 1차적인 성공이라 판단하고 테스트간 발생하는 이슈들을 위해 변경된 버전들에 대한 정리를 진행하자'는 목표를 세우게 되었습니다.

Dependency Tree 보는 법 (명령어)
Maven: mvn dependency:tree
Gradle: ./gradlew :module-name:dependencies

2. Gradle 설정 

Maven과 달리 Gradle에서는 다양한 설정을 위해 여러 기능들을 사용하실 수 있습니다. 플러그인, 종속성 제약, configuration  설정 등 다양한 부분을 사용자의 의도대로 변경할 수 있는데 이러한 설정들을 유용하게 이용할 수 있도록 하는 지식이 필요합니다.

3. 플러그인 호환성, 버전 에러 파악

Gradle의 플러그인들은 신기하게도 버전별로, 사용하는 플러그인에 따라 충돌이 발생할 수 있는 가능성이 생깁니다.
Gradle 전환간 아무리봐도 문제가 없다고 생각되는 경우 호환성 또한 고려해보시는 것을 권장드립니다.

앞으로..

현재 Maven에서 Gradle로 전환해 얻은 이점으로는 빌드 및 테스트 속도 단축밖에 없습니다. 하지만 앞으로 모듈 분리 및 공통로직 제거를 진행한다면 Email 서비스가 좀 더 경량화된 서비스로 발전할 수 있다고 생각합니다.

1부는 단순한 Gradle 전환으로 마무리되었지만 2부에서는 multi module 구조에 적합한 코드 리팩토링을 마무리한 뒤 찾아뵙도록 하겠습니다. 

감사합니다.

profile
Gelog 나쁜 것만 드려요~

0개의 댓글