기타

[빌드 도구] Gradle VS Maven 차이점

YB CHA 2023. 10. 26.

 

 

빌드도구(build Tool) ?

Java 코드와 프로젝트에 사용되는 xml, properties, jar 파일들을 JVM이나 WAS가 인식할 수 있도록 해주는 빌드 자동화 도구 입니다. 프로젝트 생성, 배포 등 실행하기 위한 전용 프로그램이며 빌드 도구는 이러한 빌드 과정을 자동으로 수행해주는 도구를 의미합니다.

 

 

메이븐(Maven) ?

메이븐은 Java용 프로젝트 관리도구로 Apache의 Ant 대안으로 만들어졌습니다. 개발을 하다보면 많은 라이브러리들을 활용하여 개발을 합니다. 많은 라이브러리로 인해 관리가 힘든데 메이븐은 이러한 문제를 관리해줍니다. 또한 해당 라이브러리가 작동하는데 필요한 다른 라이브러리들까지 관리하여 자동으로 다운로드를 받아줍니다.

 

POM(Project Object Model)

pom.xml의 pom은 Project Object Model의 정보를 담고있는 파일입니다. 아래는 이 파일에서 주요하게 다루는 기능들입니다.

 

  • 프로젝트 정보 : 프로젝트의 이름, 개발자 목록, 라인센스 등
  • 빌드 설정 : 소스 코드, 리소스, Lifecycle별 실행한 플러그인 등 빌드와 관련된 설정
  • 빌드 환경 : 사용자 환경 별로 달라질 수 있는 프로파일 정보
  • POM 연관 정보 : 의존 프로젝트, 상위 프로젝트 등을 포함하고 있는 하위 모듈 등

 

라이프사이클(Lifecycle)

Lifecycle은 메이븐에서는 미리 정의하고 있는 빌드 순서가 있으며 이 순서를 라이프사이클이라고 합니다. 빌드 단계를 Phase라고 하는데 이런 Phase들은 의존관계를 가지고 있습니다. 아래는 라이프사이클 종류입니다.

 

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

 

Maven 코드 예시

<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.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.1.0</version>
		<relativePath/>
	</parent>
    <groupId>com.yuvyn</groupId>
	<artifactId>yuvyn</artifactId>
	<version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>yuvyn</name>
    <description>Demo project for Spring Boot</description>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jdbc</artifactId>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

 

 

그래들(Gradle) ?

그래들은 Maven 이후에 나온 최신 Java 빌드도구로 그루비(Groovy)문법을 사용하는 빌드 도구입니다. 그래들은 안드로이드 앱을 만들때 필요한 공식 빌드시스템이기도 하며 JAVA, C/C++, Python 등을 지원합니다. 메이븐은 XML기반으로 활용하도록 되어 있으나, Gradle의 경우 별도의 빌드스크립트를 통하여 사용할 어플리케이션 버전, 라이브러리등의 항목을 설정 할 수 있어 관리가 편합니다.

 

Setting.gradle

프로젝트 구성을 설정할 때 작성하는 파일입니다. 프로젝트간의 의존성 및 서브프로젝트, 교차프로젝트 같은 멀티 프로젝트를 구성 할 때 사용합니다. 싱글 프로젝트 경우에는 생략할 수 있습니다.

 

build.gradle

빌드에 대한 모든 기능을 정의하는 파일입니다. 프로젝트에서 사용하는 환경 설정, 빌드 방법, 라이브러리 정보등 빌드 및 프로젝트의 관리 환경을 구성하고 있습니다.

 

라이프사이클(Lifcycle)

  • 초기화(Initialization) : 빌드 대상 프로젝트를 결정하고 각각에 대한 Project객체를 생성하며  settings.gradle 파일에서 프로젝트 구성합니다.
  • 구성(Configuration) : 빌드 대상이 되는 모든 프로젝트의 빌드 스크립트를 실행합니다.
  • 실행(Execution) : 구성 단계에서 생성하고 설정된 프로젝트의 태스크 중에 실행 대상을 결정하고 gradle 명령행에서 지정한 태스크 이름 인자와 현재 디렉토리를 기반으로 태스크를 결정하여 선택된 태스크들을 실행합니다.

 

Gradle 코드 예시

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.3'
    id 'io.spring.dependency-management' version '1.1.3'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2'
    implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.mysql:mysql-connector-j'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.2'
    testImplementation 'org.springframework.security:spring-security-test'
    implementation 'mysql:mysql-connector-java:8.0.32'
}

tasks.named('test') {
    useJUnitPlatform()
}

 

 

Maven을 많이 사용하고 있지만 Gradle이 Maven보다 빌드 속도가 빠르고 팀프로젝트를 많이하고 있는 현시점에서는 Gradle을 사용하는것이 실수도 적게 생기고 번거로움도 줄일 수 있어 그래들 사용이 좋은거같습니다.

 

'기타' 카테고리의 다른 글

Thymeleaf 문법 정리  (0) 2023.10.26

댓글