Gradle 활용하기: 의존성 관리, 태스크 생성, 플러그인 활용법
안녕하세요! Gradle 기초 시리즈의 마지막 포스팅에 오신 것을 환영합니다. 지금까지 Gradle의 기본 개념, 프로젝트 구조, 명령줄 인터페이스, 빌드 파일 작성법에 대해 알아보았습니다. 오늘은 Gradle을 더 효과적으로 활용할 수 있는 의존성 관리, 태스크 생성, 플러그인 활용법에 대해 자세히 살펴보겠습니다.
의존성 관리 (Dependency Management)
Gradle의 가장 강력한 기능 중 하나는 의존성 관리입니다. 의존성 관리는 프로젝트가 외부 라이브러리를 효율적으로 활용할 수 있게 해주며, 여러 유형의 의존성을 세밀하게 제어할 수 있습니다.
의존성 구성 (Configurations)
Gradle에서는 의존성이 다양한 '구성(configurations)'에 속할 수 있으며, 각 구성은 의존성이 언제 어떻게 사용되는지를 정의합니다:
- implementation: 구현에 필요한 의존성 (컴파일 및 런타임에 필요)
- api: 구현 및 API에 필요한 의존성 (다른 프로젝트에 노출됨)
- compileOnly: 컴파일 시에만 필요한 의존성
- runtimeOnly: 런타임에만 필요한 의존성
- testImplementation: 테스트 구현에 필요한 의존성
- testRuntimeOnly: 테스트 실행 시에만 필요한 의존성
의존성 선언 예제
dependencies {
// 구현에 필요한 라이브러리 (컴파일 및 런타임)
implementation 'com.google.guava:guava:31.1-jre'
// API에 필요한 라이브러리 (다른 프로젝트에 노출됨)
api 'org.apache.commons:commons-lang3:3.12.0'
// 컴파일 시에만 필요한 라이브러리
compileOnly 'org.projectlombok:lombok:1.18.24'
// 런타임에만 필요한 라이브러리
runtimeOnly 'org.postgresql:postgresql:42.5.0'
// 테스트 구현에 필요한 라이브러리
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'
// 테스트 실행 시에만 필요한 라이브러리
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
버전 카탈로그 (Version Catalogs)
대규모 프로젝트에서는 의존성 버전을 중앙에서 관리하는 것이 중요합니다. Gradle 7.0부터는 '버전 카탈로그'라는 기능이 도입되었습니다:
libs.versions.toml 파일 예시:
[versions]
guava = "31.1-jre"
commons-lang3 = "3.12.0"
junit = "5.9.1"
[libraries]
guava = { group = "com.google.guava", name = "guava", version.ref = "guava" }
commons-lang3 = { group = "org.apache.commons", name = "commons-lang3", version.ref = "commons-lang3" }
junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junit" }
[plugins]
spring-boot = { id = "org.springframework.boot", version = "2.7.5" }
빌드 파일에서의 사용:
dependencies {
implementation libs.guava
api libs.commons.lang3
testImplementation libs.junit.jupiter
}
plugins {
alias(libs.plugins.spring.boot)
}
태스크 생성 및 사용자 정의 (Task Creation & Customization)
Gradle의 빌드 과정은 태스크로 구성됩니다. 기본 태스크 외에도 사용자 정의 태스크를 만들어 빌드 프로세스를 확장할 수 있습니다.
기본 태스크 생성
// 가장 간단한 태스크 생성
task hello {
doLast {
println 'Hello, World!'
}
}
이 태스크를 실행하려면: ./gradlew hello
태스크 의존성 설정
태스크 간 의존성을 설정하여 실행 순서를 제어할 수 있습니다:
task hello {
doLast {
println 'Hello,'
}
}
task world {
doLast {
println 'World!'
}
}
// world 태스크는 hello 태스크에 의존
world.dependsOn hello
이제 ./gradlew world를 실행하면 hello 태스크가 먼저 실행된 후 world 태스크가 실행됩니다.
태스크 유형 사용
Gradle은 일반적인 작업을 위한 내장 태스크 유형을 제공합니다:
// 파일 복사 태스크
task copyDocs(type: Copy) {
from 'src/docs'
into 'build/docs'
include '**/*.md', '**/*.txt'
exclude '**/temp/**'
}
// 압축 파일 생성 태스크
task createZip(type: Zip) {
from 'build/docs'
archiveFileName = 'docs.zip'
destinationDirectory = file('build/distributions')
}
태스크 그룹화 및 설명 추가
태스크를 그룹화하고 설명을 추가하여 관리를 용이하게 할 수 있습니다:
task generateDocs {
group 'Documentation'
description 'Generates project documentation'
doLast {
println 'Generating documentation...'
// 문서 생성 로직
}
}
플러그인 활용법 (Plugin Usage)
플러그인은 Gradle의 기능을 확장하는 강력한 방법입니다. 코드의 재사용성을 높이고 빌드 로직을 구조화하는 데 도움이 됩니다.
플러그인 적용 방법
플러그인을 적용하는 방법은 여러 가지가 있습니다:
1. plugins DSL (권장)
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.5'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
2. buildscript block과 apply plugin (레거시)
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.7.5'
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
주요 Gradle 코어 플러그인
Gradle에는, 다양한 유형의 프로젝트를 쉽게 빌드할 수 있도록 많은 코어 플러그인이 내장되어 있습니다:
- java: Java 프로젝트를 위한 기본 플러그인
- java-library: Java 라이브러리 프로젝트를 위한 플러그인
- application: 실행 가능한 JVM 애플리케이션을 위한 플러그인
- groovy: Groovy 프로젝트를 위한 플러그인
- kotlin("jvm"): Kotlin JVM 프로젝트를 위한 플러그인
- war: 웹 아카이브(WAR) 빌드를 위한 플러그인
- maven-publish: Maven 리포지토리에 아티팩트를 게시하기 위한 플러그인
사용자 정의 플러그인 작성
대규모 프로젝트나 유사한 프로젝트가 여러 개 있는 경우, 공통 빌드 로직을 사용자 정의 플러그인으로 추출하는 것이 좋습니다:
buildSrc/src/main/groovy/com/example/CustomPlugin.groovy:
package com.example
import org.gradle.api.Plugin
import org.gradle.api.Project
class CustomPlugin implements Plugin<Project> {
void apply(Project project) {
// 태스크 추가
project.task('customTask') {
group = 'Custom'
description = 'A custom task from our plugin'
doLast {
println "Hello from custom plugin!"
}
}
// 의존성 추가
project.dependencies {
implementation 'org.apache.commons:commons-lang3:3.12.0'
}
}
}
빌드 파일에서 사용:
apply plugin: com.example.CustomPlugin
빌드 캐시와 성능 최적화
Gradle의 주요 장점 중 하나는 빌드 성능을 최적화하는 기능입니다.
빌드 캐시 활성화
빌드 캐시는 이전 빌드의 결과를 재사용하여 성능을 향상시킵니다:
// settings.gradle(.kts)
buildCache {
local {
enabled = true
directory = file("${rootDir}/build-cache")
}
}
명령줄에서 빌드 캐시 활성화:
./gradlew build --build-cache
병렬 실행 사용
멀티코어 CPU의 이점을 활용하기 위해 병렬 실행을 활성화할 수 있습니다:
./gradlew build --parallel
데몬 사용
Gradle 데몬은 빌드 사이에 정보를 캐싱하여 빌드 시간을 단축시킵니다:
./gradlew build --daemon
실제 예제: 스프링 부트 애플리케이션 빌드하기
Gradle을 사용한 스프링 부트 애플리케이션 빌드 예제를 살펴보겠습니다:
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.5'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
bootJar {
archiveFileName = "${archiveBaseName.get()}.${archiveExtension.get()}"
}
이 빌드 파일은 스프링 부트 플러그인을 사용하여 웹 애플리케이션을 설정하고, 필요한 의존성을 추가하며, 테스트 프레임워크를 구성하고, JAR 파일 이름을 사용자 정의합니다.
결론
이번 3일 간의 Gradle 기초 시리즈를 통해 Gradle의 핵심 개념과 기능에 대해 살펴보았습니다. Gradle은 유연하고 강력한 빌드 도구로, 작은 프로젝트부터 대규모 엔터프라이즈 애플리케이션까지 다양한 규모의 프로젝트에 적합합니다.
오늘 살펴본 의존성 관리, 태스크 생성, 플러그인 활용법은 Gradle을 효과적으로 사용하기 위한 필수 지식입니다. 이러한 기능을 활용하면 빌드 프로세스를 자동화하고 최적화하여 개발 생산성을 크게 향상시킬 수 있습니다.
#Gradle #DependencyManagement #GradleTasks #GradlePlugins #BuildOptimization #BuildCache #SpringBoot #JavaBuild #BuildAutomation #GradlePerformance
'gradle' 카테고리의 다른 글
Gradle 명령줄 인터페이스와 빌드 파일 작성법 마스터하기 (0) | 2025.04.30 |
---|---|
Gradle 입문 가이드: 기본 개념과 프로젝트 구조 이해하기 (0) | 2025.04.29 |
Gradle 8.7 설치 및 환경설정 방법 (0) | 2025.04.28 |