CI\CD/Groovy Gradle

[Gradle] build.gradle의 동작원리 한 번에 정리하기

반응형

build.gradle은 무엇인가?

build.gradle은 파일 자체가 Project 오브젝트(객체)로, Project 오브젝트는 Project 인터페이스를 구현하는 구현체이다. Project 오브젝트는 Project 단위에서 필요한 작업을 수행하기 위해 모든 메서드와 프로퍼티를 모아놓은 슈퍼 객체이다. 

public interface Project extends Comparable<Project>, ExtensionAware, PluginAware {
    
    ..
}

 

우리가 build.gradle에 작성하는 수많은 코드들은 모두 Project 오브젝트의 프로퍼티와 메서드가 되며, Project 오브젝트는 프로젝트 이름부터 변수, 메서드를 모두 포함하는 객체가 된다.

 

Project 오브젝트는 내부에 수많은 메서드(Methods)와 속성(Properties)을 가지고 있다. 메서드 중에 대표적인 것은 모든 java application용 build.gradle이 가진 plugins, repositories, dependencies, application 메서드이다. 우리가 Gradle Task를 이용해 java application을 빌드하게 되면 build task는 이 메서드들을 수행시킨다. 

 

그림1. Project Object의 메서드

 

[그림1]의 {}로 감싸여진 부분은 메서드의 인자로 받아지는 Groovy의 클로저(Closure)인데, Groovy의 클로저는 Java나 Kotlin의 람다와 같다. 따라서 {} 블록 내부의 메서드들은 [그림2]와 같이 메서드의 인자로 넘겨질 수도 있다.

 

그림2. Groovy의 클로저

 

즉 [그림1]의 코드와 [그림2]의 코드는 같은 코드이다.

 

 

build.gradle의 프로퍼티

build.gradle에는 Project 객체를 위한 프로퍼티를 정의할 수 있다.

 

프로퍼티 재정의하기

프로퍼티를 정의하는 것은 간단하다. 아무 곳에나 다음 문법을 쓰면 된다.

project.[프로퍼티명] = [값]

혹은 project를 생략하고 쓸 수도 있다.

[프로퍼티명] = [값]

 

예를 들어 Project 객체의 group을 재정의 하고 싶다고 하면 다음과 같이 쓰면 된다. group으로 쓰든, project.group으로 쓰든 같은 프로퍼티에 접근된다.

group = 'com.example'
project.group = "com.kotlinworld"

repositories {
   println group // 출력 com.kotlinworld
   mavenCentral()
}

하지만 이렇게 지정하는 것은  Project 객체에 미리 정의된 프로퍼티만 정의하는 것이 가능하다. 커스텀 프로퍼티를 만들려면 다른 방법을 써야한다.

 

 

커스텀 프로퍼티 만들기

커스텀 프로퍼티를 만들기 위해서는 project 객체의 extension에 넣는 방식을 사용한다. project.ext를 통해 extension에 접근한다.

project.ext.[커스텀 프로퍼티명] = [값]

 

project.ext에 넣어진 변수는 Groovy의 특수한 문법을 사용해 project 객체에서 직접 접근이 가능하다. 

project.[커스텀 변수명]

 

예를 들어 blogName이란 커스텀 프로퍼티를 설정한 다음 출력하기 위해서는 다음과 같이 사용할 수 있다.

project.ext.blogName = 'kotlin world'

repositories {
   println project.blogName // 출력 kotlin world
   mavenCentral()
}

 

 

build.gradle의 메서드

build.gradle에는 Project 객체를 위한 메서드를 정의할 수 있다. 대표적인 메서드들은 바로 build.gradle의 respositories 메서드와 dependencies 메서드이다. 

repositories {
    mavenCentral()
}

dependencies {
    testImplementation "junit:junit:4.13.2"
    implementation "com.google.guava:guava:30.1.1-jre"
}

 

이 메서드들은 build.gradle 속에 메서드로 존재한다. 이 내부에 들어가는 Closure(Lambda 식)은 프로젝트가 빌드될 때 해당 메서드를 수행하는 task에 의해 수행된다.

 

그림3. repositories와 dependencies

 

위의 메서드들은 미리 빌드된 메서드들이다. 커스텀 메서드를 만들기 위해서는 메서드를 별도로 정의해야 한다.

 

 

커스텀 메서드 만들기

Groovy의 Lambda식인 Closure와 Gradle의 ext를 활용해 커스텀 메서드를 손쉽게 만들 수 있다.

ext.[메서드명] = { param1, param2 ->
    [메서드 바디]
}

project.ext.[메서드명] = { param1, param2 ->
    [메서드 바디]
}

 

예를 들어 blogName을 출력하는 커스텀 메서드를 만들고 싶다면 다음과 같이 작성하면 된다.

project.ext.getBlogName {
    return project.blogName
}

 

반응형

 

이 글의 저작권은 Kotlin World 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.