CS

빌드 관리 도구 (Maven vs Gradle)

느낌표 공장장 2021. 5. 27. 17:04

빌드 관리 도구란 ?

 

  • 프로젝트에서 작성한 Java 코드와 프로젝트 내에 필요한 각종 xml, properties, jar 파일들을 JVM이나 WAS가 인식할 수 있도록 패키징 해주는 빌드 과정이 "빌드 자동화 도구"라고 할 수 있다. 

 

  • 빌드 도구는 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램이며, 빠른 기간 동안 계속해서 늘어나는 라이브러리 추가 프로젝트를 진행하고, 라이브러리의 버전 동기화의 어려움을 해소하고자 등장했다. 

 


 

1. ANT

  • Ant는 Java 기반의 빌드 도구로 다른 빌드 도구보다 역사가 오래되었다. Ant는 개발자가 원하는 것을 개발할 수 있다는 유연성에 큰 장점이 있다. 
  • 각 프로젝트에 대한 XML 기반 빌드 스크립트 개발
  • 형식적 규칙이 없다 → 결과물을 넣을 위치를 정확히 알려줘야 하고, 프로젝트에 특화된 Target과 Dependency를 이용해 모델링
  • 절차적 → 명확한 빌드 절차 정의가 필요하다.
  • 생명주기를 갖지 않기 때문에 각각의 target에 대한 의존관계와 일련의 작업을 정의해 주어야 한다.

 

* 단점으로 프로젝트가 복잡해지면 각각 Build 과정을 이해하기 어려워지고, 스크립트 재사용이 어려우며, XML, Remote Repository를 가져올 수 없다. (IVY 도입)

 


 

2. Maven

  • Maven은 Java용 프로젝트 관리 도구로 Apache의 Ant대안으로 만들어졌다. (Ant는 여러 가지 단점이 많기 때문)
  • 프로젝트에 필요한 모든 'Dependency(종속성)'을 리스트 형태로 Maven에게 알려 관리할 수 있도록 돕는 방식이다. (pom.xml 파일에 명시)
  • Dependency를 관리하고, 표준화된 프로젝트를 제공한다.
  • XML, remote repository를 가져올 수 있다. ➡︎ 개발에 필요한 종속되는 'jar', 'class path'를 다운로드할 필요 없이 선언만으로 사용 가능하다.
  • 외부 저장소에 필요한 라이브러리와 플러그인들을 다운로드 한 다음, 로컬 시스템의 캐시에 모두 저장한다.

 


 

3. Gradle

    • 빌드의 자동화에 대한 요구 증가에 따른 JVM(Java Virtual Machine) 기반 빌드 도구이다.
    • Apacahe Maven과 Apache Ant의 장점을 합쳐 보완한 프로젝트 빌드 관리 툴이다. (완전한 오픈소스)
    • Java 혹은 Groovy를 이용해 로직을 개발자에 의도에 따라 설계 가능하다.

 

  • Groovy 언어를 사용한 도메인 특화 언어(DSL : Domain-Specific-Language)를 사용한다. (설정 파일을 xml파일을 사용하는 Maven보다 코드가 훨씬 간결하다.)
  • Build-by-convention을 바탕으로 하기 때문에 스크립트 규모가 작고 읽기 쉽다.
    • Build-by-convention : 기본 규칙을 따라 설계하면 빌드가 훨씬 간단해진다는 것
  • Multi-project의 빌드를 지원하기 위해 설계되었다.

 

  • Gradle은 프로젝트의 어느 부분이 업데이트되었는지 알기 때문에, 빌드에 점진적으로 추가할 수 있다.
  • 초기 프로젝트 설정 시간 절약 가능하다.
  • 기존의 Maven이나 Ivy등과 같은 빌드 도구들과도 호완이 가능하다.

 


 

4. Maven VS Gradle

  • 두 시스템이 빌드에 접근하는 방식에는 몇 가지 근본적인 차이점이 있다.
  • Gradle은 작업 의존성 그래프를 기반으로 하는 반면, Maven은 고정적이고 선형적인 단계의 모델을 기반으로 한다.
  • 성능 측면에서는 둘 다 다중 모듈 빌드를 병렬로 실행할 수 있지만, Gradle은 어떤 task가 업데이트되었고 안되었는지를 체크하기 때문에 Incremental build를 허용한다. 업데이트가 이미 반영된 task에 대해서는 작업이 실행되지 않으므로 빌드 시간이 훨씬 단축된다. (빌드 설정 규모가 커지면 커질수록, 두 시스템의 빌드 시간의 차이를 비교하면 꽤 격차가 벌어질 수 있을 것 같다.)
    • Incremental build : 반복적인 빌드 과정에서 변경된 소스코드에 의존성(Dependency)이 있는 대상들만 추려서 다시 빌드하는 기능 (→ 반복되는 빌드 과정에서 변경사항이 있는 소스 파일만 가려서 다시 컴파일하여 빌드 하는 것.)

 

  •  Maven의 경우 Multi-project에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 하지만, Gradle은 설정 주입 방식(Configuration Injection)을 제공하여 이를 해결한다.
  • 또한 Gradle은 concurrent에 안전한 캐시를 허용한다.
  • ➡︎ 2개 이상의 프로젝트에서 동일한 캐시를 사용할 경우, 서로 overwrite 되지 않도록 checksum 기반의 캐시를 사용하고, 캐시를 repository와 동기화시킬 수 있다.

  • 고도로 사용자 정의된 빌드를 작성하기 위해서는 커스터마이징이 간편한 Gradle을 사용하는 게 훨씬 낫다.

 

 


 

참고한 사이트

https://www.educba.com/gradle-vs-maven/

https://sugerent.tistory.com/571

https://jisooo.tistory.com/entry/Spring-빌드-관리-도구-Maven과-Gradle-비교하기

 https://gnu-cse.tistory.com/129

'CS' 카테고리의 다른 글

API  (0) 2021.06.26
REST API  (0) 2021.06.26
Cookie  (0) 2021.06.25
좋은 객체 지향 설계의 5가지 원칙(SOLID)  (0) 2021.06.01
TDD(테스트 주도 개발)  (0) 2021.05.18