
백엔드 개발자를 준비하며 생기는 의문들을 정리한 포스트입니다.
새로운 프로젝트를 시작하는 단계에서
- 어떤 프로그래밍 언어를 사용할까?
- 어떤 플랫폼에서 개발할까?
- 어떤 빌드도구를 사용할까?
- 어떤 버전관리 시스템을 사용할까?
- 어떤 빌드배포 시스템을 사용할까?
위의 고민을 하게 됩니다.
이 고민 중에서 누구나 흔하게 접하고 매일매일 사용하고 있는 빌드도구
그 중에서 그레이들(Gradle)에 대해 이야기 하려고 합니다.

gradle은 Groovy 기반의 오픈소스 빌드 자동화 툴로
빌드 스크립트의 정보를 기반으로 소프트웨어의 빌드, 테스트, 배포를 자동화합니다.
또한 빌드하려는 대상이나 빌드 방법을 거의 고정하지 않아 유연합니다.
Spring Boot는 간편하게 웹 애플리케이션을 만들 수 있도록 도와주는 프레임워크입니다.
그런데 Gradle이 Spring Boot 전용 플러그인을 지원합니다.
애플리케이션 실행(./gradlew bootRun), 실행 가능한 JAR 파일 만들기 (./gradlew bootJar),
개발 편의 기능 추가(DevTools), Spring 관련 의존성 쉽게 추가 등
플러그인을 통해 프로젝트의 빌드 과정 자동화와 의존성 충돌 방지 및 버전관리를 위해
Gradle을 사용하게 됩니다.
Gradle이 빌드되는 것이
project라고 부릅니다.
project에는 빌드 스크립트가 포함되며 일반적으로 빌드 스크립트는 프로젝트의
루트 디렉토리에 있는build.gradle또는build.gradle.kts라는 이름의 파일입니다.
빌드 스크립트는 해당 프로젝트에 대한 테스크, 의존성, 플로그인 및 기타 구성을 정의합니다.
단일 프로젝트 빌드에는 루트 프로젝트 라고 하는 단일 프로젝트가 포함되며
다중 프로젝트 빌드에는 하나의 루트 프로젝트 와 여러 개의 하위 프로젝트가 포함됩니다.
Task는 컴퓨터 프로그램 내에서 어떤 작업을 수행하는 최소 단위로 사용됩니다.
프로젝트 속Task에는 코드 컴파일, 테스트 실행 또는 소프트웨어 배포와 같은 일부 작업을 실행하기 위한 로직이 포함되어 있습니다.
Plugin은 여러 프로젝트에서 로직과 구성을 재사용할 수 있는 수단을 제공합니다.
Plugin을 사용하면 한 번 작성된 Task를 여러 빌드에서 사용할 수 있습니다.
또한 로깅, 의존성, 버전 관리와 같이 일반적으로 사용되는 구성을 한 곳에 저장할 수도 있습니다.
이로써 빌드 스크립트의 중복을 줄일 수 있습니다.
Plugin을 사용하여 빌드 프로세스를 적절하게 모델링하면 사용 편의성과 효율성을
크게 향상시킬 수 있습니다.
사실 Spring Initializr를 통해 Kotlin 프로젝트를 생성하면
build.gradle.kts라는 프로젝트 빌드 설정을 정의하는 파일이 포함됩니다.
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "3.2.5"
id("io.spring.dependency-management") version "1.1.4"
kotlin("jvm") version "1.9.23"
kotlin("plugin.spring") version "1.9.23"
}
group = "com.example"
version = "0.0.1-SNAPSHOT"
java {
sourceCompatibility = JavaVersion.VERSION_17
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter")
implementation("org.jetbrains.kotlin:kotlin-reflect")
testImplementation("org.springframework.boot:spring-boot-starter-test")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
jvmTarget = "17"
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
하나식 뜯어보면
plugins: 프로젝트에 빌드하기 위해 필요한 작업들을 지원하는 플러그인 설정이다.group, version: Maven Group ID와 프로젝트 버전을 의미한다.java: Java 버전의 소스를 사용하겠다는 설정이다.repositories: 프로젝트에 사용되는 종속 라이브러리를 가져오기 위한 저장소를 등록하는 부분이다.dependencies: 프로젝트에 필요한 라이브러리를 등록하는 부분이다.
라이브러리를 지정할 때는 ' 그룹:이름:버전 ' 형태를 사용한다.
버전이 생략된 경우는 plugins 에서 dependency-management를 설정했기 때문에
자동으로 호환되는 버전을 알아서 등록해 준다.tasks.withType<KotlinCompile>: kotlin을 JVM 바이트코드로 컴파일한다는 것을 의미한다.task.withType<Test>: 선언 플렛폼을 사용해 테스트하겠다는 것을 의미한다.
| dependency configuration | 의미 |
|---|---|
| compileOnly | 컴파일 하는데는 필요하지만 런타임 클래스 패스에는 포함되지 않는 종속성을 나타낸다. |
| implementation | 기존의 compile 을 대체하며 컴파일과 런타임에 사용된다. |
| runtimeOnly | 기존의 runtime 을 대체하며 컴파일 타임이 아닌 런타임에만 사용된다. |
| testComplieOnly | test 에서만 적용되는 complieOnly 속성이다. |
| testImplementation | test 에서만 적용되는 implementation 속성이다. |
| testRuntimeOnly | test 에서만 적용되는 runtimeOnly속성이다. |
이번 포스트는 매번 프로젝트에서 마주치는 데 왜 사용되는 지 의문이 들었던
Gradle에 대해 알아보았습니다.
빌드에 필요한 플러그인을 자동화 해주는 만큼 유의하여 사용해야겠습니다.