관리 메뉴

개발그래머

Gradle이란 무엇인가? 본문

Gradle

Gradle이란 무엇인가?

임요환 2023. 8. 2. 16:26

Gradle 이란?

  • 모든 유형의 소프트웨어를 빌드할 수 있을 만큼 유연한 오픈 소스 빌드 자동화 도구

빌드 자동화 도구

  • 소프트웨어 개발 프로세스에서 소스 코드를 컴퓨터에서 실행 가능한 소프트웨어로 변환하는 작업인 빌드 과정을 자동화하는 도구
  • 소스코드를 컴파일하고 링크하고 패키징하여 실행 가능한 애플리케이션, 라이브러리, 혹은 배포 가능한 파일로 만드는 작업임
  1. 소스 코드 컴파일과 링크
  2. 의존성 관리
  3. 단위 테스트 실행
  4. 코드 정적 분석과 검사
  5. 리소스 복사 및 패키징
  6. 릴리즈 빌드 생성
  7. 배포 가능한 파일 생성과 배포
  • 대표적인 도구들로 Apache Maven, Gradle, Ant 등이 있음

Maven과 Gradle의 차이

  • 자바 진형에서 주로 사용되는 빌드 도구들로 간략한 차이에 대해 설명하겠음
차이점 Maven Gradle
빌드 스크립트 언어 XML 기반의 빌드 스크립트를 사용하며 XML 형식으로 프로젝트 구조와 의존성 관리를 정의함 Groovy 또는 Kotlin DSL을 사용하는 유여한 빌드 스크립트를 지원하며 DSL은 더 간결하고 가독성이 높은 빌드 스크립트를 작성 가능하게 함
선언적 vs 명령적 빌드 선언적 방식으로 빌드를 정의함, 개발자는 빌드 과정을 명시적으로 작성하지 않고 Maven이 미리 정의된 빌드 라이프사이클과 플러그인을 사용하여 빌드를 수행함 명령적인 방식으로 빌드를 정의함, 개발자는 빌드 스크립트에서 더 자세한 제어를 할 수 있으며 필요한 작업을 직접 구성하거나 커스텀할 수 있음
성능 빌드의 기본 동작에 초점을 두고 있으며 대규모 프로젝트에서 성능이 다소 저하될 수 있음 빌드 캐시와 증분 빌드 등 성능 최적화 기능을 강화하여 더 큰 프로젝트에서도 빠른 빌드를 지원함
생태계와 플러그인 오랜 기간 사용된 오픈소스 생태계로 많은 라이브러리와 플러그인을 갖추고 있음 빠르게 성장하는 생태계이며 Maven과 호환되는 의존성 관리 및 플러그인 사용이 가능함
멀티 프로젝트 빌드 멀티 모듈 빌드를 지원하며 상대적으로 간단한 멀티 프로젝트 구성을 제공함 멀티 프로젝트 빌드를 훨씬 더 유연하게 지원하고 각 프로젝트에 대한 별도의 빌드 스크립트를 작성하는 것이 가능함

Gradle의 특징

  • High performance(고성능)
    • input 또는 output이 변경되어 작업을 수행해야 하는 작업만 실행하여 불필요한 작업을 방지함
    • 다양한 캐시를 사용하여 이전 빌드의 outputs을 재사용함
    • 공유 빌드 캐시를 사용하면 다른 시스템의 outputs을 재사용할 수도 있음
  • JVM foundation(JVM 기반)
    • JVM에서 실행됨
    • 빌드 논리는 표준 Java API를 사용 가능
    • 다양한 플랫폼에서 Gradle을 쉽게 실행 가능
  • Conventions(컨벤션)
    • 규칙을 통해 일반적인 유형의 프로젝트를 쉽게 빌드 가능
    • 플러그인은 빌드 스크립트를 최소한으로 유지하기 위해 합리적인 기본값을 설정하며 이러한 규칙은 사용자를 제한하지 않음
    • 빌드에서 설정을 구성하고 고유한 작업(tasks)을 추가하고 다른 많은 customizations을 수행 가능함
  • Extensibility(확장성)
    • 빌드에는 사용자 지정 빌드 로직이 필요한 경우가 있으며 Gradle은 쉽게 확장하여 customizations 및 플러그인으로 자체 빌드 로직을 제공 가능함
  • IDE support(IDE 지원
    • Android Studio, IntelliJ IDEA, Eclipse, VSCode 및 NetBeans를 포함하여 Gradle 빌드와의 상호 작용을 제공
    • Visual Studio에 프로젝트를 로드하는 데 필요한 솔루션 파일도 생성 가능

용어 정리

Projects(프로젝트)

  • Gradle이 빌드하는 것
  • 프로젝트에는 일반적으로 build.gradle 또는 build.gradle.kts라는 프로젝트의 루트 디렉터리에 있는 파일인 빌드 스크립트가 포함되어 있음
  • 빌드 스크립트는 해당 프로젝트에 대한 작업, 종속성, 플러그인 및 기타 구성을 정의함
  • 단일 빌드는 하나 이상의 프로젝트를 포함할 수 있으며 각 프로젝트는 자체 하위 프로젝트를 포함 가능함

Task(작업)

  • 코드 컴파일, 테스트 실행 또는 소프트웨어 배포와 같은 일부 작업을 실행하기 위한 논리가 포함되어 있음
  • 대부분의 사용 사례에서 기존 작업을 사용
  • 테스트를 실행할 수 있는 Test task와 같이 많은 일반적인 빌드 시스템 요구 사항을 구현하는 작업을 제공
  • 작업의 구성 요소
    • 실행(Actions) : 파일 복사 또는 소스 컴파일과 같은 작업을 수행하는 작업
    • 입력(Inputs) : 작업이 사용하거나 작동하는 값, 파일 및 디렉터리
    • 출력(Outputs) : 작업이 수정하거나 생성하는 파일 및 디렉터리

Plugins(플러그인)

  • 플러그인을 사용하면 작업, 파일 및 종속성 구성을 넘어 빌드에 새로운 개념을 도입가능
  • 예를 들어 대부분의 언어 플러그인은 source sets 개념을 빌드에 추가함(https://docs.gradle.org/current/userguide/building_java_projects.html#sec:java_source_sets)
  • 여러 프로젝트에서 로직과 구성을 재사용하는 수단을 제공
  • 작업을 한 번 작성하고 여러 빌드에서 사용 가능
  • 로깅, 종속성 및 버전 관리와 같은 공통 구성을 한 곳에 저장 가능 -> 빌드 스크립트의 중복 감소
  • 플러그인으로 빌드 프로세스를 적절하게 모델링하면 사용 편의성과 효율성을 크게 향상할 수 있음

빌드 단계(bulid life cycle)

  1. 초기화(Initialization)
    • 빌드 환경을 설정하고 참여할 프로젝트를 결정함
  2. 구성(Configuration)
    • 빌드에 대한 작업 그래프를 설계하고 구성함, 사용자가 실행하려는 작업에 따라 실행해야 하는 작업과 순서를 결정함
  3. 실행(Excecution)
    • 구성 단계가 끝날 때 선택한 작업을 실행함

빌드

  • Gradle 프로젝트에서 작업 모음을 실행하는 것
  • 작업 선택기를 지정하여 명령줄 인터페이스(CLI) 또는 IDE를 통해 빌드를 실행
  • Gradle은 빌드를 구성하고 실행할 작업을 선택
  • 요청된 작업과 종속성을 기반으로 가장 작은 전체 작업 세트를 실행

빌드 스크립트 사용 예제

Groovy DSL

// 프로젝트 속성 설정
group 'com.example'
version '1.0.0'

// 플러그인 적용
plugins {
    id 'java' // Java 플러그인 적용
}

// 의존성 관리
dependencies {
    implementation 'org.slf4j:slf4j-api:1.7.32'
    testImplementation 'junit:junit:4.13.2'
}

// 사용자 정의 태스크
task myCustomTask {
    doLast {
        println 'Hello from my custom task!'
    }
}

// Configurations 정의
configurations {
    myCustomConfig // 사용자 정의 Configuration 추가
}

// Configuration에 의존성 추가
dependencies {
    myCustomConfig 'org.apache.commons:commons-lang3:3.12.0'
}

// 빌드 라이프사이클 설정
// 빌드 실행 시 자동으로 myCustomTask를 실행하도록 설정
build {
    dependsOn myCustomTask
}

Kotlin DSL

// 프로젝트 속성 설정
group = "com.example"
version = "1.0.0"

// 플러그인 적용
plugins {
    kotlin("jvm") version "1.5.21" // Kotlin 플러그인 적용
}

// 의존성 관리
dependencies {
    implementation("org.slf4j:slf4j-api:1.7.32")
    testImplementation("junit:junit:4.13.2")
}

// 사용자 정의 태스크
tasks {
    val myCustomTask by registering {
        doLast {
            println("Hello from my custom task!")
        }
    }
}

// Configurations 정의
configurations {
    create("myCustomConfig") // 사용자 정의 Configuration 추가
}

// Configuration에 의존성 추가
dependencies {
    "myCustomConfig"("org.apache.commons:commons-lang3:3.12.0")
}

// 빌드 라이프사이클 설정
// 빌드 실행 시 자동으로 myCustomTask를 실행하도록 설정
tasks.named("build") {
    dependsOn("myCustomTask")
}

'Gradle' 카테고리의 다른 글

gradle-ssh-plugin을 이용한 배포  (0) 2023.03.24