Gradle 빌드 캐시/병렬/Configuration Cache로 빌드 50% 줄이기
빌드 시간이 길면 배포 속도도 느립니다. Gradle 캐시, 병렬 빌드, Configuration Cache 3가지만 제대로 켜도 체감 30~50%까지 줄일 수 있습니다. 이 글은 단일 프로젝트/멀티모듈 공통으로 적용 가능한 실전 설정과 주의점을 정리합니다.
1) gradle.properties (로컬/CI 공통)
org.gradle.jvmargs=-Xmx2g -Dfile.encoding=UTF-8
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configuration-cache=true
# 실험적 기능/플러그인은 CC와 충돌할 수 있으니 하단 6장 참고
- parallel: 모듈/태스크 간 병렬 실행
- caching: 입력/출력 서명 기반 결과 재사용
- configuration-cache: 구성 단계 결과를 캐시하여 이후 실행 가속
2) settings.gradle(.kts)에서 로컬/원격 캐시
// settings.gradle.kts
buildCache {
local {
isEnabled = true
removeUnusedEntriesAfterDays = 30
}
// 원격 캐시(예: S3/HTTP)는 CI-우선으로 연결
// remote {
// url = uri("https://cache.example.com/")
// isPush = System.getenv("CI") == "true"
// }
}
3) 태스크 입력/출력 선언(증분 빌드의 핵심)
커스텀 태스크/코드 생성 태스크는 @Input/@Output*을 명시해야 캐시가 먹힙니다.
abstract class GenerateApi : DefaultTask() {
@get:Input abstract val sourceDir: DirectoryProperty
@get:OutputDirectory abstract val outputDir: DirectoryProperty
@TaskAction
fun run() { /* 입력→출력 파일 생성 */ }
}
4) 테스트/컴파일 최적화
// build.gradle.kts (루트 또는 서브모듈)
tasks.withType<JavaCompile> {
options.isIncremental = true
}
tasks.withType<Test> {
useJUnitPlatform()
// 바뀐 테스트만 실행(CC/캐시와 시너지)
systemProperty("junit.jupiter.execution.parallel.enabled", true)
systemProperty("junit.jupiter.execution.parallel.mode.default", "concurrent")
maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1)
testLogging {
events("FAILED","SKIPPED")
showStandardStreams = false
}
}
5) 의존성/플러그인 규율
- 동적 버전(
1.+) 사용 금지 → 캐시 무효화 원인 - SNAPSHOT 최소화, 버전 카탈로그/버전 플러그인으로 고정
- 어노테이션 프로세서(예: Lombok/MapStruct)는 버전을 고정하고, 불필요한 프로세서 제거
6) Configuration Cache와의 충돌 피하기
- 프로젝트 속성/환경변수를 구성 단계에서 읽는 커스텀 코드가 있으면 CC가 끕니다 → 태스크 액션으로 이동
- 일부 플러그인(초기 버전의 jgit, Shadow, old Spring 플러그인 등)은 CC 미지원일 수 있으니 최신으로
- 문제 분석:
--configuration-cache로 실행 후 보고서 링크 확인
7) CI 연동(GitHub Actions)
name: Gradle CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'
cache: gradle
- name: Build
run: ./gradlew build --scan --no-daemon
Actions의 cache: gradle은 래퍼/의존성 캐시를 관리합니다. 원격 빌드 캐시와 함께 쓰면 PR 간 속도가 크게 줄어듭니다.
8) 멀티모듈 팁
- 공통 설정은 루트 플러그인/컨벤션 플러그인으로 “중복 제거”
- 모듈 간 원치 않는 의존 끈을 제거(상위→하위 단방향)
- 빈번히 바뀌는 모듈을 경계로 분리하여 캐시 타격 최소화
9) 측정과 검증
./gradlew clean build --scan
빌드 스캔에서 Task Execution, Configuration Cache 히트율을 확인합니다. 로컬/CI에서 “변경 없음” 반복 빌드 시간을 비교해 최적화 전후를 숫자로 관리하세요.
10) 체크리스트
org.gradle.parallel/caching/configuration-cache=true모두 활성- 동적 버전 제거, 고정 버전 + 버전 카탈로그
- 커스텀 태스크 I/O 어노테이션 선언
- CC 리포트 경고 0에 수렴
- CI 캐시/원격 빌드 캐시 병행
⏪ 이전 글 보기: Tomcat 10 설치+튜닝 체크리스트(커넥터/스레드풀/압축/헤더)
⏩ 다음 글 보기: Spring Security 6: JWT 로그인/리프레시 토큰 구현(코드 전체)
⏩ 다음 글 보기: Spring Security 6: JWT 로그인/리프레시 토큰 구현(코드 전체)
👉 1편: Ubuntu 24.04에서 Nginx로 무료 SSL(HTTPS) 적용
👉 5편: Gradle 빌드 최적화로 빌드 50% 줄이기
👉 6편: Spring Security 6 JWT 로그인/리프레시 토큰
👉 7편: JPA N+1 완전 정복: 자동 감지부터 fetch join·EntityGraph·batch_size 실전 해결 전략
👉 8편: Docker로 PostgreSQL 운영(백업/복구/업그레이드)
'서버 인프라 실무' 카테고리의 다른 글
| 리눅스 서버에 Tomcat WAS 올리기: 설치·보안·systemd·Nginx 연동까지 한 번에 (0) | 2025.10.16 |
|---|---|
| JPA N+1 완전 정복: 자동 감지부터 fetch join·EntityGraph·batch_size 실전 해결 전략 (0) | 2025.10.09 |
| Tomcat 10 운영자 튜닝 가이드(커넥터·스레드풀·압축·헤더 최적화) (0) | 2025.10.07 |
| systemd 서비스로 스프링부트 배포: 로그 분리·자동 재시작까지 (0) | 2025.10.07 |
| UFW 방화벽 실전 규칙: SSH 잠그고, 웹만 열고, 포트스캔 막기 (0) | 2025.10.06 |