Gradle 완전 학습 인덱스
1. 개요 & 배경
빌드 도구란?
- 빌드 도구가 필요한 이유 (컴파일, 의존성, 테스트, 패키징 자동화)
- Make → Ant → Maven → Gradle 발전 흐름
- Maven vs Gradle 비교
- XML(선언형) vs Groovy/Kotlin DSL(프로그래밍)
- Convention over Configuration
- 빌드 속도 (증분 빌드, 빌드 캐시, 데몬)
- Gradle의 핵심 설계 원칙 — 유연성, 성능, 확장성
Gradle 핵심 구성요소 미리보기
Project — 빌드의 기본 단위
Task — 빌드 작업의 최소 단위
Plugin — 기능 묶음 (Java, Spring Boot 등)
Dependency — 의존성 관리
Build Script — build.gradle / build.gradle.kts
2. 설치 & 프로젝트 구조
설치
- SDKMAN으로 설치 (
sdk install gradle)
- Homebrew (
brew install gradle)
- 수동 설치 및 환경변수 설정
gradle --version 확인
Gradle Wrapper (실무 표준)
- Wrapper란? — 프로젝트에 Gradle 버전을 고정하는 방법
gradle wrapper — Wrapper 파일 생성
gradlew / gradlew.bat — OS별 실행 스크립트
gradle/wrapper/gradle-wrapper.properties — 버전 관리
- Wrapper를 통한 CI/CD 일관성 확보
- Wrapper 버전 업그레이드 (
./gradlew wrapper --gradle-version 8.x)
프로젝트 구조
project/
├── gradle/wrapper/ # Wrapper 파일
├── gradlew / gradlew.bat # Wrapper 실행 스크립트
├── settings.gradle.kts # 프로젝트 이름, 서브프로젝트 선언
├── build.gradle.kts # 빌드 스크립트
├── gradle.properties # 전역 속성
└── src/
├── main/java/
├── main/resources/
├── test/java/
└── test/resources/
settings.gradle.kts vs build.gradle.kts 역할 구분
gradle.properties — JVM 옵션, 속성값 저장
Groovy DSL vs Kotlin DSL
- Groovy DSL (
build.gradle) — 유연하지만 IDE 지원 약함
- Kotlin DSL (
build.gradle.kts) — 타입 안전, IDE 자동완성, 실무 권장
- 두 DSL 주요 문법 차이 비교
3. 빌드 스크립트 기초
settings.gradle.kts
rootProject.name — 프로젝트 이름 설정
include(":module-a", ":module-b") — 서브프로젝트 등록
pluginManagement 블록 — 플러그인 저장소/버전 중앙 관리
dependencyResolutionManagement 블록 — 의존성 저장소 중앙 관리
build.gradle.kts 구조
plugins {} — 플러그인 적용
group, version — 프로젝트 메타데이터
repositories {} — 의존성 저장소
dependencies {} — 의존성 선언
tasks {} — 태스크 구성
빌드 생명주기 3단계
- 초기화 (Initialization) —
settings.gradle.kts 실행, 프로젝트 트리 구성
- 구성 (Configuration) — 모든
build.gradle.kts 실행, Task 그래프 구성
- 이 단계에서 모든 Task 코드가 실행됨 (Task Action은 아직 실행 안 됨)
- 실행 (Execution) — 요청된 Task와 의존 Task 실행
4. Task
Task 기본
- Task란? — 빌드의 최소 실행 단위 (컴파일, 복사, 테스트 등)
./gradlew tasks — 사용 가능한 Task 목록 조회
./gradlew <taskName> — Task 실행
./gradlew <taskName> --dry-run — 실행 없이 Task 순서 확인
기본 제공 Task (Java Plugin 기준)
compileJava / compileTestJava
processResources / processTestResources
classes / testClasses
test
jar
build — 전체 빌드 (assemble + check)
clean — 빌드 출력 디렉터리 삭제
assemble — 아티팩트 생성
check — 검증 (test 포함)
커스텀 Task 정의
// 간단한 Task 등록
tasks.register("hello") {
doLast {
println("Hello, Gradle!")
}
}
// 타입이 있는 Task
tasks.register<Copy>("copyDocs") {
from("docs")
into(layout.buildDirectory.dir("docs"))
}
doFirst {} vs doLast {} — Task Action 추가
dependsOn — Task 의존성 선언
finalizedBy — Task 완료 후 실행할 Task
mustRunAfter / shouldRunAfter — 순서 힌트
Task 타입
Copy — 파일 복사
Delete — 파일 삭제
Exec — 외부 명령 실행
JavaExec — Java 클래스 실행
Zip / Tar — 압축
Test — 테스트 실행
- 커스텀 Task 클래스 —
DefaultTask 상속
Task 입출력 (Incremental Build)
@InputFiles / @OutputFiles / @Input / @OutputDirectory
- 입출력이 변경되지 않으면 Task UP-TO-DATE로 건너뜀
@TaskAction — Task의 실제 작업 메서드
Task 구성 vs 실행 구분
- 구성 단계에서 실행 단계 코드를 쓰면 안 되는 이유
doLast {} / doFirst {} — 실행 단계에서 실행됨
- 람다 블록 내 코드 — 구성 단계에서 실행됨 (주의!)
5. 플러그인 (Plugin)
플러그인이란?
- Task, 설정, 컨벤션을 재사용 가능한 단위로 묶은 것
- 플러그인 적용 방법 —
plugins {} 블록 (권장)
핵심 플러그인
Java 플러그인
id("java") 적용
- 소스 셋 (SourceSets) —
main, test
- 표준 디렉터리 레이아웃 적용
java { sourceCompatibility / targetCompatibility / toolchain }
Java Library 플러그인
id("java-library")
api vs implementation 의존성 구성 차이
- ABI(Application Binary Interface) 개념
Kotlin 플러그인
id("org.jetbrains.kotlin.jvm")
compileOptions, jvmToolchain 설정
- Kotlin + Java 혼용 소스 컴파일 순서
Spring Boot 플러그인
id("org.springframework.boot")
bootJar Task — 실행 가능한 Fat JAR 생성
bootRun Task — 로컬 실행
bootBuildImage Task — OCI 이미지 생성
bootJar.enabled / jar.enabled 설정
Spring Dependency Management 플러그인
id("io.spring.dependency-management")
- BOM(Bill of Materials) 임포트
importBom() vs mavenBom()
기타 주요 플러그인
application — 실행 가능한 JVM 애플리케이션
jacoco — 코드 커버리지
checkstyle / pmd / spotbugs — 정적 분석
maven-publish — Maven 저장소 퍼블리시
signing — 아티팩트 서명
플러그인 버전 관리
plugins {} 블록에서 버전 지정
- Version Catalog (
libs.versions.toml)와 조합
pluginManagement {} (settings.gradle.kts)로 중앙 관리
6. 의존성 관리
저장소 (Repositories)
mavenCentral() — Maven Central
google() — Google Maven 저장소
mavenLocal() — 로컬 Maven 캐시 (~/.m2)
maven { url = uri("https://...") } — 커스텀 저장소
- 저장소 우선순위 (선언 순서)
의존성 선언
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
testImplementation("org.springframework.boot:spring-boot-starter-test")
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
runtimeOnly("com.mysql:mysql-connector-j")
}
의존성 구성 (Configuration)
implementation — 컴파일 + 런타임, 소비자에게 노출 안 됨 (권장)
api — 컴파일 + 런타임, 소비자에게 노출됨 (java-library만)
compileOnly — 컴파일만 (런타임 제외) — Lombok, JSP API 등
runtimeOnly — 런타임만 (컴파일 제외) — JDBC 드라이버 등
testImplementation — 테스트 컴파일 + 런타임
testCompileOnly / testRuntimeOnly
annotationProcessor — APT (Lombok, QueryDSL QClass 생성 등)
의존성 버전 지정
- 고정 버전:
"group:artifact:1.0.0"
- 동적 버전:
"group:artifact:1.+" (권장하지 않음)
- BOM 임포트로 버전 통합 관리
의존성 전이 (Transitive Dependencies)
- 의존성이 의존성을 가져오는 구조
./gradlew dependencies — 의존성 트리 확인
./gradlew dependencyInsight --dependency <name> — 특정 의존성 경로 추적
의존성 충돌 해결
- Gradle 기본 전략 — 가장 높은 버전 선택
resolutionStrategy.force("group:artifact:version") — 버전 강제
exclude(group = "...", module = "...") — 특정 의존성 제외
resolutionStrategy.eachDependency {} — 동적 버전 교체
Version Catalog (libs.versions.toml)
- 버전을 중앙 파일에서 관리
[versions], [libraries], [bundles], [plugins] 섹션
libs.spring.boot.web 형태로 참조
- 멀티 모듈에서 버전 일관성 확보
7. 멀티 모듈 프로젝트
멀티 모듈 구조
root-project/
├── settings.gradle.kts # include(":api", ":core", ":batch")
├── build.gradle.kts # 공통 설정
├── api/
│ └── build.gradle.kts
├── core/
│ └── build.gradle.kts
└── batch/
└── build.gradle.kts
settings.gradle.kts에서 모듈 등록
include(":api") — 서브프로젝트 등록
project(":api").projectDir = file("modules/api") — 경로 커스터마이징
모듈 간 의존성
implementation(project(":core")) — 다른 모듈 의존
- 순환 의존성 금지 (Gradle 빌드 실패)
공통 설정 적용 방법
- 루트
build.gradle.kts에서 subprojects {} / allprojects {}
subprojects — 모든 서브프로젝트에 적용
allprojects — 루트 포함 모든 프로젝트
subprojects {} 사용 시 주의 — 구성 시간 증가
- Convention Plugin (권장) — 재사용 가능한 빌드 로직 플러그인화
buildSrc/ 디렉터리 또는 별도 모듈
my-java-conventions.gradle.kts 패턴
buildSrc
- 빌드 로직을 공유하는 특수 모듈
buildSrc/src/main/kotlin/ — 커스텀 플러그인, Convention Plugin
- 자동으로 빌드 클래스패스에 포함
- Composite Build와의 차이
Composite Build
- 독립된 프로젝트를 포함하는 방법
includeBuild("../shared-lib") (settings.gradle.kts)
- 로컬 개발 시 SNAPSHOT 의존성 대체
8. 빌드 성능 최적화
Gradle 데몬 (Daemon)
- 데몬이란? — JVM 프로세스를 재사용해 빌드 시간 단축
- 기본 활성화 (Gradle 3.0+)
./gradlew --no-daemon — 데몬 비활성화
./gradlew --stop — 데몬 종료
org.gradle.daemon=true (gradle.properties)
증분 빌드 (Incremental Build)
- 변경된 Task만 재실행 — UP-TO-DATE 체크
- Task 입출력 선언의 중요성
--rerun-tasks — 강제 전체 재실행
빌드 캐시 (Build Cache)
- 이전 빌드 결과를 캐시하여 재사용 (CI/CD 서버 간 공유 가능)
org.gradle.caching=true (gradle.properties)
- 로컬 캐시 (
~/.gradle/caches/)
- 원격 캐시 (Gradle Enterprise, self-hosted)
- 캐시 가능한 Task —
@CacheableTask
병렬 실행 (Parallel Execution)
org.gradle.parallel=true — 독립적인 프로젝트/Task 병렬 실행
- 멀티 모듈에서 효과적
Configuration Cache
- 구성 단계 결과를 캐시 — 두 번째 실행부터 구성 단계 건너뜀
org.gradle.configuration-cache=true
- 호환되지 않는 플러그인 주의
JVM 튜닝
org.gradle.jvmargs=-Xmx2g -XX:+HeapDumpOnOutOfMemoryError (gradle.properties)
- Kotlin DSL 컴파일 메모리 요구량
org.gradle.workers.max=4 — 워커 수 제한
빌드 스캔 (Build Scan)
./gradlew build --scan — 빌드 분석 리포트 생성
- 병목 구간, 느린 Task, 캐시 히트율 분석
- Gradle Enterprise (유료) / Develocity
9. 소스 셋 & 테스트 구성
소스 셋 (Source Sets)
main / test — 기본 소스 셋
- 커스텀 소스 셋 추가 (통합 테스트, 성능 테스트 등)
sourceSets {
create("intTest") {
compileClasspath += sourceSets.main.get().output
runtimeClasspath += sourceSets.main.get().output
}
}
- 소스 셋별 의존성 구성 자동 생성 (
intTestImplementation 등)
통합 테스트 분리 패턴
integrationTest 소스 셋 + Task 구성
./gradlew integrationTest — 별도 실행
check Task에 통합 여부 설정
Test Task 구성
- JUnit 5 설정 —
useJUnitPlatform()
- 병렬 테스트 실행 —
maxParallelForks
- 테스트 필터링 —
--tests "com.example.*"
- 테스트 결과 리포트 (
build/reports/tests/)
testLogging — 콘솔 출력 설정
JaCoCo (코드 커버리지)
id("jacoco") 플러그인
jacocoTestReport Task — HTML/XML 리포트 생성
jacocoTestCoverageVerification — 커버리지 임계값 설정
test.finalizedBy(jacocoTestReport) — 테스트 후 자동 리포트
10. 아티팩트 퍼블리시
maven-publish 플러그인
id("maven-publish")
publishing { publications {} repositories {} } 블록
MavenPublication — 퍼블리시할 내용 정의
./gradlew publishToMavenLocal — 로컬 Maven 캐시에 배포
./gradlew publish — 원격 저장소 배포
POM 메타데이터 설정
pom {} 블록 — 라이선스, 개발자, SCM 정보
versionMapping — 동적 버전을 고정 버전으로 변환
저장소 인증
- 환경변수 또는
gradle.properties로 자격증명 관리
credentials {} 블록
GitHub Packages / Nexus / Artifactory
- 사내 Maven 저장소 연동 패턴
- SNAPSHOT vs RELEASE 저장소 분리
11. 커스텀 플러그인 개발
플러그인 개발 방식
- Script Plugin — 다른 빌드 스크립트 파일
apply from: "other.gradle.kts"
- Precompiled Script Plugin (buildSrc / Convention Plugin) — 권장
- Binary Plugin — JAR로 배포하는 독립 플러그인
Convention Plugin 패턴
// buildSrc/src/main/kotlin/my-java-conventions.gradle.kts
plugins {
id("java")
id("checkstyle")
}
java {
toolchain { languageVersion = JavaLanguageVersion.of(17) }
}
// 공통 설정...
- 각 모듈에서
id("my-java-conventions") 한 줄로 공통 설정 적용
Plugin 인터페이스 구현
Plugin<Project> 구현
project.plugins.apply() / project.tasks.register()
Extension — 플러그인 설정 DSL 추가 (project.extensions.create())
커스텀 Task 클래스
@InputFiles, @OutputDirectory 어노테이션
@TaskAction 메서드
Property<T>, RegularFileProperty, DirectoryProperty — Lazy 속성
12. CI/CD 연동
GitHub Actions
./gradlew build 기본 빌드
- Gradle 캐시 액션 (
actions/cache + ~/.gradle/caches)
- Gradle Wrapper 검증 (
gradle/wrapper-validation-action)
- 빌드 스캔 자동 퍼블리시
Jenkins / GitLab CI
- Gradle Wrapper 통한 빌드 (
./gradlew clean build)
- 테스트 리포트 아카이빙
- Docker 이미지 빌드 (
bootBuildImage)
환경별 설정
-P 파라미터로 속성 전달 (./gradlew build -PenableOptimizations=true)
- 환경변수 →
gradle.properties 주입
- 프로파일별 의존성 전환 패턴
13. 실무 팁 & 안티패턴
자주 쓰는 명령어
./gradlew build — 전체 빌드
./gradlew test — 테스트만 실행
./gradlew bootRun — 로컬 서버 실행
./gradlew dependencies --configuration runtimeClasspath — 런타임 의존성 트리
./gradlew properties — 프로젝트 속성 전체 출력
./gradlew help --task <taskName> — Task 상세 도움말
./gradlew --profile — 빌드 프로파일 리포트 생성
디버깅
./gradlew build --info — 상세 로그
./gradlew build --debug — 전체 디버그 로그
./gradlew build --stacktrace — 스택 트레이스 출력
println(...) — build script 내 디버그 출력
안티패턴
allprojects {} / subprojects {} 남용 — 구성 시간 증가, Convention Plugin으로 대체
- Task 구성 블록 내 무거운 로직 — 구성 시간 증가
- 동적 버전 (
1.+) 사용 — 재현 불가능한 빌드
implementation 대신 compile 사용 (deprecated 제거됨)
buildDir 직접 사용 — layout.buildDirectory 사용 권장 (Lazy 평가)
groovy.lang.GString 불일치 — Kotlin DSL에서 Groovy 코드 그대로 복붙
보안
gradle.properties에 비밀값 저장 시 .gitignore에 추가
credentials {} 블록으로 하드코딩 방지
- Wrapper JAR 무결성 검증 (
gradle/wrapper/gradle-wrapper.jar SHA 확인)
- 의존성 검증 (
verification-metadata.xml)
14. 버전별 주요 변경사항
Gradle 7.x
- Version Catalog GA
- Java Toolchain 지원
- Configuration Cache 실험적 도입
api / implementation 엄격 적용
Gradle 8.x
- Configuration Cache 안정화
--warning-mode all 기본 강화
buildDir → layout.buildDirectory 권장
- Kotlin DSL 성능 개선
Project.buildDir Deprecated
- Isolated Projects (실험적) — 모듈 간 완전한 격리로 최대 병렬화
- Java Toolchain 자동 다운로드
Spring Boot 3.x + Gradle
org.springframework.boot:spring-boot-gradle-plugin:3.x
bootBuildImage — Buildpacks 기반 이미지 빌드
- GraalVM Native Image —
nativeCompile Task
springBoot { mainClass = "com.example.MainKt" } 설정
0 items under this folder.