[기초 공부] 빌드 자동화(Gradle) 정리

woodyn·2021년 6월 11일
4

기초 공부

목록 보기
15/16

빌드 자동화

소스 코드 컴파일, 패키징, 테스트 실행 등 일련의 작업을 통해 빌드 생성을 자동화하는 기술

Apache Maven

주로 자바 프로젝트를 위한 JVM 기반 빌드 자동화 도구

  • XML 기반으로 프로젝트 설정을 계층적인 스타일로 정의함
  • 라이브러리 의존성을 관리해줌
  • 커스터마이징을 위한 플러그인을 지원함

Gradle

Maven의 특징을 이어 받은 JVM 기반 빌드 자동화 도구

  • Groovy 혹은 Kotlin DSL 기반으로 프로젝트 설정을 작성함
    • XML 방식에 비해 유연하고 이해하기 쉬움
  • Maven보다 성능이 좋음
    • Increment Build: 수정된 부분에 대해서만 작업을 수행함
    • Build Cache: 빌드 캐시를 이용할 수 있음
    • Gradle Daemon: 백그라운드 프로세스를 통해 실행 속도를 개선함

Build 관련 기능

Build Environment

빌드 행동을 설정하기 위한 방식들 (높은 우선순위 순)

  • 커맨드라인 플래그 (e.g. --build-cache)
  • gradle.properties 파일:
    • 시스템 프로퍼티 (e.g. systemProp.http.proxyHost=somehost.org)
    • Gradle 프로퍼티 (e.g. org.gradle.caching=true)
  • 시스템 환경 변수 (e.g. GRADLE_OPTS)

Gradle Daemon

성능을 향상시키기 위한 백그라운드 프로세스 기능

  • JVM startup 비용을 줄이고 프로젝트 정보를 메모리에 캐싱함
  • gradle --status 명령어로 데몬의 상태를 확인함
  • 기본적으로 활성화되어있음

Build Cache

반복적인 빌드 시 속도를 향상시키기 위한 캐싱 기능

  • 컴파일이나 Javadoc, 테스트 등의 여러 작업 결과를 캐싱함
  • --build-cache 인자 혹은 org.gradle.caching=true 설정으로 활성화함
  • 잘못된 데이터가 캐싱되면 지우기 전까지 영구적이므로 사용에 주의해야 함

Increment Build

컴파일 등의 작업을 필요한 부분만 수행하는 기능

주요 개념

  • Project: Gradle로 운영하기 위한 작업물
    • Gradle 빌드는 1개 이상의 Project로 이루어짐
  • Task: Gradle이 Project에서 수행하는 원자적인 작업 단위
    • e.g. 컴파일, JAR 생성, Javadoc 생성
  • Plugin: 주로 추가적인 Task들을 제공받기 위해 적용하는 확장 기능
    • e.g. java, java-library, scala, org.springframework.boot
  • Dependency: 원격 저장소나 내부 디렉토리로부터 받아올 의존성 정보(라이브러리)
  • Configuration: Dependency가 적용될 영역(Scope)을 제한하는 설정
    • e.g. implementation, testImplementation, runtimeOnly
  • Source set: Java 소스와 리소스들을 논리적인 그룹으로 묶은 것
    • e.g. maintest

주요 파일

.
├── a-subproject
│   └── build.gradle
├── settings.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat

build.gradle

Gradle 빌드 스크립트 파일

  • 프로젝트마다 존재함
  • 한 빌드마다 대상 프로젝트들의 build.gradle 파일들을 사용함

settings.gradle

Multi-project 빌드를 위한 설정 파일

  • include 구문으로 빌드에 포함할 프로젝트들을 선언함
  • 한 빌드마다 하나의 settings.gradle 파일을 사용함

Gradle Wrapper

$ gradlew.bat build
Downloading https://services.gradle.org/distributions/gradle-5.0-all.zip
.....................................................................................
Unzipping C:\Documents and Settings\Claudia\.gradle\wrapper\dists\gradle-5.0-all\ac27o8rbd0ic8ih41or9l32mv\gradle-5.0-all.zip to C:\Documents and Settings\Claudia\.gradle\wrapper\dists\gradle-5.0-al\ac27o8rbd0ic8ih41or9l32mv
Set executable permissions for: C:\Documents and Settings\Claudia\.gradle\wrapper\dists\gradle-5.0-all\ac27o8rbd0ic8ih41or9l32mv\gradle-5.0\bin\gradle

BUILD SUCCESSFUL in 12s
1 actionable task: 1 executed

Gradle 설치 없이 프로젝트의 Gradle 작업을 수행할 수 있도록 하는 파일

  • OS에 따라 gradlew 혹은 gradlew.bat 파일 실행
    • build, test 등의 Task: 특정 작업 실행
    • --version: Gradle Wrapper 버전 업데이트
  • 일반적으로 설치된 Gradle보다 Gradle Wrapper을 사용하는 것이 권장됨 (작업 실행을 표준화함)

Base Plugin

공통 작업 컨벤션을 제공하기 위한 기반 Plugin

Tasks

  • clean: 빌드 디렉토리 삭제
  • check: 테스트 등의 검증 작업 실행
  • assemble: 배포할 결과물 생성
  • build: checkassemble 실행

Java Plugin

Project에 Java 애플리케이션 빌드에 필요한 기능을 추가하는 Plugin

Source sets

  • main: 프로젝트의 프로덕션 코드를 위한 Source set
    • 주로 JAR로 담길 클래스들을 다룸
  • test: 프로젝트의 테스트 코드를 위한 Source set
    • 컴파일과 런타임 시 프로덕션 코드와 Classpath를 공유함
    • 주로 JUnit 등의 테스트 프레임워크에 의해 실행될 테스트 클래스들을 다룸

Project layout

  • src/main/java: 프로덕션 Java 소스
  • src/main/resources: 프로덕션 리소스
  • src/test/java: 테스트 Java 소스
  • src/test/resources: 테스트 리소스

Tasks

  • compileJava: JDK 컴파일러로 프로덕션 자바 소스 컴파일
  • jar: 메인 소스 셋을 기준으로 프로덕션 JAR 파일 생성
  • test: JUnit 등의 테스트 프레임워크를 통해 단위 테스트 실행

Contributed extension

java.sourceCompatibility = JavaVersion.VERSION_11

Java와 관련된 프로퍼티를 설정하기 위해 java extension을 제공함

  • sourceCompatibility: Java 소스 컴파일에 사용할 언어 버전 (기본 값: Gradle JVM의 버전)
  • targetCompatibility: 생성될 바이트 코드가 대상으로 할 Java 버전 (기본 값: sourceCompatibility)

Java Library Plugin

Java Plugin을 확장하여 Java 라이브러리에 관한 추가 기능을 제공하는 Plugin

Configurations

  • api: 내부 의존성을 컴파일과 런타임 모두에 보이는 API 의존성 정의
    • 의존성의 내부 의존성을 참조할 수 있음
    • 레거시 compile과 동일
  • implementation: 내부 의존성을 런타임에서만 보이는 구현 의존성 정의
    • 의존성의 내부 의존성을 숨겨 참조할 수 없도록 함
      • 보여질 필요 없는 클래스들을 사용할 수 없도록 만듬 (의존성 최소화)
      • 내부 의존성이 수정되어도 프로젝트 코드를 다시 컴파일할 필요 없음 (빌드 속도 향상)
    • 레거시 runtime과 동일
  • compileOnly: 컴파일에만 사용되는 의존성 정의
    • 런타임 시 외부에서 의존성을 찾을 수 있는 상황에 사용함
  • compileOnlyApi: 컴파일에만 사용되는 API 의존성 정의
  • runtimeOnly: 런타임에만 사용되는 의존성 정의
  • testImplementation: 테스트 의존성 정의
  • testCompileOnly: 테스트 컴파일에만 사용되는 의존성 정의
  • testRuntimeOnly: 테스트 런타임에만 사용되는 의존성 정의
profile
🦈

1개의 댓글

comment-user-thumbnail
2024년 1월 26일

깔끔한 정리 감사합니다! gradle 잘 몰라서 기초 살피고 있었는데, 도움 많이 되었어요

답글 달기