빌드 관리 도구
빌드(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