본문 바로가기

Spring Framework

[Spring] Gradle vs Maven

반응형

이번 글은 기존에 Maven 프로젝트를 Gradle로 전환하기 전 Gradle로 전환하려는 이유에 대해 작성한 글이다.

 

왜 Gradle인가?

 

Maven과 Gradle 모두 빌드 도구(Build Tool) 중 하나로 프로젝트 생성, 테스트 빌드, 베포 등의 작업을 위한 프로그램입니다. 여기서 중요한 점은 왜 Gradle로 전환인가? 입니다.

 

Gradle은 크게 3가지 측면에서 장점이 있습니다.

 

1. 유연성 

 

먼저 "유연성"이라는 것이 추상적이기에 프로그래밍에서 유연성에 대해 간단히 설명하자면, 유지보수의 용이성을 갖춘 소프트웨어는 기존의 코드를 최대한 건드리지 않고 모듈의 동작을 확장할 수 있게 되며 기술의 변화에 기민하게 반응합니다. 

 

즉, 유연한 소프트웨어라는 것은 애플리케이션의 비즈니스 로직을 여러 가지 기술적인 의존성으로부터 격리시켜야 합니다. 

 

Gradle은 성능과 유연함에 초점을 둔 오픈소스 빌드 툴입니다. Gradle의 여러 기능 중에 "멀티 프로젝트"는 Gradle 프로젝트 하위에 여러 개의 Gradle sub 프로젝트를 생성할 수 있는 기능으로, sub 프로젝트는 각각 독립적으로 외부 의존성을 관리할 수 있다는 특징이 있습니다. Gradle은 Layered Architecture(계층이 나뉘어 있는 아키텍처로, 한 Layer는 하나의 관심사에만 집중해 기술적인 의존성과 비즈니스 로직을 독립적으로 분리할 수 있음)의 성격에 잘 부합하는 빌드 도구이기에 유연한 소프트웨어를 만들기에 적합합니다. 


2. 성능

 

두 번째는 성능적인 부분입니다. 아래의 링크는 Gradle과 Maven의 성능을 비교한 영상을 확인할 수 있으니 글을 읽으시면 참고하시면 좋을 것 같습니다. (요지는 Gradle이 성능면에서 더 뛰어나다는 것입니다.)

 

Gradle | Gradle vs Maven Comparison

High-level performance and feature comparison between Gradle and Maven

gradle.org

그럼 왜 Gradle의 성능이 더 우수한가?입니다. Gradle과 Maven은 Gradle의 3가지 특성에 의해 성능의 차이가 발생합니다. 

 

  • 증분 성(incrementality)

 

빌드 도구의 키 포인트는 이미 완료된 작업을 피하는 기능입니다. 예를 들어 소스 파일의 수정이나 출력 파일의 제거와 같이 출력에 영향을 주는 변경 사항이 없는 한 다시 컴파일할 필요가 없습니다. (똑같은 일 두 번 시키면 비효율 적이니까요)

 

Gradle의 incremental build, 일명 증분 빌드는 다음의 과정을 통해 이 부분을 지원합니다. 

 

  1. 먼저 일부 입력(소스 파일, 디버그 정보 포함 여부 등)을 받고 일부 출력(클래스 파일)을 생성합니다. 
  2. 증분 빌드의 일부로 Gradle은 마지막 빌 드 이후에 작업 입력도는 출력이 변경되었는지 여부를 테스트합니다. 
  3. Gradle이 최신 상태로 간주하는 경우 작업 실행을 건너뛰며, 또한 입력은 있지만 출력이 없는 경우도 빌드가 작동하지 않습니다. 
  • Build Cache

 

다른 빌드에서 생성된 출력을 재사용하여 시간을 절약하는 것을 목표하는 캐시 메커니즘입니다. 

Build Cache는 빌드 출력을 저장(로컬 또는 원격)하고 입력이 변경되지 않은 것으로 확인되면 빌드가 캐시에서 이러한 출력을 가져올 수 있도록 하여 재생성 작업을 피함으로써 작동합니다. 

 

Gradle에서 Build Cache를 활성화하는 방법은 다음과 같이 두 가지가 있습니다. 

  1. (터미널에서) --build-cache
  2. gradle.properties 파일에 org.gradle.caching=true 입력
  • Gradle Daemon 

 

마지막으로 Daemon은 Gradle의 속도를 향상해 주는 백그라운드 프로세스입니다. 

Gradle은 JVM에서 실행되며 초기화 시간이 필요한 여러 지원 라이브러리를 사용하기 때문에, 시작하는 것이 약간 느리게 보일 수 있는 데 이를 위해 Gradle Daemon을 사용합니다. 

 

Daemon은 수명이 긴 프로세스 이므로 모든 빌드에 대해 JVM시작 비용을 피할 수 있을 뿐만 아니라 프로젝트 구조, 파일, 작업등에 대한 정보를 메모리에 캐시 할 수 있습니다. 

 

Gradle Daemon을 활성화하는 방법은 다음과 같습니다. 

  1. gradle.properties내에 다음의 코드 삽입


3. 종속성 관리 

 

Maven 종속성 충돌 해결은 선언 순서의 영향을 받는 최단 경로로 작동합니다. 하지만 Gradle은 그래프에서 발견된 종속성의 가장 높은 버전을 선택하여 전체 종속성의 충돌 해결을 수행합니다.

 

build.gradle파일 예시

 

정리하자면, Gradle은 유연성, 성능, 종속성 관리(종속성 충돌 해결)의 3가지 측면에서 Maven 보다 우수한 점을 갖고 있기 때문에 요새의 많은 프로젝트는 Gradle을 사용하는 추세입니다. 

 

반응형

'Spring Framework' 카테고리의 다른 글

[Spring] PSA(Portable Service Abstraction)  (1) 2022.11.05
[Spring] 예외를 처리하는 방법  (0) 2022.11.01
[Spring] JdbcTemplate  (0) 2022.10.22
[Spring] TDD란?  (0) 2022.10.14
[Spring] IoC/DI 컨테이너  (0) 2022.10.12