[Web] Maven과 Gradle 비교

2022. 11. 7. 01:56·Programming/Web
728x90

스프링과 스프링부트에서 Maven과 Gradle을 본 적이 있을 것이다. Maven과 Gradle 이 둘은 빌드 관리 도구이다.

빌드

소스코드 파일을 컴파일에서 실행할 수 있는 가공물로 변환하는 과정 또는 결과물이다.

우리가 작성한 소스코드(java), 프로젝트에서 쓰인 각각의 파일 및 자원등(.xml, jpa, jpg, properties)을 jvm이나 톰캣같은 WAS가 인식할 수 있는 패키징하는 과정 및 결과물이라고 할 수 있다.

빌드 관리 도구

소스코드에서 어플리케이션 생성을 하면서 여러가지 여부 라이브러리를 사용하는데, 이 빌드 관리 도구는 사용자가 직접 관리할 필요 없이 필요한 라이브러리들을 자동으로 관리한다.

초기의 Java빌드 도구로는 Apache Ant를 많이 사용했지만 스크립트 작성도 많고, 라이브러리 의존관리가 되지 않는다는 불편함으로 Maven과 Gradle이 많이 쓰인다.

수행하는 작업

  1. 종속성 다운로드
  2. 소스코드를 바이너리코드로 컴파일
  3. 바이너리 코드를 패키징
  4. 테스트 실행
  5. 프로덕션 시스템에 배포

Maven

  • Apache Maven은 자바용 프로젝트 관리 도구이다.
  • Apache Ant 의 대안으로 만들어졌다.
  • Apache 라이센스로 배포되는 오픈 소스 소프트웨어이다.
  • 자바 전용 프로젝트 Lifecycle 관리 목적 빌드 도구이다. Apache Ant 불편함을 해결하고자 만들어졌으며 스프링에서 사용된다.
  • 프로젝트를 진행하면서 사용하는 수많은 라이브러리들을 관리해주는 도구이다. 여기서 메이븐의 특징적인 점은 그 라이브러리들과 연관된 라이브러리들까지 거미줄처럼 모두 연동이 되서 관리가 된다는 점이다. 즉, 메이븐은 네트워크를 통해 연관된 라이브러리까지 같이 업데이트를 해주기 때문에 사용이 편리하다.

Maven 특징

  • LifeCycle : 정해진 Lifecycle에 의하여 작업을 수행하며, 전반적인 프로젝트 관리 기능을 포함하고 있다.
  • 프로젝트 모델링 : Maven은 필요한 라이브러리를 pom.xml에 정의한다.
  • 플러그인을 통한 전역적인 재사용 : Maven은 빌드에 대한 대부분의 책임을 각 플러그인에 위임한다. 이러한 플러그인들은 Maven저장소(Repository)에 저장된다.

Maven 설정파일

setting.xml

메이븐을 빌드할 때 의존 관계에 있는 라이브러리와 플러그인을 중앙저장소→로컬저장소(개발자 PC)로 다운로드하게 되어있다. 그리고 로컬저장소의 기본 위치는 USER_HOME/.m/repository인데 setting.xml을 통해 원하는 로컬 저장소의 경로를 지정 및 변경할 수 있다.

pom.xml

root에 존재하는 xml파일로, 프로젝트마다 1개씩 가지고 있다. 필요한 라이브러리를 pom.xml에 정의하면 해당 라이브러리 실행, 설치에 필요한 다른 라이브러리까지 관리하고 네트워크를 통해서 자동으로 다운 받아준다.

POM - Project Object Model

Maven의 기능을 이용하기 위해 POM이 사용된다.

POM은 약자 이름 그대로 Project Object Model의 정보를 담고 있는 파일이다.

pom.xml에서 주요하게 다루는 기능들은 아래와 같다.

  • 프로젝트 정보 : 프로젝트의 이름, 라이센스 등
  • 빌드 설정 : 소스, 리소스, 라이프사이클 별 실행할 플로그인 등 빌드와 관련된 설정
  • 빌드 환경 : 사용자 환경 별로 달라질 수 있는 프로파일 정보
  • pom 연관 정보 : 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등

Maven의 Lifecycle

단계 내용
Default(Build) 일반적인 빌드 프로세스를 위한 모델이다.
Clean 빌드 시 생성되었던 파일들을 삭제하는 단계
Validate 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는 확인하는 단계
Compile 프로젝트의 소스코드를 컴파일 하는 단계
Test 유닛(단위) 테스트를 수행 하는 단계(테스트 실패 시 빌드 실패로 처리, 스킵 가능)
Package 실제 컴파일 된 소스 코드와 리소스들을 jar, war 등등의 파일 등의 배포를 위한 패키지로 만드는 단계
Verify 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인하는 단계
Install 패키지를 로컬 저장소에 설치하는 단계
Site 프로젝트 문서와 사이트 작성, 생성하는 단계
Deploy 만들어진 package를 원격 저장소에 release하는 단계

Gradle

  • 빌드, 프로젝트 구성/관리, 테스트, 배포 도구
  • 안드로이드 앱의 공식 빌드 시스템
  • 빌드 속도가 Maven에 비해 10~100배 가량 빠름
  • JAVA, C/C++M Python 등을 지원
  • 빌드툴인 Ant Builder와 Groovy 스크립트 기반으로 만들어져 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용 가능
  • Maven을 대체할 수 있는 프로젝트 구성 관리 및 범용 빌드 툴이며 Ant Builder와 Groovy Script를 기반으로 구축되어 기존 Ant의 역할과 배포 스크립의 기능을 모두 사용가능하며 스프링부트와 안드로이드에서 사용한다.

Gradle 특징

  • 간결함 : xml의 구조적인 장점이 있지만 문서의 양 자체가 비대해지는 단점이 있는데, Gradle은 코딩에 의한 간결한 정의가 가능하다.
  • 재사용에 용이함 : 프로젝트 설정 주입 방식(Configuration Injection)으로 정의하여 Maven의 상속 구조보다 재사용에 용이하다.
  • 구조적인 장점 : Build Script를 xml이 아닌 Groovy 기반의 DSL(Domain Specific Language)를 사용하여 코드로서 설정 정보를 구성하기 때문에 구조적인 장점이 있다.
  • 편리함 : Gradle 설치 없이 Gradle Wrapper를 이용하여 빌드를 지원한다.
  • 멀티 프로젝트 : 애초에 멀티 프로젝트 빌드를 지원하기 위해 설계된 빌드 관리 도구이다.
  • 지원 : Maven과 Ivy repository를 완전 지원한다.

Groovy

Groovy는 Java 가상 머신(JVM)에서 실행되는 스크립트 언어이다. Java 가상 머신에서 동작하지만, Java와는 달리 소스 코드를 컴파일 할 필요가 없다. Groovy는 스크립트 언이이고, 소스 코드를 그대로 실행한다. 또한 Java와 호환되고, Java 클래스 파일을 그대로 Groovy 클래스로 사용할 수 있다. Java 문법과 유사하여 빌드 처리를 관리할 수 있는 면에서 Gradle은 Java 개발자가 사용하기에 좋은 빌드관리도구이다.

Gradle 설정 파일

settings.gradle

프로젝트 구성을 설정할 때 작성하는 파일이다. 보통 프로젝트간의 의존성 및 서브프로젝트, 교차 프로젝트 같은 멀티 프로젝트를 구성할 때 사용한다. 단, 싱글 프로젝트의 경우에는 생략이 가능하다.

build.gradle

간단하게 빌드에 대한 모든 기능을 정의하는 파일이다. 프로젝트에서 사용하는 환경 설정, 빌드 방법, 라이브러리 정보 등을 기술함으로서 빌드 및 프로젝트의 관리환경을 구성한다.

Gradle의 Lifecycle

단계 내용
초기화(Initialization) 빌드 대상 프로젝트를 결정하고 각각에 대한 Project 객체를 생성한다. settings.gradle 파일에서 프로젝트 구성한다.
구성(Configuration) 빌드 대상이 되는 모든 프로젝트의 빌드 스크립트를 실행한다.
실행(Execution) 구성 단계에서 생성하고 설정된 프로젝트의 태스크 중에 실행 대상을 결정한다. gradle 명령행에서 지정한 태스크 이름 인자와 함께 디렉토리를 기반으로 태스크를 결정하여 선택된 태스크들을 실행한다.

Maven VS Gradle

  • 기존 Maven의 경우 XML로 라이브러리를 정의하고 활용하도록 되어 있으나, Gradle의 경우 별도의 빌드 스크립트를 통하여 사용할 어플리케이션 버전, 라이브러리 등의 항목을 설정할 수 있다. Groovy 스크립트 언어로 구성되어 있기에 XML과 달리 변수선언, if, else, for 등의 로직이 구현 가능하며 간결하게 구성 가능하다.
  • 스크립트 길이와 가독성 면에서 gradle이 우세하다.
  • 빌드와 테스트 실행 결과 gradle이 더 빠르다.(gradle은 캐시를 사용하기 때문에 테스트 반복 시 차이가 더 커진다.)
  • 의존성이 늘어날수록 성능과 스크립트 품질의 차이가 심해질 것이다.
  • Maven은 프로젝트가 커질수록 빌드 스크립트의 내용이 길어지고 가독성이 떨어진다. 반면에 Gradle은 훨씬 적은 양의 스크립트로 짧고 간결하게 작성할 수 있다.
  • Maven이 정적인 형태의 XML 기반으로 작성되어 동적인 빌드를 적용할 경우 어려움이 많다면, Gradle은 Groovy를 사용하기 때문에 동적인 빌드는 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 된다.
  • Maven의 경우 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 하지만 Gradle은 설정 주입 방식을 사용하기 때문에 멀티 프로젝트에 매우 적합하다.
  • Maven과 Ant의 장점들을 모아서 만들어졌기 때문에 Gradle이 편리하고 빠르다고 한다.
  • 과거에는 Maven을 많이 사용했었지만 요즘은 Gradle을 많이 사용한다고 한다.

'Programming > Web' 카테고리의 다른 글

[Web] 16진수 체계와 주소체계  (2) 2022.11.20
[Web] HTTP Request(요청), HTTP Response(응답) 구조  (0) 2022.11.07
[Web] 절대경로/상대경로  (0) 2022.11.06
[Web] 용어 정리(utility), (Software), (Network), (localhost), (Built-in Object), (HTTP)  (0) 2022.11.06
[Web] Spring Bean 선언, 오토와이어링(Autowired)  (0) 2022.11.03
'Programming/Web' 카테고리의 다른 글
  • [Web] 16진수 체계와 주소체계
  • [Web] HTTP Request(요청), HTTP Response(응답) 구조
  • [Web] 절대경로/상대경로
  • [Web] 용어 정리(utility), (Software), (Network), (localhost), (Built-in Object), (HTTP)
arajo
arajo
  • arajo
    아라 메모장
    arajo
  • 전체
    오늘
    어제
    • 분류 전체보기 (509)
      • Language (298)
        • HTML (55)
        • CSS (11)
        • JavaScript (70)
        • TypeScript (8)
        • Python (33)
        • Java (119)
        • C (0)
        • C# (2)
      • Programming (92)
        • Programming (14)
        • Web (51)
        • Apache (1)
        • MySQL (23)
        • AWS (3)
      • Framework | Library (26)
        • Framework | Library (3)
        • Vue.js (2)
        • React.js (5)
        • React Native (4)
        • Node.js (1)
        • Ajax (1)
        • Bootstrap (8)
        • Spring (1)
        • Flutter (1)
      • etc (2)
      • 휴식 (19)
        • 책 (13)
        • 일기 (5)
        • 게임 일기 (1)
      • A (71)
        • 공부 (18)
        • 기타 (6)
        • 일 (47)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    object
    변수
    JavaScript
    Python
    타입스크립트
    next.js
    리액트
    자바스크립트
    CSS
    event
    파이썬
    Java
    HTML
    react
    제어문
    TypeScript
    객체
    array
    web
    MySQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
arajo
[Web] Maven과 Gradle 비교
상단으로

티스토리툴바