[JAVA] 자바 빌드 도구 종류? Maven, Gradle 차이점, 장단점, 플러그인/spring build tools, plugins
안녕하세욥 민zero입니다 ㅎ
저번 글에서 자바에 대한 개발 환경, 자바 빌드 도구 종류 등에 대해 알아봤습니다.
[JAVA] JDK 란?JRE 란? 빌드도구란? Ant란? Gradle이란? Maven이란?(build tools)
이어서 Maven이랑 Gradle에 대해 자세히 알아볼게요
🪶메이븐(Maven)이란?
자바용 프로젝트 관리 도구로 Apache Ant의 대안으로 만들어졌다.
Maven 특징
- 빌드 절차를 간소화하여 쉽게 만들 수 있다.
- 정형화된 빌드 시스템을 제공한다.
- Pom.xml 파일을 통해 프로젝트를 빌드한다.
- 양질의 프로젝트 정보를 제공한다.
Maven 빌드 과정(Maven *LifeCycle)
*LifeCycle: 미리 정의하고 있는 빌드 순서를 라이프사이클이라고 한다. 각 빌드 단계를 phase라 하며 각 phase들은 의존 관계를 가지고 있다.
Clean
: 빌드 시 생성되었던 Output 및 파일들을 지워주는 단계Vaildate
: 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계Compile
: 프로젝트의 소스 코드를 컴파일 하는 단계Test
: 유닛(단위) 테스트를 수행하는 단계(테스트 실패 시 빌드 실패로 처리, 스킵 가능)Package
: 실제 컴파일 된 소스 코드와 리소스들을 jar 파일 등의 배포를 위한 패키지로 만드는 단계Install
: 패키지를 로컬 저장소에 설치하는 단계Default(Build)
: 일반적인 빌드 프로세스를 위한 모델이다.Site
: 프로젝트 문서와 사이트 작성, 생성하는 단계Deploy
: 만들어진 package를 원격 저장소에 release 하는 단계
*pom.xml 예시(플러그인, 의존성 추가를 위한 파일)
*POM: Project Object Model
<?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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>start.spring</groupId>
<artifactId>spring-start</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<name>FITT_OAUTH</name>
<description>FITT_OAUTH</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/><!-- lookup parent from repository-->
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</plugin>
</plugins>
</build>
</project>
필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 네트워크를 통해서 라이브러리들을 자동으로 다운 받아 준다. 즉, Maven을 사용하면 jar 파일을 공유하지 않아도 pom.xml에 필요한 것을 명시하여 라이브러리를 아주 쉽게 관리할 수 있다.
▶ 용어 정리
project
: pom.xml 파일의 최상위 루트 엘리먼트(Root Element)modelVersion
: POM model의 버전groupId
: 프로젝트를 생성하는 조직의 고유 아이디를 결정. 일반적으로 도메인 이름을 거꾸로 적는다.artifactId
: 해당 프로젝트에 의하여 생성되는 artifact의 고유 아이디를 결정. Maven을 이용하여 pom.xml을 빌드할 경우 다음과 같은 규칙으로 artifact가 생성.- artifacid-version.packaging. 위 예의 경우 빌드할 경우 examples-1.0-SNAPSHOT.jar 파일이 생성됩니다.
packaging
: 해당 프로젝트를 어떤 형태로 packaging 할 것인지 결정. jar, war, ear 등이 해당된다.version
: 프로젝트의 현재 버전. 추후 살펴보겠지만 프로젝트가 개발 중일 때는 SNAPSHOT을 접미사로 사용한다. Maven의 버전 관리 기능은 라이브러리 관리를 편하다.name
: 프로젝트의 이름url
: 프로젝트 사이트가 있다면 사이트(URL) 등록을 가능하게 한다.
Maven 장단점
장점 | 단점 |
컴파일과 빌드를 동시에 수행할 수 있다. | Meven에서 기본적으로 지원하지 않는 빌드 과정을 추가해야 하는 경우 힘들 수 있다. |
서버의 Deploy 자원을 관리할 수 있는 환경을 제공한다. | 특정 플러그인이 설정이 다를 때 해당 설정이 분리해서 중복 기술할 때가 있다. 이때 불필요하게 설정이 길어지고 중복, 가독성 저하가 발생하여 유지 보수성이 떨어진다. => 이를 해결하기 위해 Gradle이 등장 |
pom.xml 파일을 통해 관리하므로 개발, 유지보수 측면에서 오픈소스 라이브러리, 프로젝트 등 관리가 용이하다. | |
IDE에 종속된 부분들을 제거할 수 있다. | |
Maven *Profile 기능을 통해 배포 설정 파일을 관리하고 배포 파일을 생성할 수 있다. | |
war 파일 기반의 배포용으로도 자주 사용된다. |
*Profile: Maven은 서로 다른 환경에 따라 달라지는 설정을 각각 관리할 수 있는 Profile 기능을 제공한다.
Maven 핵심 *플러그인
*플러그인(plugin): 사람들이 자주 사용할 만한 기능들을 직접 일일이 구현할 필요 없이 필요한 기능들만 그때 그때 찾아서 사용할 수 있도록 미리 만들어 놓은 것
플러그인 명 | 버전 | 설명 |
compiler | 3.9.0 | Java 소스를 컴파일합니다. |
deploy | 3.0.0-M2 | 빌드된 아티팩트를 원격 저장소에 배포합니다. |
failsafe | 3.0.0-M5 | 격리된 클래스로더에서 JUnit 통합 테스트를 실행합니다. |
install | 3.0.0-M1 | 빌드된 아트팩트를 로컬 저장소에 설치합니다. |
resources | 3.2.0 | 자원을 JAR에 포함하기 위해 출력 디렉토리에 복사합니다. |
site | 3.10.0 | 현재 프로젝트에 대한 사이트를 생성합니다. |
surefire | 3.0.0-M5 | 격리된 클래스로더에서 JUnit 단위 테스트를 실행합니다. |
verifier | 1.1 | 통합 테스트에 유용 - 특정 조건의 존재를 확입합니다. |
이외에도 많은 Maven 플러그인이 있습니다! 자세한 참고사항은 아래 링크를 확인해주세요
https://maven.apache.org/plugins/index.html
🐘그래들(Gradle)이란?
Ant와 Maven의 장점을 모아 2012년에 출시
Gradle 특징
- 설정 주입 방식(Configuration Injection)을 사용한다.
- 오픈소스 기반의 빌드 자동화 시스템으로 *Groovy 기반 DSL(Domain-Specific-Language)로 작성한다.
*Groovy : JVM에서 실행되는 스크립트 언어
- src/main/java : 배포할 자바 소스코드 디렉토리
- src/main/resources : 배포한 설정 파일 디렉토리
- gradle/wrapper 디렉토리 : 내장 task wrapper. 개발자들이 직접 gradle을 설치하지 않아도 빌드가 가능하다.
- gradlew : 리눅스 또는 맥 OS 용 실행 쉘 스크립트 파일이다.
- gradlew.bat : 윈도우용 실행 배치 스크립트 파일이다.
- gradle-wrapper.jar : JAR 형식으로 압축된 wrapper파일이다. gradlew나 gradlew.bat 파일이 프로젝트 안에 설치되는 이 파일을 사용하여 gradle task를 실행한다.
- gradle-wrapper.properties : gradle wrapper 설정정보 파일이다. wrapper의 버전등을 확인할 수 있다.
- build.gradle : 프로젝트의 라이브러리 의존성, 플러그인, 라이브러리 저장소등을 설정하는 빌드 스크립트 파일이다.
- settings.gradle : 프로젝트의 구성 정보 파일. 멀티 프로젝트를 구성하여 프로젝트를 모듈화할 경우, 하위 프로젝트의 구성을 설정할 수 있다.
Gradle 빌드 과정(Gradle LifeCycle)
1. Initialization
: 빌드 대상 프로젝트를 결정하고 각각에 대한 Project 객체를 생성하는 단계
2. Configuration
: 빌드 대상이 되는 모든 프로젝트의 빌드 스크립트를 실행하는 단계
3. Execution
: 구성 단계에서 생성하고 설정된 프로젝트의 태스크 중에 실행 대상 결정하는 단계
build.gradle (플러그인, 의존성 추가를 위한 파일)
/*
* This build file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java project to get you started.
* For more details take a look at the Java Quickstart chapter in the Gradle
* user guide available at https://docs.gradle.org/4.1/userguide/tutorial_java_projects.html
*/
// Apply the java plugin to add support for Java
apply plugin: 'java'
// Apply the application plugin to add support for building an application
apply plugin: 'application'
// In this section you declare where to find the dependencies of your project
repositories {
// Use jcenter for resolving your dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
}
dependencies {
// This dependency is found on compile classpath of this component and consumers.
compile 'com.google.guava:guava:22.0'
// Use JUnit test framework
testCompile 'junit:junit:4.12'
}
// Define the main class for the application
mainClassName = 'App'
pom.xml과 비슷하게 플러그인, 의존성 추가를 위한 파일이지만 pom.xml보다 훨씬 간결하고 작성하기 쉬운 장점을 가지고 있다.
▶ 용어 정리
repositories
: 빌드의 의존성 해결을 위해 Maven 중앙 저장소를 활용할 것을 선언dependencies
: 의존성 선언apply plugin
: 플러그인 추가mainClassName
: 메인클래스 이름compile
: 컴파일시 사용하는 라이브러리 지정testCompile
: 단위 테스트의 프로그램을 컴파일 할 때 사용할 라이브러리를 지정
Gradle 장단점
장점 | 단점 |
Groovy 언어를 이용하여 코드로서의 설정정보를 구성하기 때문에 구조적이다 | 기존 Maven을 사용했던 개발자들은 익숙해진 xml을 두고 Groovy 문법을 배우는 것은 적지 않은 비용이 든다. |
xml의 구조적인 틀을 벗어나 코딩에 의한 간결한 정의가 가능하다 | 단점이 잘 보이지 않는다 ... |
설정주입방식으로 정의하기 때문에 Maven의 상속 구조보다 재사용에 용이하다. | |
이미 반영된 빌드의 부분은 더이상 재실행되지 않는다.(빌드 시간이 매우 단축됨) | |
gradle을 통해 실행되는 단위 Task는 build.gradle에서 새로운 task를 추가하고 gradle 명령어로 호출 및 실행이 가능하다. |
Gradle 플러그인
gradle 플러그인은 핵심이라고 할 것 없이 프로젝트를 진행하면서 필요에 따라 검색해 사용하는 경우가 많다고 하네용
아래의 링크를 통해 필요한 플러그인을 검색해 사용해보세요 !
이제 그럼 이만 ,, !
'Programming' 카테고리의 다른 글
[OAuth2] 소셜 로그인 Kakao API 키 발급 방법 (2) | 2023.06.05 |
---|---|
[OAuth2] 소셜 로그인 Google API 키 발급 방법 (0) | 2023.05.31 |
slack, github 연동 방법 (0) | 2023.05.25 |
[JAVA] JDK 란?JRE 란? 빌드도구란? Ant란? Gradle이란? Maven이란?(build tools) (0) | 2022.03.17 |
파이썬(Python)이요롤레이? (0) | 2021.01.05 |
댓글