본문 바로가기
백엔드(Back-End)/Java

[Java] - 자바 빌드 도구 Maven, Gradle 정리

by TwoJun 2023. 10. 19.

Build tools - Gradle and Maven

스프링 프로젝트를 진행함에 따라, 자바에서 많이 사용되고 있는 빌드 도구(Build tool)인 GradleMaven에 대해 정리하고자 한다.

 

 

 

 

 

1. 빌드 도구(Build tool)란 무엇일까?

1-1. 빌드(Build)

(1) 빌드 과정은 작성된 소스코드를 컴퓨터에서 실행할 수 있는 독립적인 결과물의 형태로 변환하는 과정을 의미한다.

 

(2) 작성된 소스코드(.java), 프로젝트에서 사용된 각각의 파일과 리소스를 자바 가상 머신(Java Virtual Machine)이나 Tomcat같은 WAS(Web Application Server)가 인식할 수 있도록 패키징하는 과정 및 결과물이라고 볼 수 있겠다.

 

(3) 빌드 과정에서 발생하는 작업

- 종속성 다운로드, 소스 코드를 바이너리 코드로 컴파일, 바이너리 코드 패키징, 테스트 실행, 프로덕션 레벨 시스템에 배포

 

 

 

 

1-2. 빌드 관리 도구(Build Management tool)

(1) 보통 프로젝트에서 개발을 진행할 때 여러 가지 라이브러리를 함께 사용하면서 개발을 진행하게 된다. 이때 빌드 관리 도구가 개발에 필요한 라이브러리들을 자동으로 관리해 준다.

 

 

 

 

 

2. Maven의 정의와 특징, 라이프 사이클(Life-Cycle)

2-1. Maven의 정의

(1) Java 전용 프로젝트의 라이프 사이클(Life Cycle, 생명 주기)을 관리하기 위한 목적으로 설계된 Java 빌드 도구이며 기존 빌드 도구였던 Apache Ant의 불편함을 해결하기 위해 등장했다.

 

 

 

 

2-2. Maven의 여러 가지 특징

(1) 라이프 사이클 관리

- 정해진 라이프 사이클에 따라 작업을 수행하게 되며 전반적인 프로젝트 관리 기능을 포함하고 있다.

 

(2) 프로젝트 모델링

- Maven의 경우 개발 시 필요한 라이브러리를 pom.xml에 정의하게 된다.

 

(3) 플러그인을 통한 전역적인 재사용 가능

- Maven의 경우 빌드에 대한 대부분의 책임을 각 플러그인에 위임하는 특징을 가진다. 이러한 플러그인들은 Maven Repository에 저장된다.

 

 

(4) 공통 인터페이스(Common Interface) 기능

- 공통 인터페이스는 Maven의 플러그인을 개발하는 데 사용되는 API이고, 이러한 플러그인은 빌드 수행 중 특정 작업을 수행하거나 프로젝트를 다양한 방법으로 확장하는 데 사용된다.

 

- Maven 이전에는 각 개발 환경에 대한 빌드 프로세스를 파악하는 데 많은 시간이 소요되었다. 하지만 Maven을 사용함으로써 플러그인 개발자에게 빌드 프로세스에 참여할 수 있는 방법을 제공할 수 있다.

 

 

 

 

2-3. Maven의 설정 파일

(1) settings.xml

- Maven의 빌드 과정을 제어하고 빌드에 필요한 구성 정보를 포함하고 있는 파일

 

- 개발 환경의 홈 디렉토리에 .m2 디렉토리를 생성하고 내부에 settings.xml 파일을 생성한다. 해당 경로에 파일을 두게 되면 관련된 설정들이 전체 시스템에 우선적으로 적용된다.

 

 

(2) pom.xml

- 프로젝트의 루트 디렉토리에 존재하는 xml 파일로써 프로젝트마다 1개씩 가지고 있다. 필요한 라이브러리들을 pom.xml에 정의하면 해당 라이브러리의 실행 및 설치에 필요한 다른 라이브러리까지 함께 관리하고 네트워크를 통해 자동으로 다운로드받게 된다.

 

 

(3) 추가 - 라이브러리가 의존 관계에 있다는 것은?

- 특정 라이브러리가 다른 코드나 프로그램의 일부분으로 사용되어 해당 코드나 프로그램이 정상적으로 동작하기 위해 해당 라이브러리가 필요하다는 의미를 가지고 있다.

 

- 만약 자바 웹 애플리케이션에서 데이터베이스 연결을 위해 JDBC 라이브러리를 사용한다고 가정해 보면, 해당 프로젝트는 JDBC 라이브러리에 의존하고 있고 이러한 JDBC 라이브러리가 없다면 해당 웹 애플리케이션은 데이터베이스와 통신할 수 없게 된다.

 

 

 

 

2-4. Maven의 라이프 사이클

메이븐의 라이프 사이클

 

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

 

 

 

 

 

3. Gradle의 정의와 특징, 라이프 사이클(Life-Cycle)

3-1. Gradle의 정의

(1) Maven을 대체할 수 있는 자바 프로젝트 구성 관리 및 빌드 관리 도구이며 Ant Builder와 Groovy Script를 기반으로 구축되어 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용하고 있으며 스프링 부트 프로젝트에서 활발하게 사용된다.

 

 

 

 

3-2. Gradle의 여러 가지 특징

(1) 간결함

- xml의 구조적인 장점이 존재하지만 문서의 양 자체가 매우 커지는 단점이 있었다. 하지만 Gradle을 사용할 경우 보다 간결한 문법으로 라이브러리 등을 정의할 수 있다.

 

(2) 재사용성 용이

- 프로젝트 설정 주입 방식(Configuration Injection)으로 정의하여 Maven이 갖는 상속 구조보다 재사용성이 용이하다.

 

(3) 구조적인 장점

- 빌드 스크립트를 xml이 아닌 Groovy 기반의 도메인 특화 언어(Domain Specific Language)를 사용하여 코드로써 설정 정보를 구성하기 때문에 구조적인 장점이 존재한다.

 

- 여기서 Groovy는 자바 가상 머신에서 사용되는 스크립트 언어로 Java와 문법이 유사한 편이다. Java와 호환되며 Java의 클래스 파일을 Groovy 클래스 파일로 사용할 수 있다.

 

 

(4) 편리함

- Gradle 설치 없이 Gradle Wrapper를 이용한 빌드를 지원하고 있다.

 

(5) 호환성

- Maven, Ivy Repository를 완벽하게 지원한다.

 

 

 

 

3-3. Gradle Configuration 파일

(1) settings.gradle

- 프로젝트의 구성 정보를 설정할 때 작성할 수 있는 Gradle 파일로써 일반적으로 프로젝트 간의 의존성 및 프로젝트에 대한 멀티 프로젝트를 구성할 때 사용할 수 있다. 싱글 프로젝트 규모에선 생략 가능하다.

 

(2) build.gradle

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

 

 

 

 

3-4. Gradle의 라이프 사이클

The 3 Build life-cycle phases with their output - https://proandroiddev.com/understanding-gradle-the-build-lifecycle-5118c1da613f

(1) 초기화(Initialization)

- 빌드 대상 프로젝트를 결정하고 각각에 대한 프로젝트 객체를 생성한다. settings.gradle 파일과 프로젝트의 기본 구성이 로드된다.

 

(2) 설정(Configuration)

- 빌드 스크립트인 build.gradle이 실행되어 프로젝트의 구성 정보가 설정된다. 의존성 관리와 플러그인 설정이 해당 단계에서 이루어진다.

 

(3) 실행(Execution)

- 해당 단계에서 실질적인 빌드 작업이 수행된다. build.gradle에 정의된 태스크들이 실행되며 프로젝트의 코드를 컴파일하고 패키징하며 테스트를 수행하게 된다.

 

(4) 완료(Finalization)

- 빌드가 성공적으로 수행되었다면 최종적으로 마지막 정리 작업이 시작된다. 리소스의 정리나 보고서 생성 등의 작업이 수행된다.

 

- Gradle은 이러한 빌드 태스크의 라이프 사이클을 관리해 주므로 사용자는 각 단계에서 필요한 작업을 명시적으로 정의하지 않아도 된다는 특징이 있다. 사용자가 특별한 작업을 추가하거나 수정이 필요할 때는 해당 라이플 단계에 대응되는 작업들을 정의할 수 있다.

 

 

 

 

 

4. Reference

(1) https://proandroiddev.com/understanding-gradle-the-build-lifecycle-5118c1da613f

 

Understanding Gradle: the Build Lifecycle

It is quite easy to find articles about “how to create gradle custom tasks”, “how to decrease build time”, “how to structure gradle build…

proandroiddev.com

 

※ 해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.

개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있으며, 이에 대해 댓글로 알려주시면 감사하겠습니다!

댓글