arrow_upward
본문 바로가기
Tool

[Gradle] build.gradle과 동작 원리

by dawncode 2024. 4. 18.

Gradle은 오픈 소스 빌드 자동화 도구로 Groovy나 Kotlin DSL(Domain-Specific Language)을 사용해서 작성된다.

자바, C/C++, 파이썬 등 다양한 언어를 지원하며, 강력한 의존성 관리 및 빌드 스크립트를 통해서 프로젝트의 빌드 과정 및 설정을 세밀하게 제어할 수 있다.



build.gradle

build.gradle 파일은 프로젝트의 빌드 구성을 정의하고, 프로젝트가 어떻게 빌드될 것이며 어떤 종속성이 필요한지 설정하는 스크립트다. Gradle Task는 이 스크립트의 메서드들을 빌드 시에 실행시킨다.

이 파일은 Project 인터페이스의 구현체로 Project 인터페이스는 Gradle과 상호작용하기 위한 다양한 API를 제공한다.

build.gradle에서 사용되는 다양한 설정들이 Project 인터페이스가 제공하는 프로퍼티와 메서드들이다. 자세한 내용은 아래에서 설명할 것이다.

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.14'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'sample'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '11'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    // spring boot
    implementation 'org.springframework.boot:spring-boot-starter'

    // lombok
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

    // test
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

 

파일을 설명하기 전 생소할 수 있는 {...} 문법을 설명하면 groovy에서 제공하는 클로저로 파라미터를 전달받을 수 있고, 변수에 할당하거나 다른 함수의 인자로도 전달 가능한 코드 블록이라고 보면 된다.

클로저 내부에서 사용되는 변수는 클로저 내부에서 선언된 지역변수나 클로저 외부에서 선언됐지만 내부에서 접근 가능한 변수가 있다.

// 리스트 정의
def list = [1, 2, 3, 4, 5]

// 클로저 정의: 각 요소를 출력
def printElement = { element ->
    println element
}

// 리스트의 각 요소에 클로저 적용
list.each(printElement)




plugins

프로젝트에 적용할 플러그인들을 정의하는 부분이다.

  • java: 자바 언어를 사용하기 위한 기본 플러그인이다.
  • org.springframework.boot: 스프링 부트 애플리케이션을 사용하기 위한 플러그인으로 사용할 버전과 함께 명시된다.
  • io.spring.dependency-management: 스프링 부트의 의존성 관리 기능을 제공하는 플러그인이다. 스프링 부트의 버전에 맞게 의존성들을 자동으로 관리해준다.


group, version

프로젝트의 정보를 설정하는 부분이라고 생각하면 된다.

  • group: 프로젝트의 그룹 ID를 정의한다. 패키지명의 역순으로 작성하며, 보통 기업의 도메인 이름을 역순으로 쓴 것을 사용한다.
  • version: 프로젝트의 버전을 정의한다. '0.0.1-SNAPSHOT'은 개발 중인 초기 버전을 나타낸다.

project.group과 group은 같은 의미로 Gradle에서 Project 객체의 프로퍼티를 직접 참조할 때 project를 생략할 수 있게 해준다.



sourceCompatibility

프로젝트에서 사용할 자바의 버전을 지정한다.



configurations

빌드 스크립트에서 종속성 관리를 위해서 사용한다.
이 속성은 프로젝트의 종속성과 작업 간의 관계를 정의하는데 사용하며, implementation, testImplementation, runtimeOnly 등과 같은 Gradle configurations가 있다.


종속성은 프로젝트가 동작하기 위해 필요한 외부 라이브러리, 모듈 또는 프로젝트를 의미한다.
작업(Task)은 빌드 프로세스 중에 실행되는 작업 단위로 컴파일, 패키징 등이 해당된다.

  • compileOnly: configurations중 하나로, 컴파일 단계에서만 필요한 의존성들을 지정한다. 주로 빌드 시점에는 필요하지만 애플리케이션을 실행할 때는 필요하지 않은 경우 유용하다.
  • extendsFrom: 한 구성(configuration)이 다른 구성의 의존성을 상속받을 수 있도록 하는 기능이다. complieOnly 구성이 annotationProcessor구성의 의존성을 포함하게 설정할 수 있다. 특정 의존성이 다양한 구성에서 필요할 때 중복을 줄여준다.
  • annotationProcessor: 어노테이션 프로세서를 위한 의존성을 지정한다. 어노테이션 프로세서는 컴파일 시점에 어노테이션을 분석하고 코드를 생성하거나 수정하는데 사용된다. 롬복은 getter, setter, 생성자 등을 자동으로 생성해주는 어노테이션 프로세서로 컴파일 시점에서만 사용된다.


repositories

의존성들을 찾아서 다운로드 하기 위한 저장소를 정의한다.

  • mavenCentral(): Maven Central 저장소를 사용해서 의존성을 찾아서 다운로드 한다.

groovy에서 메서드를 호출할 때 괄호는 생략 가능하다.



dependencies

프로젝트에 사용되는 의존성들을 정의한다.

  • implementation: 컴파일 시점과 런타임 모두에 포함되는 의존성을 지정한다.
  • runtimeOnly: 런타임 시에만 필요한 의존성을 지정한다.
  • compileOnly: 컴파일 시에만 필요한 의존성을 지정한다.
  • annotationProcessor: 어노테이션 처리를 위한 의존성을 지정한다. 위 스크립트에서는 롬복을 처리하기 위해서 사용된다.
  • testImplementation: 테스트 시에만 필요한 의존성을 지정한다.


tasks.named('test')

테스트를 작업을 정의한다.

문법이 생소할 수 있는데 Gradle에서 제공하는 Task configuration avoidance API로 빌드 시 불필요한 동작은 하지 않고 필요할 때 동작시킨다고 생각하면 편할 것 같다.

  • useJUnitPlatform(): JUnit 플랫폼을 사용하여 테스트를 실행하도록 설정한다.

 

현재 기본적인 build.gradle 설정 프로퍼티들만 확인했지만 gradle 문서를 보면 설정들이 존재한다. 필요할 때 문서를 보면서 커스텀으로 원하는 것을 추가해보면 좋을 것 같다.

 

 

build.gradle 설정 추가해보기

사용자가 build.gradle 설정을 수정하기 위해서는 Gradle의 문서에서 현재 버전의 사용하는 속성중 Deprecated된 속성들이 어떤 것들이 있는지 확인하고 사용해야 한다.

// 추가 작성해보기

// build를 할 때 jar파일이 2개 생성되는데 plain.jar 파일은 작성된 코드만 포함하게 된다.(애플리케이션 로드에 필요한 코드x)
// 이 파일은 배포시 잘 사용하지 않으므로 plain.jar를 생성하지 않도록 하는 설정이다.
jar {
	enabled = false
}

// build시 생성 디렉토리 변경, default = projectDir/build
// 작성 버전은 6.8.3버전으로 사용하지만 현재 기준으로는 Deprecated 됐다.
buildDir = "./custom_build"

 

 

 

참조

'Tool' 카테고리의 다른 글

k6 개념 및 사용법, JMeter와 비교  (0) 2025.05.28
JMeter 개념 및 사용법  (0) 2025.05.27