본문 바로가기

Programming

[JAVA] 자바 빌드 도구 종류? Maven, Gradle 차이점, 장단점, 플러그인/spring build tools, plugins

안녕하세욥 민zero입니다 ㅎ

저번 글에서 자바에 대한 개발 환경, 자바 빌드 도구 종류 등에 대해 알아봤습니다.


[JAVA] JDK 란?JRE 란? 빌드도구란? Ant란? Gradle이란? Maven이란?(build tools)

 

[JAVA] JDK 란?JRE 란? 빌드도구란? Ant란? Gradle이란? Maven이란?(build tools)

안녕하세요 ~! 민제로입니당. 오랜만에 올리는 블로그 ,, 감회가 새롭습니다 ,,, 이제 주기적으로 블로깅 잘할거에요 ㅠㅠ 😁 요즘 스프링부트로 프로젝트 한참 진행 중인데 자바에 대해 조금 자

min-0.tistory.com

 

이어서 Maven이랑 Gradle에 대해 자세히 알아볼게요

 


 

🪶메이븐(Maven)이란?

자바용 프로젝트 관리 도구로 Apache Ant의 대안으로 만들어졌다.

Maven 특징

  • 빌드 절차를 간소화하여 쉽게 만들 수 있다.
  • 정형화된 빌드 시스템을 제공한다.
  • Pom.xml 파일을 통해 프로젝트를 빌드한다.
  • 양질의 프로젝트 정보를 제공한다.

Maven의 구조도

Maven 빌드 과정(Maven *LifeCycle)

*LifeCycle: 미리 정의하고 있는 빌드 순서를 라이프사이클이라고 한다. 각 빌드 단계를 phase라 하며 각 phase들은 의존 관계를 가지고 있다.

LifeCycle

  1. Clean : 빌드 시 생성되었던 Output 및 파일들을 지워주는 단계
  2. Vaildate : 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계
  3. Compile : 프로젝트의 소스 코드를 컴파일 하는 단계
  4. Test : 유닛(단위) 테스트를 수행하는 단계(테스트 실패 시 빌드 실패로 처리, 스킵 가능)
  5. Package : 실제 컴파일 된 소스 코드와 리소스들을 jar 파일 등의 배포를 위한 패키지로 만드는 단계
  6. Install : 패키지를 로컬 저장소에 설치하는 단계
  7. Default(Build) : 일반적인 빌드 프로세스를 위한 모델이다.
  8. Site : 프로젝트 문서와 사이트 작성, 생성하는 단계
  9. 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

 

Maven – Available Plugins

Available Plugins Maven is - at its heart - a plugin execution framework; all work is done by plugins. Looking for a specific goal to execute? This page lists the core plugins and others. There are the build and the reporting plugins: Build plugins will be

maven.apache.org

 


 

🐘그래들(Gradle)이란?

Ant와 Maven의 장점을 모아 2012년에 출시

Gradle 특징

  • 설정 주입 방식(Configuration Injection)을 사용한다.
  • 오픈소스 기반의 빌드 자동화 시스템으로 *Groovy 기반 DSL(Domain-Specific-Language)로 작성한다.
    *Groovy : JVM에서 실행되는 스크립트 언어

Gradle 구조도

  • 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 플러그인은 핵심이라고 할 것 없이 프로젝트를 진행하면서 필요에 따라 검색해 사용하는 경우가 많다고 하네용


 

아래의 링크를 통해 필요한 플러그인을 검색해 사용해보세요 !

https://plugins.gradle.org/

 

Gradle - Plugins

 

plugins.gradle.org

 


 

이제 그럼 이만 ,, !