스프링 프로젝트를 진행함에 따라, 자바에서 많이 사용되고 있는 빌드 도구(Build tool)인 Gradle과 Maven에 대해 정리하고자 한다.
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의 라이프 사이클
(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
※ 해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.
개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있으며, 이에 대해 댓글로 알려주시면 감사하겠습니다!
'백엔드(Back-End) > Java' 카테고리의 다른 글
[Java] - 자바의 Error와 Exception 이해하기 (0) | 2023.11.06 |
---|---|
[Java] - 자바 가상 머신, JVM(Java Virtual Machine) (0) | 2023.10.19 |
[Java] - 추상 클래스(Abstract class), 추상 메서드(Abstract method) (0) | 2023.01.11 |
[Java] - 제어자, 접근 제어자, 캡슐화, 다형성 (0) | 2023.01.10 |
[Java] - 클래스의 상속, 메서드 오버라이딩, 참조변수 super, 생성자 super(), 패키지와 import 문 (0) | 2023.01.10 |
댓글