---
title: Maven과 Gradle 차이점
date: 2022-11-01
tags: spring, 공부
excerpt: Maven? Gradle?
---
# Maven? Gradle?
Maven의 경우에는 스프링 프로젝트에서 pom.xml이란 이름으로 다루고 있다.

Gradle은 스프링부트, 안드로이드에서 쓰는걸로 기억하고 있는데, 이것이 맞는 것인가?! 바로 알아보자<br />

## Maven 이란?
프로젝트를 진행하게 되면 단순히 자신이 작성한 코드만으로 개발하는 것이 아니라 많은 라이브러리들을 활용해서 개발을 하게 된다.<br />
세상에 많은 천재들이 개발한 라이브러리를 활용해서 개발을 하게 되면 개발 시간도 단축될뿐 아니라 안정성도 그만큼 보장되지 않겠는가! 적극 활용한다!👍<br />

이 때 사용되는 라이브러리들의 수가 수십개가 훌쩍 넘어가버리는 일이 발생해 이 많은 라이브러리들을 관리하는 것이 힘들어지는 경우가 종종 발생하게 된다.<br />
**Maven**은 이러한 문제를 해결해 줄 수 있는 도구이다.<br />
Maven은 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해 자동으로 다운 받아 준다.

Maven은 프로젝트의 전체적인 라이프사이클을 관리하는 도구이며, 많은 편리함과 이점이 있어 널리 사용되고 있다. <br />
Maven은 JDK설치와 같이 설치할 수 있다. 환경변수를 잡아주면 cmd에서 **mvn -version**을 통해 버전을 알 수 있고 설치가 가능하다. <br />
설치는 [메이븐 홈페이지](https://maven.apache.org/download.cgi)에서 할 수 있다.

### Maven의 Lifecycle
maven 에서는 미리 정의하고 있는 빌드 순서가 있으며 이 순서를 라이프사이클이라고 한다. 라이프 사이클의 각 빌드 단계를 Phase라고 하는데, 이런 Phase들은 의존관계를 가지고 있다. <br />

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

위 9개의 라이프 사이클 말고도 더 많은 종류가 존재한다. <br />
이를 크게 Clean, Build, Site 세 가지로 나누고 있다. <br />
각 단계를 모두 수행하는 것이 아니라 원하는 단계까지만 수행할 수도 있으며 test단계는 큰 프로젝트의 경우에 몇 시간이 소요될 수 있으니 수행하지 않도록 스킵이 가능하다. <br />

#### Phase와 Goal
위에서 잠깐 언급헀던 Phase는 Maven의 Build LifeCycle의 각각의 단계를 의미한다. 각각의 Phase는 의존관계를 가지고 있어서 해당 Phase가 수행되려면 선행 단계의 Phase가 모두 수행되어야 한다. <br />

메이븐에서 제공되는 모든 기능은 플러그인 기반으로 동작하는데 메이븐은 라이프 사이클에 포함 되어있는 Phase마저도 플러그인을 통해 실질적인 작업이 수행된다. 즉 각가의 Phase는 어떤 일을 할지 정의하지 않고 어떤 플러그인의 Goal을 실행할지 설정한다. <br />

메이븐에서는 하나의 플러그인에서 여러작업을 수행할 수 있도록 지원하며, 플러그인에서 실행할 수 있는 각각의 기능을 Goal이라고 한다. <br />
플러그인의 Goal을 실행하는 방법은 다음과 같다. <br />
 - mvn groupId:artifactId:version:goal (아래와 같이 생략 가능)
 - mvn plugin:goal

### POM(Project Object Model)
pom은 이름 그대로 Project Object Model의 정보를 담고 있는 파일이다. 이 파일에서 주요하게 다루는 기능들은 다음과 같다. <br />
 - 프로젝트 정보 : 프로젝트의 이름, 개발자 목록, 라이센스 등
 - 빌드 설정 : 소스, 리소스, 라이프 사이클별 실행한 플러그인(Goal)등 빌드와 관련된 설정
 - 빌드 환경 : 사용자 환셩 별로 달라질 수 있는 프로파일 정보
 - POM연관 정보 : 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등

POM은 pom.xml파일을 말하며 Maven의 기능을 이용하기 위해 사용된다.

---

## Gradle 이란?
Gradle이란 기본적으로 빌드 배포 도구(Build Tool)이다. <br />
안드로이드 앱을 개발할때 필요한 공식 빌드시스템이기도 하며 JAVA, C/C++, Python 등을 지원한다. <br />

빌드툴인 Ant Builder와 그루비 스크립트를 기반으로 구축되어 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용가능하다. <br />

Maven의 경우 XML로 라이브러리를 정의하고 활용하도록 되어 있으나, Gradle의 경우 별도의 빌드스크립트를 통하여 사용할 어플리케이션 버전, 라이브러리등의 항목을 설정 할 수 있다. <br />

장점으로는 스크립트 언어로 구성되어 있기 때문에 XML과 달리 변수선언, if else for 등의 로직이 구현 가능하여 간결하게 구성이 가능하다. <br />

 - 라이브러리 관리 : Maven repository를 동일하게 사용할 수 있어서 설정된 서버를 통하여 라이브러리를 다운로드 받아 모두 동일한 의존성을 가진 환경을 수정할 수 있다. 또한 자신이 추가한 라이브러리도 repo 서버에 올릴 수 있다.
 - 프로젝트 관리 : 모든 프로젝트가 일관된 디렉토리 구조를 가지고 빌드 프로세스를 유지하도록 도와준다.
 - 단위 테스트 시 의존성 관리 : junit 등을 사용하기 위해서 명시한다.

###  Gradle 장점
Maven에는  Gradle과 비교문서가 없지만, Gradle에는 비교문서가 있다. <br />
그만큼 Maven의 모든 기능을 포함하고 있고, 더 뛰어나다고 표현하는것일까?<br />
Gradle이 시기적으로 늦게 나온만큼 사용성, 성능 등 비교적 뛰어난 스펙을 가지고 있다.

### 그래서 Gradle이 Maven보다 좋은점은?
 - Build라는 동적인 요소를 XML로 정의하기에는 어려운 부분이 많다.
   - 설정 내용이 길어지고 가독성이 떨어짐
   - 의존관계가 복잡한 프로젝트 설정하기에는 부적절
   - 상속구조를 이용한 멀티 모듈 구현
   - 특정 설정을 소수의 모듈에서 공유하기 위해서는 부모 프로젝트를 생성하여 상속하게 해야함 (상속의 단점이 생김)
 - Gradle은 그루비를 사용하기 때문에, 동적인 빌드는 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 된다.
   - Configuration Injection 방식을 사용해서 공통 모듈을 상속해서 사용하는 단점을 커버했다.
   - 설정 주입시 프로젝트의 조건을 체크할 수 있어서 프로젝트별로 주입되는 설정을 다르게 할 수 있다.

> Gradle은 Maven보다 최대 100배 빠르다고 한다.

---

## 그래서 결론은?
Gradle이 출시되었을 때는 Maven이 지원하는 Scope를 지원하지 않았고 성능면에서도 앞설것이 없었다. Ant의 유연한 구조적 장점과 Maven의 편리한 의존성 관리 기능을 합쳐놓은 것만으로도 많은 인기를 얻었던 Gradle은 버전이 올라가며 성능이라는 장점까지 더해지면서 대세가 되었다. <br />

리드미컬하게 테스트를 진행하고 민첩한 지속적 배포를 생각하고 있다면 새로운 배움이 필요하더라도 Gradle을 사용하는것이 좋다고 생각한다. <br />
