이전에 스프링부트 프로젝트를 진행할 때, Maven을 사용하여 개발했었다.
Maven과 Gradle이 대표적인 JAVA의 빌드 관리 도구라는 것은 알고 있었지만, 그 둘의 정확한 차이는 무엇인지, 뭐가 다른 건지 궁금해졌다.
오늘 포스팅에서는 Maven과 Gradle, 그리고 그 둘의 차이점을 비교해보고 새로 시작하는 프로젝트에서 어떤 빌드 관리 도구를 선택하는 게 이로울지 정리해보는 시간을 가지도록 하자!
빌드란 무엇일까?
먼저, 빌드(Build)의 단어 뜻은 '짓다'라는 뜻으로 모두가 알고 있을 것이다. 건물을 짓는다고 생각을 해볼 때, 우리는 설계도가 필요하고, 기초 공사를 하고, 철근을 세우고, 벽을 세우고... 등 다양한 과정들을 거쳐 완성하게 된다. 프로그래밍에서도 마찬가지이다. 빌드란 소스코드를 실행할 수 있는 소프트웨어로 만드는 과정을 말한다. 다시 말하자면, 우리가 작성한 소스코드 (Java) 및 프로젝트에서 쓰인 각각의 파일 및 리소스 등을 톰캣 같은 WAS 또는 JVM이 인식할 수 있도록 패키징 하는 과정이다.
그렇다면 빌드 관리 도구는 무엇인가?
소스코드에서 애플리케이션을 생성할 때, 보통 작성한 코드만으로 개발을 하는 것이 아니라 다양한 라이브러리들을 사용하게 된다. 이 때, 사용하는 라이브러리의 개수가 너무 많아지게 되면 이 라이브러리들을 관리하는 데 힘들어질 것이다.
프로젝트를 빌드하는 사람의 입장에서 생각해보자. Maven과 같은 빌드 관리 도구가 없어도 물론 프로젝트 개발은 가능하다.
하지만 다음 상황을 가정해보자.
jar파일이 굉장히 많은 것을 알 수 있다... 이렇게 spring이면 spring, mybatis, oracle, jstl 등, 필요한 라이브러리가 있을 때마다 꼭 추가를 해야한다. 그런데 사용하는 Spring의 버전을 바꿔야되는 일이 발생한다면? ... 여간 불편한 것이 아니다.
여기서 빌드 관리 도구는 이러한 라이브러리들을 자동으로 관리하는 역할을 한다.
좀 더 자세히 말하자면, 프로젝트에서 필요한 xml, properties, jar와 같은 파일들을 자동으로 인식하여 빌드해주는 도구이다. 소스코드를 컴파일, 테스트 등을 통해 실행가능한 앱으로 빌드할 뿐만 아니라, 프로젝트 정보 관리, 배포 등의 작업도 진행할 수 있다. 위에서 말한 것 처럼 외부 라이브러리를 참조하여 자동으로 다운로드 및 업데이트도 가능하다.
Maven (메이븐)?
Maven은 사용하고자 하는 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해 자동으로 다운받아준다. 메이븐은 프레임워크이기 때문에 동작 방식이 정해져있다. Maven은 메이븐 홈페이지에서 설치할 수 있다.
공식 문서에 따르면 Maven은 Build lifecycle의 개념에 기초하여 만들어졌고, 이는 프로젝트를 빌드하고 배포하는 프로세스가 명확하게 정의된다는 것을 뜻한다고 한다. Maven의 경우 간단한 명령어들만 알고 있다면, POM이 라이브러리 관리에 필요한 작업을 해주게 된다.
Maven은 빌드에 대한 대부분의 책임을 각 플러그인에 위임한다. 이러한 플러그인들은 Maven 저장소(Repository)에 저장되어 진다.
Maven의 Lifecycle
메이븐에는 정의하고 있는 빌드 순서, 즉 Lifecycle(라이프사이클)이 있다. 즉, 빌드 순서를 정의할 수 있게 되었다. Maven의 모든 라이프사이클은 공식 홈페이지에서 확인이 가능하다. 공식 문서에 따르면 라이프사클은 크게 '프로젝트를 삭제하는 Clean 라이프사이클', '프로젝트를 배포하는 Default 라이프사이클', '프로젝트의 웹 사이트를 만드는 Site 라이프사이클', 이렇게 총 3개의 라이프사이클로 나뉜다.
위의 모든 라이프사이클을 전부 수행하는 것이 아니라, 원하는 단계만 수행할 수도 있다. 예를 들어 test의 경우, 큰 프로젝트에서는 몇 시간이 소요되기도 하기 때문에 생략할 수 있다.
POM (Project Object Model)
(특정 프로젝트에 종속되는 정보가 아닌, Maven 실행에 필요한 설정들을 정의하는 파일인 settings.xml도 존재한다.)
Maven 프로젝트를 생성하게 되면 pom.xml 이 자동으로 생성되게 된다. 여기서 pom.xml이 바로 POM이고, Maven의 기능을 이용하기 위해 사용된다. POM은 Project Object Model의 정보를 담고있는 파일이고, 이 파일을 통해 편리하게 Dependency 관리를 할 수 있다.
- 프로젝트 정보 : 프로젝트의 이름, 개발자 목록, 라이센스 등
- 빌드 설정 : 소스, 리소스, 라이프사이클 별 실행한 플러그인(goal)등 빌드와 관련된 설정
- 빌드 환경 : 사용자 환경 별로 달라질 수 있는 프로파일 정보
- POM 연관 정보 : 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
... 내용 생략
하지만 XML 기반의 빌드 스크립트이기 때문에, 대규모 프로젝트일 경우에는 관리가 어려울 수 있다.
Gradle (그래들)?
Gradle은 Groovy 스크립트를 활용한 빌드 관리 도구이다.
안드로이드 프로젝트의 표준 빌드 시스템으로 채택되기도 한 공식 빌드 시스템이며, JAVA, C/C++, Python 등을 지원한다.
또한 Gradle Wrapper을 사용하여 설치 없이 사용할 수도 있다.
👉 Groovy란?
JVM에서 사용되는 스크립트 언어로, 문법이 Java와 매우 유사하다. Java와 호환이 되며 Java 클래스 파일을 그대로 Groovy 클래스 파일로 사용 가능
Gradle의 Lifecycle
공식 문서에서 정의하는 그래들의 빌드 라이프사이클은 3단계이다.
빌드 대상 프로젝트를 결정하고 각각에 대한 프로젝트를 생성하는 초기화(Initialization) 단계,
빌드 대상이 되는 모든 프로젝트의 빌드 스크립트를 실행하는 구성(Configuration) 단계,
구성 단계에서 생성하고 설정된 프로젝트의 태스크 중 실행 대상을 결정하는 실행(Execution) 단계이다.
Gradle에서 빌드에 대한 모든 기능의 정의는 build.gradle에 있다. (프로젝트 구성 설정은 settings.gradle 파일 안에 있다.)
plugins {
id 'org.springframework.boot' version '2.3.2.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
// Apply the application plugin to add support for building a CLI application in Java.
id 'application'
}
group = 'com.lim'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
Gradle은 Maven보다 어떤 점이 더 좋을까?
- Maven의 경우, XML로 라이브러리를 정의하고 활용한다. 하지만 Gradle의 경우, 별도의 빌드스크립트를 통하여 사용할 어플리케이션의 버전 및 라이브러리등의 항목을 설정 할 수 있다.
- 또한 Gradle은 Groovy 스크립트 언어로 구성되어 있기때문에, XML과 달리 변수선언, if, else, for등의 로직이 구현가능하여 Maven보다 더 간결한 구성이 가능하다.
- 간략하게 구성되어있고 Build 단계에서 기존에 Build한 기록이 있고 변경된 사항이 없다면 스킵하기 때문에 Maven보다 처리 속도가 빠르다 (최대 100배)
- Gradle은 설정 주입 방식 (Configuration Injection)으로 정의하여 Maven의 상속 구조보다 재사용에 용이하다. 즉, 공통 모듈을 상속해서 사용하는 Maven의 단점을 커버한다.
- 설정 주입 시 프로젝트의 조건을 체크할 수 있어, 프로젝트 별로 주입되는 설정을 다르게 할 수 있다.
그래서 프로젝트에서 어떤 걸 쓰면 좋을까?
아직 시작 점유율은 Maven이 크지만, 위에서 언급한 장점들 때문에 현재는 Gradle로 넘어오는 추세라고한다.
물론 기업들의 입장에서 기존의 Maven과 익숙한 XML을 버리고 Gradle과 Groovy 문법을 배우는 것은 분명 쉬운 일은 아닐 것이다.
하지만 빌드 속도를 포함한 여러가지 이점들을 비교해보면 Gradle을 사용하는 것이 훨씬 효율적이라고 생각된다.
또한 나는 새로운 프로젝트를 진행하는 것이다 보니, 더더욱 Gradle을 사용하지 않을 이유가 없다! 실제로 Maven을 이용한 프로젝트의 설정 파일을 연습삼아 Gradle로 옮겨본적이 있었는데 약 200줄에서 절반 가량인 100줄 미만으로 줄일 수 있었다. 작은 프로젝트였지만, 대규묘 프로젝트라고 가정한다면 그 간결함은 더더욱 커질 것이다 (2800줄에서 650줄로 줄인 개발자 분의 포스팅도 봤다...!)
'𝑾𝑬𝑩 > 𝑆𝑃𝑅𝐼𝑁𝐺' 카테고리의 다른 글
[Spring] AOP (0) | 2022.11.19 |
---|---|
JPA 와 MyBatis 의 차이 (ORM, SQL Mapper) (0) | 2022.11.17 |
[Spring] REST API, REST, RESTful 이란? (0) | 2022.11.05 |
[Spring] JAR or WAR 차이 (0) | 2022.11.03 |
[Spring] DI, 의존성을 주입하는 여러가지 방법 (0) | 2022.04.05 |