함께 성장하는 기록장

꾸준한 기록이 모여 도서관이 될 수 있도록

Spring

Maven vs Gradle

H-jinny 2024. 7. 4. 21:42

스프링부트 프로젝트를 진행하면서 자료를 찾아볼 때 Maven 자료가 꽤 많이 발견되었다. 스프링부트와 Gradle로 웹 개발을 시작한 나에게는 생소하기도 하고, Gradle에 적응해서인지 조금 읽기 힘들게 느껴졌다. 그래도 Maven이 먼저 나와 스프링을 이끌었고, 편의성을 추가한 Gradle이 나올 수 있었다고 생각한다. 어쨌든 Maven 구조를 알아두면 자료를 찾을 때 도움이 될 것 같아서 정리해보고자 한다.

 

 

빌드 관리 도구(Build Tool)

 

우선 Maven과 Gradle은 모두 빌드 관리 도구이다. 그렇다면 빌드의 개념을 알아야 할 필요가 있을 것 같다.

 

빌드(Build)란?

빌드란 소스 코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정 및 그 결과를 말한다. 빌드를 실행하면 프로젝트 내의 소스코드인 .java 파일을 컴파일러를 통해 .class 파일로 컴파일하고, 리소스들을 .class에서 참조할수 있는 적절한 위치로 옮겨 META-INF와 MANIFEST.MF들을 하나로 압축하는 과정이 이루어진다. 컴파일 된 코드를 실제 실행할 수 있는 상태로 만들게 되는 것이다.

 

컴파일

 고급 언어로 작성된 프로그램을 컴퓨터가 이해할 수 있는 기계어로 바꿔주는 과정을 의미한다. java의 경우 자바 가상 머신(JVM)에서 실행 가능한 .class 파일로 컴파일된다. 

 

빌드 관리 도구는 이러한 빌드 과정을 도와준다. 애플리케이션에서 외부 라이브러리들을 사용할 때, 라이브러리를 자동으로 추가 및 관리해준다. 또한 전처리(processing), 컴파일(compile), 패키징(packaging), 테스팅(testing), 배포(distribution)작업을 수행한다.

초기에는 Java 빌드 도구로 Apache Ant 가 있었지만, 스크립트 작성이 많고 의존관리가 되지 않아 Maven이 등장했다.

 

 

Maven

 

Maven은 Lifecycle 관리 목적의 빌드 도구이다. 정해진 Lifecycle에 의하여 작업을 수행하고, 프로젝트 관리 기능을 포함하고 있다. 메이븐은 필요한 라이브러리를 pom.xml에 정의하는 프로젝트 모델링을 수행한다. 이 때 네트워크를 통해 연관된 라이브러리와 연동되어 같이 관리가 된다.

 

clean - validate - compile - test - package - verify - install - site - deploy 의 LifeCycle

미리 정의하고 있는 빌드 순서인 라이프사이클은 각 빌드 단계인 Phase 가지고 있다.

(1) clena : 이전 빌드에서 생성된 파일들 삭제

(2) validate : 프로젝트가 올바른지 확인, 필요한 모든 정보를 사용할 수 있는지 확인

(3) compile : 프로젝트의 소스코드를 컴파일

(4) test : 단위 테스트 수행. 실패 시 빌드 실패로 처리, 스킵 가능

(5) package : 실제 컴파일된 소스 코드와 리소스들을 jar, war 등의 배포를 위한 패키지로 만듦

(6) verify : 통합 테스트 결과에 대한 검사 실행, 품질 기준을 충족하는지 확인

(7) site : 프로젝트 문서와 사이트 생성

(8) deploy : 만들어진 패키지를 원격 저장소에 release하는 단계

 

* 각 빌드 단계인 Phase는 의존 관계를 가지고 있으며 이전 단계가 모두 수행되어야 하며, 어떤 일을 할 것인지 정의하지 않고 어떤 플러그인의 Goal을 실행할지 설정한다.

POM(Project Object Model)

프로젝트와 관련된 정보를 담고 있는 파일이다. 프로젝트 정보(프로젝트 이름, 라이센스), 빌드 설정(소스, 리소스, 빌드와 관련된 설정), 빌드 환경(사용자 환경의 프로필 정보), pom 연관 정보(의존 프로젝트, 모듈, 상위 프로젝트 등)를 다룬다.

 

 

Gradle

Gradle은 빌드 툴인 Ant Builder와 Groovy 스크립트 언어로 구성된다. 메이븐과 달리 XML로 라이브러리를 정의하는 게 아니라 Groovy를 사용하여 어플리케이션 버전, 라이브러리 등을 관리하며 Java, C/C++, Python 을 지원한다. 별도의 빌드스크립트로 DSL(Domain Specific Language)를 사용하여 변수선언, 조건문, 반복문 등의 로직이 가능하여 간결하게 프로젝트와 라이브러리를 관리할 수 있다. 또한 설정수입 방식(Configuration Injection)으로 공통 모듈 상속하는 단점을 보완했다.

Groovy

JVM에서 실행되는 스크립트 언어로, 소스코드를 그대로 실행한다. 자바와 호환도 가능하다.

 

 

 

요약

Maven

- LifeCycle

- 프로젝트 모델링

- 플러그인을 통한 전역적인 재사용

- 공통 인터페이스

 

Gradle

- Groovy 를 통한 빌드

- 재사용 용이

- 구조적인 장점

 

Maven vs Gradle

- Maven : 자료의 양이 많음

- Gradle : 가독성이 좋음, 속도가 빠름, 편리

 

 

참고

Maven과 Gradle의 개념 및 비교 (velog.io)

Maven과 Gradle의 차이점 (velog.io)

메이븐(Maven)과 그래들(Gradle)의 개념 및 비교 (tistory.com)

Maven과 Gradle의 차이 (hyojun123.github.io)

 

 

 

오타, 지적 감사합니다 :)

'Spring' 카테고리의 다른 글

Spring이란?  (0) 2024.09.02
Spring MVC 구조와 레이어드 아키텍처  (0) 2024.07.09
Spring Security 알아보기 - 개념, 과정  (0) 2024.07.04