🔨 빌드 관리 도구
maven과 gradle의 차이점을 살펴보기 전에, 이 둘이 뭔지부터 짚고 넘어가자!
이들은 빌드 관리 도구이다
빌드 관리 도구는 빌드 과정을 자동화해주며, 빌드 과정은 다음과 같다
- 종속성(외부 라이브러리) 다운로드
- 소스코드를 binary 코드로 컴파일
- binary 코드를 패키징
- 코드 테스트 실행
- 프로덕션 시스템에 배포
💡 빌드(Build)란?
소스코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정과 결과
빌드 관리 도구를 사용하는 이유?
- 대규모 프로젝트에서 위와 같은 빌드 프로세스를 수동으로 호출하는 것은 실용적이지 않다
- 어떤 순서로 할지, 어떤 의존성이 있는지 모두 추적하기 쉽지 않다
- 하지만 빌드 관리 도구를 사용하면 라이브러리 추가 및 버전 동기화에 특화적이다
- 따라서 빌드드 도구를 사용하면 이를 일관되게 할 수 있기 때문에 빌드 관리 도구를 사용한다
빌드 관리 도구 역사
1세대 - Make
- 빌드 개념을 확립
- Unix 계열 OS에서 사용
2세대 - Ant
- 범용성을 높임 (크로스 플랫폼 대응)
- Make를 Java에서 적용하려다 보니 문제가 있어서 이를 보완하기 위해 탄생
- Java + XML 도입
3세대 - Maven
- 작성 효율을 높임
- 빌드 생명 주기와 프로젝트 객체 모델(POM) 개념을 도입 -> Ant의 문제점인 장황한 빌드 스크립트 문제를 해결
4세대 - Gradle
- 스크립트 언어로 유연성을 증대
- Maven보다 빠름
- 기존 Maver, Ivy 등 다른 빌드 도구와 호환 가능
Maven
// maven 예시
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
- Apache Maven은 자바용 프로젝트 관리 도구로, 아파치 Ant의 대안으로 만들어졌으며 아파치 라이센스로 배포되는 오픈 소스 소프트웨어이다
- POM(Project Object Model) 개념 기반으로 만들어졌으며 빌드 중인 프로젝트, 빌드 순서, 다양한 외부 라이브러리의 종속성 관계들을 pom.xml 파일에 명시한다
- 즉, pom.xml을 이용한 정형화된 빌드 시스템이다
- 외부 저장소에서 필요한 라이브러리와 플러그인들을 다운로드 및 업데이트 한 다음, 로컬 시스템의 캐시에 모두 저장한다
- 이 때 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데 필요한 다른 라이브러리들까지 네트워크를 통해 자동으로 다운받는다
- 뛰어난 프로젝트 정보와 개발 가이드라인을 제공한다
- 정해진 라이프사이클에 의하여 작업을 수행하며, 전반적인 프로젝트 관리 기능도 포함하고 있다
💡 POM - Project Object Model
pom은 Project Object Model의 약자로, POM의 정보를 담고 있는 파일이다
이 파일에서 주요하게 다루는 기능들은 다음과 같다
- 프로젝트 정보 : 프로젝트의 이름, 개발자 목록, 라이센스 등
- 빌드 설정 : 소스, 리소스, 라이프 사이클 별 실행한 플러그인(goal) 등 빌드와 관련된 설정
- 빌드 환경 : 사용자 환경 별로 달라질 수 있는 프로파일 정보
- POM 연관 정보 : 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등
POM은 pom.xml 파일을 말하며, Maven의 기능을 이용하기 위해 POM이 사용된다
Maven 설정파일
1. setting.xml
- 메이븐을 빌드할 때 의존 관계에 있는 라이브러리와 플러그인을 중앙저장소→로컬저장소(개발자 PC)로 다운로드하게 되어있다
- 그리고 로컬저장소의 기본 위치는 USER_HOME/.m2/repository인데, setting.xml를 통해 원하는 로컬 저장소의 경로를 지정 및 변경할 수 있다.
2. pom.xml
- root에 존재하는 xml파일로, 프로젝트마다 1개씩 가지고 있다
- 필요한 라이브러리를 pom.xml에 정의하면, 해당 라이브러리 실행, 설치에 필요한 다른 라이브러리까지 관리하고 네트워크를 통해서 자동으로 다운받아준다.
Maven 특징
- LifeCycle : 정해진 LifeCycle에 의하여 작업을 수행하며, 전반적인 프로젝트 관리 기능을 포함하고 있다
- 프로젝트 모델링 : Maven은 필요한 라이브러리를 pom.xml에 정의한다
- 플러그인을 통한 전역적인 재사용 : Maven은 빌드에 대한 대부분의 책임을 각 플러그인에 위임한다. 이러한 플러그인들은 Maven 저장소(Repository)에 저장된다
- 공통 인터페이스 : 메이븐 이전에는 각 개발환경에 대한 빌드 프로세스를 파악하는데 시간이 오래걸렸다
Maven의 LifeCycle
maven에서는 미리 정의하고 있는 빌드 순서가 있으며 이 순서를 라이프사이클이라고 한다
라이프 사이클의 빌드 단계를 Phase라고 하는데 이런 Phase들은 의존 관계를 가지고 있기 때문에 다음 Phase가 실행되려면 이전 단계의 Phase가 모두 실행되어야 한다
maven에서 제공되는 모든 기능은 플러그인 기반으로 동작하는데 maven은 LifeCycle에 포함되어 있는 Phase마저도 플러그인을 통해 실질적인 작업이 수행된다
즉, 각각의 Phase는 어떤 일을 할지 정의하지 않고 어떤 플러그인의 Goal을실행할 지 설정한다
- Default(Build) : 일반적인 빌드 프로세스를 위한 모델이다
- Clean : 빌드 시 생성되었던 파일들을 삭제하는 단계
- Validate : 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계
- Compile : 프로젝트의 소스코드를 컴파일 하는 단계
- Test : 유닛(단위) 테스트를 수행 하는 단계(테스트 실패시 빌드 실패로 처리, 스킵 가능)
- Pacakge : 실제 컴파일된 소스 코드와 리소스들을 jar, war 등등의 파일 등의 배포를 위한 패키지로 만 드는 단계
- Verify : 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인하는 단계
- Install : 패키지를 로컬 저장소에 설치하는 단계
- Site : 프로젝트 문서와 사이트 작성, 생성하는 단계
- Deploy : 만들어진 package를 원격 저장소에 release 하는 단계
maven에서는 하나의 플러그인에서 여러 작업을 수행할 수 있도록 지원하며, 플러그인에서 실행할 수 있는 각각의 기능을 goal이라고 한다
플러그인의 goal을 실행하는 방법은 다음과 같다
- -mvn groupId:artifactId:version:goal (아래와 같이 생략가능)
- -mvn plugin:goal
Gradle
// gradle 예시
providedCompile group: 'org.projectlombok', name: 'lombok', version: '1.18.16'
- Groovy를 이용한 빌드 자동화 시스템
- Ant와 Maven의 장점을 모아 출시 되었으며, Maven의 후속 주자인 만큼 Maven보다 장점이 많다
- 기본 Maven의 경우 XML로 라이브러리를 정의하고 활용하도록 되어 있으나, Gradle의 경우 별도의 빌드 스크립트를 통하여 사용할 어플리케이션 버전, 라이브러리 등의 항목을 설정할 수 있다
- 또한 XML과 달리 스크립트 언어로 구성되어 있기 때문에 변수 선언, if/else, for 등의 로직이 구현 가능하여 간결하게 구성 가능하다
- 라이브러리 관리 : maven repository를 동일하게 사용할 수 있어서 설정된 서버를 통하여 라이브러리를 통하여 라이브러리를 다운로드 받아 모두 동일한 의존성을 가진 환경을 수정할 수 있다. 자신이 추가한 라이브러리도 레퍼지토리 서버에 올릴 수 있다
- 프로젝트 관리 : 모든 프로젝트가 일관된 디렉토리 구조를 가지고 빌드 프로세스를 유지하도록 도와준다
- 단위 테스트 시 의존성 관리 : junit 등을 사용하기 위해서 명시한다
- Ant처럼 유연한 범용 빌드 도구, Maven을 사용할 수 있는 변환 가능 컨벤션 프레임 워크 등의 장점이 있다
- 빌드, 프로젝트 구성 및 관리, 테스트, 배포 도구
- 안드로이드 앱의 공식 빌드 시스템
- 빌드 속도가 Maven에 비해 10~100배 가량 빠르다
- Java, C/C++, Python 등을 지원한다
- 빌드 툴인 Ant Builder와 Groovy 스크립트 기반으로 만들어져 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용할 수 있다
- 설정 주입 방식을 사용하기 때문에 편리하지만, 메모리를 많이 차지한다는 단점 또한 존재한다
💡 Groovy란?
- JVM에서 사용되는 스크립트 언어로, 문법이 Java와 매우 유사하다
- Java와 호환이 되며 Java 클래스 파일을 그대로 Groovy 클래스 파일로 사용 가능하다
Gradle 설정 파일
1. setting.gradle
- 프로젝트 구성을 설정할 때 작성하는 파일이다
- 보통 프로젝트간의 의존성 및 서브프로젝트, 교차 프로젝트 같은 멀티 프로젝트를 구성할 때 사용한다
- 단, 싱글 프로젝트의 경우에는 생략이 가능하다
2. build.gradle
- 간단하게, 빌드에 대한 모든 기능을 정의하는 파일이다
- 프로젝트에서 사용하는 환경 설정, 빌드방법, 라이브러리 정보 등을 기술함으로서 빌드 및 프로젝트의 관리환경을 구성한다
Gradle 특징
- 간결함: xml의 구조적인 장점이 있지만 문서의 양 자체가 비대하지는 단점이 있는데, Gradle은 코딩에 의한 간결한 정의가 가능하다
- 재사용에 용이: 프로젝트 설정 주입 방식(Configuration Injection)으로 정의하여 Maven의 상속 구조보다 재사용에 용이하다
- 구조적인 장점: Build Script를 xml이 아닌 Groovy기반의 DSL(Domain Specific Language)를 사용하여 코드로서 설정정보를 구성하기 때문에 구조적인 장점이 있다
- 편리함: Gradle 설치 없이 Gradle Wrapper를 이용하여 빌드를 지원한다
- 멀티 프로젝트: 애초에 멀티 프로젝트 빌드를 지원하기 위해 설계된 빌드 관리 도구이다
- 지원: Maven과 Ivy repository를 완전 지원한다
Gradle의 LifeCycle
1. 초기화 (initialization)
- 빌드 대상 프로젝트를 결정하고 각각에 대한 Project 객체를 생성한다
- settings.gradle 파일에서 프로젝트를 구성한다
2. 구성 (Configuration)
- 빌드 대상이 되는 모든 프로젝트의 블드 스크립트를 실행한다
3. 실행 (Execution)
- 구성 단계에서 생성하고 설정된 프로젝트의 태스크 중에 실행 대상을 결정한다
- gradle 명령행에서 지정한 태스크 이름 인자와 현재 디렉토리를 기반으로 태스크를 결정하여 선택된 태스크들을 실행한다
🤔 Maven vs Gradle
요즘 Gradle을 더욱 많이 사용하는 추세이지만, 여전히 Maven의 사용률은 Gradle을 앞서고 있다
그럼에도 Gradle 사용을 고려해야 할 이유는 다음과 같다!
1. 속도가 빠르다
Gradle에서 제공하는 "Gradle va Maven Comparison" 문서에 따르면 Gradle은 Maven에 비해 최대 100배까지 빠르게 동작한다고 한다
Gradle은 캐시를 사용하기 때문에 빌드와 테스트 실행 결과가 더 빠르고, 이는 테스트 반복 시 차이가 더 커진다
https://gradle.org/maven-vs-gradle/
2. Build라는 동적인 요소를 XML로 정의하기에 어려운 부분이 많다
- 가독성
- Maven의 경우 XML로 정의하기 때문에 설정 내용이 길어지고 가독성이 떨어진다
- 이에 비해 Gradle은 훨씬 적은 양의 스크립트로 짧고 간결하게 작성이 가능하다
- 의존 관계가 복잡한 프로젝트 설정을 하기에는 부적절하다
- Maven의 경우 상속 구조를 이용하여 멀티 모듈을 구현해야 한다
- 하지만 Gradle은 설정 주입 방식을 사용하기 때문에 멀티 프로젝트에 적합하다
- 특정 설정을 소수의 모듈에서 공유하기 위해서는 부모 프로젝트를 생성하여 상속하게 해야 한다
3. Gradle은 Groovy를 사용하기 때문에, 동적인 빌드는 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 된다
- Configuration Injection 방식을 사용해서 공통 모듈을 상속해서 사용하는 단점을 극복했다
- 설정 주입 시 프로젝트의 조건을 체크할 수 있어서 프로젝트 별로 주입되는 설정을 다르게 할 수 있다
Q. 진짜 Gradle은 Maven보다 빠를까..?
https://www.holaxprogramming.com/2017/07/04/devops-gradle-is-faster-than-maven/
참고)
https://wangmin.tistory.com/50
https://velog.io/@alicesykim95/Maven%EA%B3%BC-Gradle%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
'야미스터디 > Spring' 카테고리의 다른 글
[Spring] Spring vs EJB 📌 (1) | 2022.09.20 |
---|---|
[Spring] bean vs component 📌 (0) | 2022.09.08 |
[Spring] Spring Servlet 📌 (0) | 2022.08.13 |
[Spring] Spring vs Spring Boot 📌 (0) | 2022.08.02 |
[Spring Boot] Gradle 버전과 OAuth2.0 구현 관련 (0) | 2022.04.12 |
댓글