본문으로 바로가기

[SW] 빌드 관리 도구(Gradle vs Maven)

category Software/SW 2022. 8. 30. 14:52

빌드 관리 도구

빌드(Build)

 

: 소스 코드 파일을 컴퓨터에서 사용 또는 실행할 수 있는 독립적인 형태로 변환하는 과정

 

원시코드 -> 컴파일 -> 링크 -> 실행파일

 

  • 컴파일(Compile) : 작성한 소스 코드(원시코드)를 컴퓨터가 이해할 수 있는 기계어(Object Code)로 변환하는 작업
    • java의 경우 javac가 컴파일러로, 컴파일의 결과로 자바가상머신(JVM)에서 실행가능한 .class 파일이 생성됨
  • 링크(Link) : 컴파일러의 결과물인 .obj 파일들을 연결해서 최종 실행 가능한 하나의 실행파일(.exe)을 만드는 작업

 

빌드 도구(Build Tool)

 

: 빌드를 수행하는 도구

 

  • 제공하는 기능: 전처리(preprocessing), 컴파일(compile), 패키징(packaging), 테스팅(testing), 배포(distribution)
  • 종류: Ant, Maven, Gradle

 

Maven

 

  • Java용 프로젝트 관리 도구로 Apache의 Ant 대안으로 만들어짐
  • 프로젝트 진행시 사용하는 라이브러리를 관리해주는 도구
  • 빌드 중인 프로젝트, 빌드 순서, 라이브러리 종속성 관계를 pom.xml 파일에 명시
  • 필요한 라이브러리를 특정 문서(pom.xml)에 정의해두면 연관된 다른 라이브러리까지 모두 관리함

 

POM(Project Object Model)

 

  • pom.xml : 프로젝트 정보, 빌드 설정, 빌드 환경, pom 연관 정보 등을 담고 있는 파일
<?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.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>2.5.4</version>	
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>	<!-- 패키지 이름(일반적으로 도메인 이름 사용) -->
    <artifactId>demo</artifactId>	<!-- 프로젝트에서 생성되는 jar, war 파일 이름 -->
    <version>0.0.1-SNAPSHOT</version>	<!-- artifact 버전(프로젝트 버전) -->
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    
    <properties>	<!-- 상수 값 지정  ${propertyname} 형태로 참조 가능 -->
        <java.version>11</java.version>
    </properties>

    <dependencies>	<!-- 의존성: 해당 프로젝트에서 의존하는 다른 라이브러리 정보를 기술 -->
        <dependency>
            <groupId>org.springframework.boot</groupId> 	<!-- 의존하는 프로젝트 -->
            <artifactId>spring-boot-starter-web</artifactId> 	<!-- 의존하는 프로젝트 각 기능 -->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>		<!-- 프로젝트 빌드에 사용될 여러가지 플러그인 목록 -->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

 

Gradle

 

  • Build Script를 xml과 달리 Groovy기반의 DSL를 사용
    • Maven의 .xml 설정 파일보다 코드가 훨씬 간결해짐
    •  Groovy
      • JVM에서 실행되는 스크립트 언어로, java와 달리 소스 코드를 컴파일할 필요가 없음
      • 스크립트 언어이므로 소스 코드를 그대로 실행
  • 멀티 프로젝트 빌드를 지원(Configuration Injection)
    • Maven의 경우 멀트 프로젝트에서 특정 설정을 다른 모듈에서 하려면 상속을 받아야함
    • Gradle은 설정 주입(Configuration Injection) 방식을 사용하기 때문에 멀티 프로젝트에 매우 적합
  • Gradle 설치 없이 Gradle Wrapper를 이용해 빌드 지원 가능(편리함)
    • Gradle Wrapper : 프로젝트를 새로운 환경에서 별도 설치 없이 곧바로 빌드할 수 있게 해줌
  • 빌드와 테스트 실행 시간 단축
    • Gradle은 캐시를 사용하기 때문에 Maven에 비해 속도가 빠름
    • 어떤 task가 업데이트되었는지 체크하기 때문에, 이미 반영된 빌드의 부분은 더 이상 재실행하지 않음
    • 빌드 설정 규모가 커질 수록, 빌드 시간의 차이가 크게 벌어질 수 있음
  • concurrent에 안전한 캐시를 허용
    • 2개 이상의 프로젝트에서 동일한 캐시를 사용할 경우, 서로 덮어씌워지지 않도록 checksum 기반의 캐시를 사용

 

Gradle 설정 파일

 

  • setting.gradle : 프로젝트의 구성 정보를 기록하는 파일
  • build.gradle : 의존성이나 플러그인 설정 등을 위한 스크립트 파일(빌드에 대한 모든 기능 정의)
plugins {
	id 'org.springframework.boot' version '2.5.4'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'demo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	runtimeOnly 'com.h2database:h2'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

 

 

참고

https://dev-coco.tistory.com/65

https://velog.io/@alicesykim95/Maven%EA%B3%BC-Gradle%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90