안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다.

 

이번 포스팅은 프로젝트를 진행하는 동안 명확한 이해 없이 지나갔었던 build.gradle.kts에 대해 정리하고자 합니다.

 

 

1. Build.gradle

 

build.gradle.kts는 Gradle이라는 빌드 자동화 도구에서 프로젝트 빌드 구성을 정의하기 위해 사용되는 스크립트입니다.

Gradle은 주로 자바, 코틀린, 스칼라와 같은 JVM 언어를 기반으로 사용되고 있습니다.

 

build.gradle 파일은 Groovy라는 동적 언어로 작성되며, 프로젝트 의존성 관리, 플러그인 설정, 태스크 정의와 같은 것을 담당합니다.

  • 의존성 설정: 라이브러리나 다른 모듈에 대한 의존성을 정의합니다.
  • 플러그인 적용: 프로젝트에 필요한 Gradle 플러그인을 정의합니다.
  • 리포지토리 설정: 라이브러리 의존성을 가져올 리포지터리를 설정합니다.
  • 테스크 정의: 빌드, 테스트, 배포 등의 커스텀 태스크를 정의할 수 있습니다.
  • 빌드 설정: 빌드 과정에서 필요한 Java 버전, 컴파일 옵션 등을 설정할 수 있습니다.

build.gradle.kts는 build.gradle과 기능은 같지만, 코틀린 기반의 DSL(Domain-Specific-Language)를 사용하여 작성된 스크립트입니다.  코틀린 DSL을 사용하는 것은 Groovy 기반 DSL에 비해 몇 가지 이점을 제공합니다.

  • 정적 타입 검사: 코틀린은 정적 타입 언어이므로, 코딩 시 타입 에러를 빠르게 확인할 수 있습니다.
  • IDE 지원: 정적 타입 덕분에 인텔리제이와 호환이 잘되는 특징이 있습니다.

 

 

2. 주로 사용되는 블록 정리

 

plugins

빌드 스크립트에 추가적인 기능을 제공합니다. 플러그인은 빌드 프로세스에 추가적인 기능을 제공하거나, 생명주기를 확장합니다.
빌드 프로세스를 제어하고 확장하는 점에서 dependencies와 차이점이 있습니다.
plugins {
    kotlin("jvm") version "1.8.22"
    kotlin("plugin.spring") version "1.8.22"
}

 

 

repositories

mavenCentral()을 주로 호출하게 되는데, 이는 Gradle 의존성을 해결할 때, Maven Central 저장소를 검색하라는 의미입니다. Maven Central 저장소는 오픈 소스 Java 라이브러리를 비롯한 많은 종속성들이 호스팅 되는 곳으로, 중앙 저장소 역할을 합니다.

 

repositories {
    mavenCentral()
}

 

 

dependencies

프로젝트가 컴파일 및 실행을 위해 필요한 라이브러리를 지정합니다.
이는 프로젝트의 소스 코드가 의존하는 외부 모듈이나 라이브러리를 의미합니다. 의존성은 컴파일 / 런타임 / 테스트 의존성 등으로 분리할 수 있습니다

 

dependencies {
    implementation("org.springframework.boot:spring-boot-starter")
}

 

 

java

gradle 빌드 스크립트에서 java 소스 코드와 컴파일된 바이트 코드가 호환되는 버전 등을 지정하는 역할을 합니다.

sourseCompatibility: 이 옵션은 사용하는 Java 소스가 어떤 버전의 java 언어 기능을 사용할 수 있는지 결정합니다.
targertCompatibility: 컴파일된 클래스 파일이 실행될 때, 최소 요구되는 버전을 나타냅니다.

 

java {
    sourseCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

 

 

allprojects

모든 하위 프로젝트에 공통적으로 적용되는 구성을 정의합니다.
멀티 모듈 프로젝트를 사용할 때, 각각의 하위 프로젝트는 'allprojects' 블록에 정의된 설정을 상속받습니다.

 

 

tasks.withType<KotlinCompile>

해당 블록은 KotlinCompile 태스크에 대한 설정을 구성합니다.
코틀린 소스를 컴파일하는 태스크를 정의하여, 코틀린 컴파일러에 전달되는 옵션을 설정할 수 있습니다

freeCompilerArgs += "-Xjsr305=strict": 이 옵션은 코틀린 컴파일러에게 JSR-305 어노테이션에 대한 처리 방법을 strict 모드로 설정하라는 지시를 합니다. JSR-305는 자바코드에서 nullablility를 명시하는 표준 어노테이션입니다.

jvmTarget = JavaVersion.VERSION_17.toString(): 이 설정은 컴파일러가 생성하는 바이트코드가 실행될 JVM의 타깃 버전을 JAVA 17로 설정합니다. 컴파일 코드는 최소 Java 17이 설치된 환경에서 실행될 수 있도록 합니다.

 

 

tasks.withType<Test>

이 블록은 Test에 대한 태스크를 정의합니다

useJUnitPlatform(): 이 설정은 Gradledl JUnit 플랫폼을 사용하여 태스크를 실행하도록 지시합니다.

 

allprojects {

    group = "com.dayplancontent"
    version = "0.0.1-SNAPSHOT"

    tasks.withType<KotlinCompile> {
        kotlinOptions {
            freeCompilerArgs += "-Xjsr305=strict"
            jvmTarget = JavaVersion.VERSION_17.toString()
        }
    }

    tasks.withType<Test> {
        useJUnitPlatform()
    }

    repositories {
        mavenCentral()
    }
}

 

subprojects

이 블록은 Gradle 멀티프로젝트 빌드 설정의 일부로 사용됩니다.
멀티 프로젝트 빌드에서는 하나의 루트 프로젝트와 여러 하위 프로젝트로 구성되며,
각 하위 프로젝트는 공통의 구성이 필요합니다.
만약 root를 제외한 프로젝트가 필요하다면 해당 블록에 작성할 수 있습니다.

 

 

apply

apply는 플러그인이나 다른 스크립트를 현재의 프로젝트 또는 하위 프로젝트에 적용하고 싶을 때, 사용합니다.
apply는 setting.gradle 혹은 setting.gradle.kts에 적은 플러그인을 적용할 때 사용할 수 있습니다.

 

subprojects {
    apply {
        apply(plugin = "org.springframework.boot")
    }

    dependencies {
        implementation("org.jetbrains.kotlin:kotlin-reflect")
    }
}

 

 

project

멀티 모듈 프로젝트를 설정할 때, 특정 모듈은 다른 모듈에 의존할 필요성이 있습니다.
가령 애플리케이션 모듈은 도메인 모듈에 의존하도록 설정해야 합니다.
이 경우 특정 모듈을 project 내부에 작성하여 의존성을 설정할 수 있습니다.

 

dependencies {
    implementation(project(":domain"))
}

 

 

Jar, BootJar by tasks

by tasks는 위임 프로퍼티를 통해 해당 타입의 작업을 찾아서 할당하라는 것을 의미합니다.
여기서 Jar, BootJar는 각각 다음의 의미를 가지게 됩니다.
각 설정을 enable = true 혹은 enable = false를 하게 되면, jar 생성 관련한 부분을 플레그로 제어할 수 있습니다.

BootJar: SpringBoot 애플리케이션을 만드는 설정을 할 수 있습니다.
Jar: 표준 자바 라이브러리 Jar를 만드는 데 사용할 수 있습니다.

 

import org.springframework.boot.gradle.tasks.bundling.BootJar

val jar: Jar by tasks
val bootJar: BootJar by tasks

bootJar.enabled = false
jar.enabled = true

 

 

그 외에도 다양한 옵션들이 있습니다.

다른 옵션들은 해당 글에 추가적으로 옵션을 추가해 나가도록 하겠습니다.!

감사합니다!

+ Recent posts