Backend/Springboot

빌드 도구 (feat. Maven, Gradle)

박 성 하 2023. 8. 26. 00:05
728x90

빌드 도구란

소스 코드를 컴파일하고, 테스트를 실행하고, 소프트웨어의 구성 요소를 배포 가능한 애플리케이션으로 패키징하는 소프트웨어 도구로서 프로세스를 자동화하고 관리

소프트웨어 개발 수명 주기의 필수적인 부분

 

빌드 도구의 역할

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는 순차적으로 실행되어야 함

  1. Clean Lifecycle
    • clean : 빌드 출력 디렉토리(target)를 삭제하여 깨끗한 빌드 환경을 보장
  2. Default Lifecycle
    • validate : 프로젝트와 그 구성의 유효성 검사
    • compile : 소스 코드를 컴파일
    • test : 단위 테스트 실행
    • package : 컴파일된 코드의 배포 가능한 패키지(JAR, WAR)를 생성
    • verify : 통합 테스트를 실행하고 결과를 확인
    • install : 다른 프로젝트에서 사용할 수 있도록 패키지를 로컬 리포지토리에 설치
    • deploy : 다른 개발자와 공유하거나 서버에 배포하기 위해 원격 저장소에 패키지를 배포
  3. 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 AntApache MavenGradle
목적빌드 자동화, 유연성빌드 자동화, 의존성 관리빌드 자동화, 빌드 도구
및 커스터마이즈 가능기반의 관례적 접근빌드 라이프사이클 기반 도구
언어XMLXMLGroovy/Kotlin DSL
설정수동, XML 기반XML 기반, 관례적 접근DSL 기반, 유연함
의존성 관리수동, 내장 의존성 관리 없음중앙 집중식 의존성 관리내장 의존성 관리
POM을 통한 의존성 관리
플러그인 시스템제한적확장적확장적
관례적 접근 설정없음
작업 시스템타겟과 작업골과 플러그인작업과 플러그인
빌드 라이프사이클단계 수동 정의Phase와 GoalPhase와 Task
재현성수동 설정 및 스크립팅에 따름의존성 관리 및 관례적 접근에 따름의존성 관리 및 관례적 접근에 따름
유연성높음, 스크립팅이 더 필요관례와 플러그인을 통한 유연성높음, 강력한 DSL 지원

 

1. Ant vs Maven

  • 의존성 관리 : Maven은 중앙 저장소를 통해 의존성을 관리하고 필요한 라이브러리를 쉽게 가져올 수 있기 때문에 유지 관리가 편리함
  • 관례적 빌드 구성 : Maven은 POM 파일을 사용하여 관례적인 빌드 구성을 갖추기 때문에 개발자들이 빌드 구성에 필요한 많은 부분을 설정하지 않아도 되며 일관성 있는 프로젝트 구조와 설정을 유지할 수 있음
  • 플러그인 : Maven은 다양한 플러그인을 통해 빌드 프로세스를 확장하고 사용자 정의 작업을 추가할 수 있어 프로세스의 유연성을 높여줌

 

2. Maven vs Gradle

  • 빌드 스크립트 유연성 : Gradle은 동적으로 작업할 수 있기 때문에 유연함
  • 성능, 빌드 속도 : Gradle은 변경된 부분만 컴파일하는 기능과 캐시 기능을 통해 빌드 속도를 향상시킴
  • 스크립트 가능한 빌드 라이프사이클 : Gradle은 Task와 라이프사이클을 동적으로 구성할 수 있어 작업의 순서와 의존성을 유연하게 관리할 수 있음
  • 유연한 의존성 관리 : Gradle과 Maven은 비슷한 의존성 관리 기능을 제공하지만 Gradle의 경우 필요하면 원하는 방식으로 의존성을 해결하고 사용할 수 있음
  • 멀티 프로젝트 관리 : Gradle은 다중 프로젝트 구조를 간단하게 구성하고 관리할 수 있는 기능을 제공
728x90

'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