-
gradle build 속도 개선하기프로젝트/선착순 쿠폰 발급 시스템 2023. 4. 25. 00:01728x90
개요
project가 잘 build 되는지 , 테스트는 제대로 수행되는지 ./gradlew build 명령어를 수행하곤 합니다.
하지만 매번 오래걸리는 빌드를 더 빠르게 수행할 수 없을까? 에서 출발해서 속도를 개선해보고자 합니다.
현재 build time
BUILD SUCCESSFUL in 49s
49초가 걸렸습니다.
현재 프로젝트는 멀티모듈구조에 kafka embedded test 한건이 존재했습니다.
IntelliJ IDEA로 build 하기
If you have a pure Java or a Kotlin project, it is sometimes better to select IntelliJ IDEA for building a project. IntelliJ IDEA supports the
incremental build
which significantly speeds up the building process. Yet, keep in mind that the IntelliJ IDEA compiler does not support some parts of the Gradle project build processing and might cause problems in building your project correctly.Intellij IDEA 공식문서의 내용 중 일부입니다.
간단히 요약하자면 pure Java 또는 Kotlin 프로젝트라면 때때로 Intellij IDEA를 통해 빌드하는 게 더 빠를 수 있다고 제시합니다.
하지만 때로는 지원하지 않는 부분도 있다고 합니다.
설정 변경
File -> Settings -> Build, Execution, Deployment -> Gradle -> Build and run using, Run tests using(Intellij IDEA로 변경)
* 해당 옵션은 추후에 Spring Boot Applciation을 실행할 때 에러가 나와서 gradle로 설정하였으며, 아래에 소개할 개선작업들을 수행했을 때 속도가 크게 차이 나지 않았습니다.
gradle clean build
./gradlew clean build BUILD SUCCESSFUL in 33s
처음에 gradlew build만 수행했을 때 4초가 나와 clean build를 수행해 보니 33초가 수행되었습니다.
gradle 공식문서에서 제시하는 속도를 개선하는 방법
- 최신상태로 유지하기
- gradle을 최대한 최신 상태로 유지하라
- java를 최대한 최신 상태로 유지하라
- 최신 버전의 plugins을 사용하라
- 병렬 실행하기
- 단일 하위 프로젝트에 의해 지배되는 빌드는 전혀 이점이 없습니다.
- deamon으로 실행하기
- gradle은 기본적으로 deamon을 가능하도록 합니다.
- 캐시 추가하기
- gralde은 기본적으로 캐시 구성을 사용하지 않습니다.
- heap size 증가시키기
- 기본적으로 512MB가 세팅되어 있습니다. 이를 2048로 증가시킵니다.
- 병렬로 테스트 수행하기
병렬로 실행하기
gradle.properties 파일을 project root에 만듭니다.
org.gradle.parallel=true
clean build를 수행하면 18초로 줄어들었습니다.
Deamon으로 실행하기
gradle.properties 파일에 설정을 추가합니다.
org.gradle.daemon=true
기본적으로 설정되어 있어서 그런지 성능개선이 이루어지지 않았습니다.캐시구성 가능하게 하기
gradle.properties 파일에 설정을 추가합니다.
org.gradle.caching=true
이 또한 gradle clean build 했을때 성능 개선이 이루어지지 않았습니다.heap size 증가시키기
gradle.properties 파일에 설정을 추가합니다.
org.gradle.jvmargs=-Xmx2048M
이 또한 크게 개선되지 않았습니다.병렬로 테스트 적용하기
tasks.withType(Test).configureEach { maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1 }
병렬 테스트는 독립적이어야 합니다.
파일이나 데이터베이스와 같은 리소스를 공유해서는 안 됩니다.
테스트가 리소스를 공유하는 경우 예측할 수 없는 무작위 방식으로 서로 간섭할 수 있습니다.
실무 프로젝트에 적용
- 기존 시간 : 3m 20s
- gradle.properties 적용 후 시간 : 1m 55s
- 병렬 테스트 적용 후 시간 : 1m 18s
결론
이외에도 build script를 수정하는 다양한 방식들이 존재하지만 최대한 간단한 것 위주로 테스트해보았습니다.얼마 안되는 시간으로 49초에서 18초대로 270%정도의 성능개선이 일어났습니다.이는 개발생산성을 올려줄것으로 기대됩니다.심지어 gradle에서는 gradle build dcache deep dive등과 같은 무료 온라인 hands-on training을 제공합니다.
관심 있으신분들은 참고하세요
https://gradle.com/training/#build-cache-deep-dive
참고자료
https://www.jetbrains.com/help/idea/gradle-settings.html
https://docs.gradle.org/current/userguide/performance.html
'프로젝트 > 선착순 쿠폰 발급 시스템' 카테고리의 다른 글
Database local dev환경 구성하기(postgreSQL with Docker) (0) 2023.04.29 회원 도메인 모듈 만들기 (0) 2023.04.27 gradlew build 에러 해결 과정 기록 (0) 2023.04.24 Docker로 Spring + Kafka 실행하기 (0) 2023.04.22 kafka 모듈 구성하기 (0) 2023.04.20 - 최신상태로 유지하기