본문 바로가기
서버 인프라 실무

Gradle 빌드 캐시/병렬/Configuration Cache로 빌드 50% 줄이기

by yamoojin83 2025. 10. 8.

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 캐시/원격 빌드 캐시 병행

 

 

👉 1편: Ubuntu 24.04에서 Nginx로 무료 SSL(HTTPS) 적용

👉 2편: UFW 방화벽 실전 규칙

👉 3편: systemd 서비스로 스프링부트 배포

👉 4편: Tomcat 10 설치+튜닝 체크리스트

👉 5편: Gradle 빌드 최적화로 빌드 50% 줄이기

👉 6편: Spring Security 6 JWT 로그인/리프레시 토큰

👉 7편: JPA N+1 완전 정복: 자동 감지부터 fetch join·EntityGraph·batch_size 실전 해결 전략

👉 8편: Docker로 PostgreSQL 운영(백업/복구/업그레이드)

👉 9편: Micrometer+Prometheus+Grafana 대시보드

👉 10편: Testcontainers로 DB 통합테스트