Maven & Gradle

hee·2026년 3월 8일

Build

목록 보기
1/2

목적

현재까지 프로젝트를 진행하며 프로젝트 관리 도구로 Gradle만 사용해봤는데, 현재 회사 프로젝트에서는 Maven으로 프로젝트 관리 도구를 사용하기에 Gradle, Maven이 무슨 역할을 하는지 알아보고, 이 둘을 비교해보려고 한다.

Maven 이란?

  • 자바용 프로젝트 관리 도구 → 프로젝트를 빌드, 패키지, 배포등의 역할을 수행하고 각종 라이브러리를 관리함
  • 아파치 라이센스로 배포되는 오픈소스 소프트웨어 (Ant 대안)
  • 2개의 설정 파일을 통해 관리 가능 → setting.xml pom.xml
    • setting.xml 은 메이븐 툴과 관련 설정 파일
    • pom.xml
      • 자바 프로젝트의 빌드 툴로 메이븐을 설정했다면 생성될 것
      • 프로젝트에 필요한 라이브러리를 정의하는 공간 (해당 라이브러리가 작동하는데 필요한 다른 라이브러리 자동으로 설치

Maven 빌드 순서 (Life Cycle)

  • 메이븐은 미리 정의하고 있는 빌드 순서가 있음. → 라이프 사이클

  1. Default(=Build) : 소스코드 컴파일. 컴파일 성공하면 target/classes 폴더가 만들어지고 컴파일 된 class 파일 생성
    • target 폴더 = 빌드 결과물이 위치
    • 즉 최종적으로 배포 가능한 WAR/JAR 폴더가 생성됨 (6번 참고)
  2. Clean : 빌드 후 생성된 target 삭제 → 생성된 파일 삭제한다
  3. Validate : 프로젝트가 올바른지 확인하고, 필요한 모든 정보를 사용할 수 있는지 확인
  4. Compile : 프로젝트의 소스코드를 컴파일 하는 단계
  5. Test : 유닛 (단위) 테스트를 수행하는 단계 (테스트 실패시 빌드로 처리, 스킵 가능)
  6. Package : 실제 컴파일 된 소스코드와 리소스들을 jar, war 과 같은 파일등의 배포를 위한 패키지로 만드는 단계 → 타켓 directory 만듦
  7. Verify : 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인
  8. Install : 패키지를 로컬 저장소에 설치하는 단계, Package와 다른 점은 로컬 저장소에 있는 다른 프로젝트 들이 접근이 가능하다.
  9. Site : 프로젝트 문서와 사이트 작성, 생성하는 단계
  10. Deploy : 만들어진 package를 원격 저장소에 release 하는 단계

→ 코드를 수정한 후 package하면 오래걸림

→ 오래걸리니 target 파일의 코드를 바꾸게 하면 package를 할 필요가 없음

→ 무지성 clean → package

Maven 라이브러리 저장 장소 (pom.xml)

  • maven은 필요한 라이브러리를 pom.xml 에 저장함 ⇒ 프로젝트 모델링
<modelVersion>4.0.0</modelVersion>
<groupId>com.회사이름</groupId>
<artifactId>모듈이름</artifactId> <!-- jar, war 파일 이름을 의미 -->
<version>artifact의 버전</version> <!-- 0.0.1-SNAPSHOT = 아직 개발 중 -->
<packaging>artifact의 포맷</packaging>

<properties>...</properties> <!-- 값을 가진 상수 ${propertyname} 이런식으로 참조 가능  -->

<repositories>...</repositories> <!-- 라이브러리 받아올 저장소 지정  -->

<dependencies>...</dependencies>
<!-- 의존성은 POM에서 가장 중요함 (일관성 있는 프로젝트에 필수)
Maven은 dependencies 요소에 명시된 의존성을 자동 다운하고,
해당 의존성이 의존하는 또다른 의존성(transitive dependencies) 까지 가져 옴
외부에서 jar 파일을 일일이 다운받아 관리하던 것에비해 매우 개선됨-->

<build>...</build> <!-- 플러그인 목록  -->

그렇다면 빌드란 무엇인가 ?

Maven이 자바 기반 프로젝트를 관리하는 도구라는 것을 알게 되었다.
Maven은 프로젝트를 빌드하고, 패키징하며, 배포하는 과정을 관리하고 필요한 라이브러리 의존성까지 효율적으로 관리해준다.
그렇다면 여기서 말하는 빌드(Build)란 무엇일까?

  • 빌드
    • 소스코드 혹은 프로젝트에 쓰인 각각의 파일 및 자원을 JVM이나 WAS가 인식할 수 있는 구조로 패키징하는 과정 및 결과물을 의미
  • 빌드 관리 도구 (Build Tool)
    • 프로젝트 생성, 테스트 빌드, 배포 → 를 위한 전용 프로그램
    • 소스코드를 실행 가능한 어플리케이션으로 만들어주는 도구
    • if 라이브러리가 계속 늘어나거나, 라이브러리 버전 동기화가 어렵다 ? → build tool이 해소
    • 다시 말해 빌드 과정을 자동화해서 관리해주는 역할
  • 특징
    • 빌드 도구의 특징은 개발자가 스크립트를 작성해 다양한 작업을 수행할 수 있게 함
    • 소스코드를 컴파일, 패키징 할 수 있으며 테스트를 자동으로 수행하거나 의존성 주입 및 배포 작업을 할 수 있음
    • 종류에 따라 스크립트 작성시 사용하는 문법이 다르긴 하나 일반적으로 XML 혹은 특정 도메인 언어를 사용함
    • 빌드 도구 종류에는 Ant Maven Gradle 이 있음
💡 빌드 자동화란 ?

1. 종속성 다운로드

2. 소스코드를 바이너리 코드로 컴파일

3. 바이너리 코드를 패키징

4. 테스트 실행

5. 프로덕션 시스템에 배포

를 스크립팅하거나 자동화하는 행위 

Gradle이란 ?

  • Maven 을 대체할 수 있는 프로젝트 구성 관리 및 범용 빌드 툴
  • Ant Builder 와 Groovy script를 기반으로 구축되어 기존 Ant 역할 + 배포 스크립 기능 모두 사용 가능
  • 스프링 부트와 안드로이드에 사용
  • 빌드 속도가 Maven에 비해 10~100배 빠름, Java, C/C++, Python을 지원
  • XML 사용안함, JVM위에서 동작하는 Groovy나 Kotlin을 통해 작성함
  • Maven의 pom.xml은 선언형으로 설정하는 정적인 문서인 반면, Gradle의 build.gradle은 스크립트로 작성하는 동적인 소스 파일
  • 즉, Maven은 정적인 문서와 엄격한 규칙으로 인해 어떤 설정이 필요할 때 한계가 있으나 Gradle은 로직을 넣을 수 있으니 한계가 필요없음. → 필요하다면 로직에 플러그인을 호출하거나 직접 코드를 짜면됨
정리하자면,

Groovy는 JVM에서 실행되는 스크립트 언어

JVM에서 동작하지만, 소스코드를 컴파일 할 필요없음

Java와 호환되며, Java class file을 Groovy class로 사용 가능함

Java와 문법 유사 

Gradle 특징

1. 가독성이 좋다 : 코딩에 의한 **간결한 정의**가 가능하므로 가독성이 좋다.
2. 재사용에 용이 : 설정 주입 방식(Configuration Injection)을 사용하므로 재사용에 용이하다.
3. 구조적인 장점 : Build Script를 Groovy 기반의 DSL(Domail Specific Language)를 사용하여 코드로서 설정 정보를 구성하므로 구조적인 장점이 있다.
4. 편리함 : Gradle 설치 없이 Gradle wrapper를 이용하여 빌드를 지원한다.
5. 멀티 프로젝트 : Gradle은 멀티 프로젝트 빌드를 지원하기 위해 설계된 빌드 관리 도구이다.
6. 지원: Maven을 완전 지원한다.

Maven vs Gradle

  1. 스크립트 길이와 가독성 면에서는 Gradle이 우세하다

  2. Build와 테스트 실행 결과 Gradle이 더 빠르다

  • Gradle은 캐시를 사용하기 때문에 테스트 반복 시 실행 결과 시간의 차이가 더 커진다
  1. 의존성이 늘어날 수 록 스크립트의 품질의 차이가 커진다
  • Maven은 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속 받아야하지만, Gradle은 설정 주입 방식을 사용하므로 멀티 프로젝트에 적합하다

0개의 댓글