Maven vs Gradle

라모스·2023년 6월 25일
0
post-thumbnail

빌드 관리 도구란 프로젝트에서 필요한 xml, properties, jar 파일들을 자동으로 인식하여 빌드해주는 도구이다. 소스코드를 컴파일, 테스트, 정적분석 등을 하여 실행가능한 앱으로 빌드해준다. 프로젝트 정보 관리, 테스트 빌드, 배포 등의 작업을 진행해주며 외부 라이브러리를 참조하여 자동으로 다운로드 및 업데이트 역시 관리해준다.

Java의 대표적인 빌드 도구는 Ant, Maven, Gradle이 있다.

Maven

Maven은 Java의 대표적인 관리 도구였던 Ant를 대체하기 위해 개발되었다.
프로젝트의 외부 라이브러리를 쉽게 참조할 수 있게 pom.xml 파일로 명시하여 관리한다.
참조한 외부 라이브러리에 연관된 다른 라이브러리도 자동으로 관리됨

Maven을 사용하는 이유

기존에 사용하는 Ant는 빌드의 기능만 갖고 있다. Maven 자동으로 라이브러리를 관리해주는 기능이 추가되었다. 다운받아 사용하던 라이브러리에 변동 사항이 있으면 자동으로 업데이트하여 적용되는 편리함이 있다.

  • XML 기반의 빌드 스크립트
  • 라이프 사이클 도입
  • pom.xml로 편하게 Dependency 관리

pom.xml의 역할은 다음과 같다.

  • 프로젝트 정보 관리
  • 해당 프로젝트에서 사용하는 외부 라이브러리 관리
  • 해당 프로젝트의 빌드 관련 설정

대표적인 태그

  • modelVersion: maven의 버전
  • groupId: 프로젝트 그룹 id를 뜻하며, 일반적으로 대표하는 사이트 도메인을 역순으로 적어 사용
  • artifactId: groupId 외에 다른 프로젝트와는 구분될 수 있는 프로젝트의 id를 작성
  • version: 프로젝트의 버전을 의미하며 개발 단계에 따라 구분하여 작성
  • name: 프로젝트의 이름
  • description: 해당 프로젝트의 간략한 설명을 작성
  • properties: pom.xml 파일 내에서 빈번하게 사용되는 중복 상수를 정의하는 영역. 해당 영역의 상수를 사용하기 위해서는 ${태그명} 의 형태로 사용하면 된다.
  • dependencies: 해당 프로젝트에서 의존성을 가지고 사용하는 라이브러리를 정의하는 영역. 각 라이브러리마다 <dependency> 태그를 사용하여 구분
  • build: 프로젝트 빌드와 관련된 정보를 설정하는 영역

Gradle

Groovy 스크립트를 활용한 빌드 관리 도구다. 안드로이드 프로젝트의 표준 빌드 시스템으로 채택되어 있으며 멀티 프로젝트의 빌드에 최적화하여 설계되었다. Maven에 비해 더 빠른 처리속도를 가지고 있으며 더 간결한 구성이 가능하다. 거의 모든 타입의 소프트웨어를 빌드할 수 있는 빌드 자동화 시스템이다.

참고로, Groovy는 JVM 상에서 실행되는 스크립트 언어로 Java와 유사한 문법 구조를 가지며, 호환성이 아주 좋다.

Gradle vs Maven

  • Gradle에 비해 Maven의 점유율이 더 높다. (점차 Gradle이 오르는 추세)
  • Gradle에 비해 Maven의 성능이 떨어진다.
  • Maven에 비해 Gradle이 대규모 프로젝트에서의 성능이 좋다.
  • Gradle은 설치 없이 사용할 수 있다. (Gradle Wrapper)
  • Maven: pom.xml vs Gradle: build.gradle

설정 주입 방식으로 정의

Gradle은 프로젝트를 설정 주입 방식으로 정의한다는 특징이 있다.

Maven의 상속 구조보다 재사용에 용의하며, 프로젝트의 조건을 체크할 수 있어서 프로젝트 별로 주입되는 설정을 다르게 할 수 있다.

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>
dependencies {
  implementation 'org.springframework.boot:spring-boot-starter'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

대표적인 용어

  • repositories: 라이브러리가 저장된 위치 등 설정
  • mavenCentral: 기본 Maven Repository
  • dependencies: 라이브러리 사용을 위한 의존성 설정

Gradle이 빌드 속도가 빠른 이유

점진적 빌드

  • Gradle은 빌드 실행 중 마지막 빌드 호출 이후에 task의 입력, 출력 혹은 구현이 변경됐는지 확인한다.
  • 최신 상태로 간주하지 않는다면 빌드는 실행되지 않는다.

빌드 캐시

  • 두 개 이상의 빌드가 돌아가고, 하나의 빌드에서 사용되는 파일들이 다른 빌드들에 사용된다면 Gradle은 빌드 캐시를 이용해 이전 빌드의 결과물을 다른 빌드에서 사용할 수 있다.
  • 다시 빌드하지 않아도 되므로 빌드 시간이 줄어들게 된다.

데몬 프로세스

  • 데몬 프로세스: 서비스의 요청에 응답하기 위해 오래 동안 살아있는 프로세스
  • Gradle의 데몬 프로세스는 메모리 상에 빌드 결과물을 보관한다.
  • 이로 인해 한 번 빌드된 프로젝트는 다음 빌드에서 매우 적은 시간만 소요된다.

이런 특징들 때문에 Maven 보다 두 배 이상, 최대 100배 빠르다.

build.gradle

  • api: 내부 의존성을 컴파일과 런타임 모두에 보이는 API 의존성
  • implementation: 내부 의존성을 런타임에서만 보이는 구현 의존성
  • compileOnly: 컴파일에만 사용되는 의존성 정의
  • runtimeOnly: 런타임에만 사용되는 의존성 정의
  • test + Implementation, CompileOnly, RuntimeOnly: 해당 의존성을 테스트 시에만 사용하도록 정의

Maven과 Gradle의 멀티 모듈

Apache Maven Shade Plugin, Gradle fat jar를 활용하여 멀티 모듈을 만들어보는 실습 예제를 첨부하여 해당 설명을 대체합니다.

References

profile
블로그 이전 → https://ramos-log.tistory.com/

0개의 댓글