빌드 도구란
소스 코드를 컴파일하고, 테스트를 실행하고, 소프트웨어의 구성 요소를 배포 가능한 애플리케이션으로 패키징하는 소프트웨어 도구로서 프로세스를 자동화하고 관리
소프트웨어 개발 수명 주기의 필수적인 부분
빌드 도구의 역할
1. 코드 컴파일
- 프로그램이 언어로 작성된 소스 코드를 대상 환경에서 실행할 수 있는 실행 가능한 바이너리 또는 중간 코드로 컴파일
2. 테스트 실행
- 단위 테스트, 통합 테스트 등 자동화된 테스트를 실행
3. 종속성 관리
- 프로젝트가 의존하는 외부 라이브러리, 프레임워크, 모듈 등을 다운로드하고 버전을 관리
4. 패키징 및 배포
- 컴파일된 코드와 필요한 리소스를 JAR, WAR 또는 실행 파일과 같은 배포 가능한 아티팩트로 패키징
5. 정적 분석
- 정적 코드 분석 및 코드 품질 검사를 제공하여 잠재적인 문제, 코딩 표준 위반 및 기타 코드 관련 문제를 식별
Ex) Gradle의 SpotBugs, Checkstyle 등등
6. 환경 구성
- 환경별 구성 및 속성을 관리할 수 있어 다양한 배포 환경에 맞게 애플리케이션 빌드 가능
7. 자동화
- 반복적인 작업을 자동화하여 수동 개입을 줄여줌- 일관성과 안전성을 보장
JAVA 빌드 도구
자바 빌드 도구에는 Maven, Gradle, Ant, Bazel, Buildr, SBuild, Buildship 등등이 있지만 가장 많이 사용하는 두 가지는 Apache Maven과 Gradle이다.
Apache Maven
'구성보다 규칙을 우선시하는 원칙'을 따르며 프로젝트 설정을 간소화하기 위해 특정 기본 규칙을 적용함
1. Project Object Model (POM)
- 프로젝트 정보, 빌드 구성, 종속성 및 플러그인을 정의하는 XML 파일
- 프로젝트의 중앙 구성 파일 역할
- POM에 정의된 종속성은 원격 리포지터리에서 자동으로 다운로드하여 관리됨
<project>
<groupId>com.example</groupId>
<artifactId>my-java-project</artifactId>
<버전>1.0-SNAPSHOT</버전>
<dependencies>
<!-- 여기에 프로젝트의 종속성을 정의하세요 -->
</dependencies>
</project>
2. 표준 디렉터리 구조
- 소스 코드를 특정 디렉터리 구조로 구성
ex)
java 소스파일은 'src/main/java'에 배치
text 소스파일은 'src/test/java'에 배치
3. LifeCycle
Phase의 시퀀스이며, 각 Phase는 순차적으로 실행되어야 함
- Clean Lifecycle
- clean : 빌드 출력 디렉토리(target)를 삭제하여 깨끗한 빌드 환경을 보장
- Default Lifecycle
- validate : 프로젝트와 그 구성의 유효성 검사
- compile : 소스 코드를 컴파일
- test : 단위 테스트 실행
- package : 컴파일된 코드의 배포 가능한 패키지(JAR, WAR)를 생성
- verify : 통합 테스트를 실행하고 결과를 확인
- install : 다른 프로젝트에서 사용할 수 있도록 패키지를 로컬 리포지토리에 설치
- deploy : 다른 개발자와 공유하거나 서버에 배포하기 위해 원격 저장소에 패키지를 배포
- Site Lifecycle
- site : 프로젝트 문서 및 보고서 생성
- site-deploy : 생성된 사이트 문서를 공유할 수 있도록 원격 위치에 배포
Goal을 사용하여 각 Phase내에서 특정 작업을 수행
Goal은 Phase에 바인딩되며, Phase 실행 시 해당 Phase와 관련된 Goal을 실행
ex)
mvn package -> 'compile', 'test', 'package' Phase
Gradle
1. Groovy DSL (도메인 특화 언어)
- JVM을 위한 동적 스크립팅 언어인 Groovy로 작성
- 메타프로그래밍을 지원하는 동적 프로그래밍 언어이기 때문에 정적 언어와 다르게 런타임에 코드를 생성하고 조작할 수 있어서 빌드 스크립트를 유연하게 작성할 수 있음
- 자바에 비해 간결한 문법이기 때문에 읽기 쉽고 작성하기 편함
- 클로저를 지원하기 때문에 스크립트를 추상화할 수 있고 사용자 정의 기능을 쉽게 추가할 수 있음
- Convention Over Configuration을 지원하여 일반적인 작업에 대한 기본 구성을 제공하면서 필요한 경우 사용자 정의 설정을 추가할 수 있는 유연성을 제공함
<project>
<groupId>com.example</groupId>
<artifactId>my-java-project</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- Define your project's dependencies here -->
</dependencies>
</project>
2. 종속성 관리
- 중앙 집중식 종속성 관리 시스템을 사용하여 MavenCentral 혹은 사용자 지정 저장소 및 로컬 파일을 비롯한 다양한 종속성 소스를 지원
3. Incremental 빌드
- 마지막 빌드 이후 변경된 프로젝트의 부분만 다시 빌드하고 테스트하므로 대규모 프로젝트일 경우, 타 빌드 도구보다 프로세스 속도가 빨라짐
4. 의존성 캐싱
- 다운로드한 종속성을 캐싱하여 재다운로드하는 시간을 줄이고 빌드 시간을 단축
5. 스크립트 플러그인 및 Kotlin DSL
- 빌드 스크립트를 정적으로 입력할 수 있는 대안을 제공하는 Kotlin으로 작성된 스크립트 플러그인도 지원
6. Wrapper
- 개발자가 프로젝트에 특정 버전의 Gradle을 사용할 수 있으므로 다양한 개발 환경에서 일관성을 유지할 수 있음
ex) gradlew, gradlew.bat
7. 작업 지향 접근 방식
- 작업을 Task로 구성
- 사용자 지정 Task를 정의할 수 있으며, Task는 다른 Task에 종속성을 가질 수 있음
- 각 작업이 특정한 역할을 수행하도록 구조화하므로 명확하고 체계적인 빌드 프로세스를 만듦
Ant vs Maven vs Gradle
측면 | Apache Ant | Apache Maven | Gradle |
---|---|---|---|
목적 | 빌드 자동화, 유연성 | 빌드 자동화, 의존성 관리 | 빌드 자동화, 빌드 도구 |
및 커스터마이즈 가능 | 기반의 관례적 접근 | 빌드 라이프사이클 기반 도구 | |
언어 | XML | XML | Groovy/Kotlin DSL |
설정 | 수동, XML 기반 | XML 기반, 관례적 접근 | DSL 기반, 유연함 |
의존성 관리 | 수동, 내장 의존성 관리 없음 | 중앙 집중식 의존성 관리 | 내장 의존성 관리 |
POM을 통한 의존성 관리 | |||
플러그인 시스템 | 제한적 | 확장적 | 확장적 |
관례적 접근 설정 | 없음 | 예 | 예 |
작업 시스템 | 타겟과 작업 | 골과 플러그인 | 작업과 플러그인 |
빌드 라이프사이클 | 단계 수동 정의 | Phase와 Goal | Phase와 Task |
재현성 | 수동 설정 및 스크립팅에 따름 | 의존성 관리 및 관례적 접근에 따름 | 의존성 관리 및 관례적 접근에 따름 |
유연성 | 높음, 스크립팅이 더 필요 | 관례와 플러그인을 통한 유연성 | 높음, 강력한 DSL 지원 |
1. Ant vs Maven
- 의존성 관리 : Maven은 중앙 저장소를 통해 의존성을 관리하고 필요한 라이브러리를 쉽게 가져올 수 있기 때문에 유지 관리가 편리함
- 관례적 빌드 구성 : Maven은 POM 파일을 사용하여 관례적인 빌드 구성을 갖추기 때문에 개발자들이 빌드 구성에 필요한 많은 부분을 설정하지 않아도 되며 일관성 있는 프로젝트 구조와 설정을 유지할 수 있음
- 플러그인 : Maven은 다양한 플러그인을 통해 빌드 프로세스를 확장하고 사용자 정의 작업을 추가할 수 있어 프로세스의 유연성을 높여줌
2. Maven vs Gradle
- 빌드 스크립트 유연성 : Gradle은 동적으로 작업할 수 있기 때문에 유연함
- 성능, 빌드 속도 : Gradle은 변경된 부분만 컴파일하는 기능과 캐시 기능을 통해 빌드 속도를 향상시킴
- 스크립트 가능한 빌드 라이프사이클 : Gradle은 Task와 라이프사이클을 동적으로 구성할 수 있어 작업의 순서와 의존성을 유연하게 관리할 수 있음
- 유연한 의존성 관리 : Gradle과 Maven은 비슷한 의존성 관리 기능을 제공하지만 Gradle의 경우 필요하면 원하는 방식으로 의존성을 해결하고 사용할 수 있음
- 멀티 프로젝트 관리 : Gradle은 다중 프로젝트 구조를 간단하게 구성하고 관리할 수 있는 기능을 제공
'Backend > Springboot' 카테고리의 다른 글
객체지향 5원칙 - S.O.L.I.D (1) | 2023.10.28 |
---|---|
JDK 8 ~ 17 별 특징 (0) | 2023.10.23 |
Google Java Style Guide 번역 (feat. 우테코) (1) | 2023.10.23 |
예시로 보는 객체지향 생활체조 (0) | 2023.10.22 |
Spring-boot-devtools 적용 (2) | 2023.08.25 |