티스토리 뷰
멀티 모듈로 구성한 개인 프로젝트에서 빌드 시간이 지나치게 긴 것 같았다
test 시간에서 지연되고 있었고 우선 생각해 본 것은 @SpringBootTest를 Mockito를 이용한 단위 테스트들로 바꿔보려 했다
그러나 멀티 모듈로 나눴고 모듈 수만큼의 @SpringBootApplication을 가진 클래스가 존재한다
-> 21.09.24 현재는 api, batch 담당 모듈을 제외하고 나머지 @SpringBootApplication을 가진 클래스를 없애주었음
Test에서 @SpringBootTest를 제거하면 여러 개의 SpringBootApplication이 찾아진다고 하며 에러가 터졌다
@SpringBootTest(classes = "{Controller.class}, {Service.class}")처럼 모든 의존성을 넣어 해결해주는 방법이 있지만
애초에 테스트 시간 단축을 위해 @SpringBootTest를 제거하려 한 것이기에 이 방법대로 할 수는 없었다
해결을 위해 @SpringBootApplication을 대체할 수 있는 방법을 고민하고, 찾아보다가 흥미로운 글을 발견했다
gradle을 통해 빌드하는 경우 gradle.properties 또는 gradle.yml을 통해 최적화를 이룰 수 있다는 글이었다
요즘. yml 파일을 자주 사용하기 때문에 참조한 블로그와는 다르게 gradle.yml로 작성해봤다
옵션은 간단하게 cache 기능을 사용하도록 하여 바뀐 것이 없다면 빠르게 실행되어 전체 실행시간이 단축된다
cache 기능을 써본 이들이라면 cache 존재에 따라 성능 차이가 극과 극이라는 것은 잘 알 것이다
configureondemand는 gradle daemon을 항상 사용하게 할 것이라는 옵션이다
daemon에 관해서는 gradle 공식 사이트를 참고하자
간략하게 설명해보자면 Gradle Daemon은 성능에 있어서 매우 중요하다고 한다
daemon은 지속되는 프로세스로써 빌드마다 생성하는 비용을 줄이고 프로젝트 구조 / 파일에 대한 캐시를 사용할 수 있다
gradle 3.0부터는 기본 세팅이 같이 시작되는 거라고 하는데 일단 두긴 했다
캐시의 영향 때문에 부정확할 수 있으나 내 환경에서 ./gradlew clean build로 빌드를 실행해본 결과 거의 차이 나지 않았다
따라서 configureondemand: true는 적지 않아도 좋다 궁금하신 분들은 직접 실험해보길 권한다
parallel은 병렬 실행을 가능하게 하는 옵션이고 서브 프로젝트가 많을수록 성능 향상 폭이 크다고 한다
멀티 모듈로 구성하는 프로젝트에서는 필수적인 옵션인 것 같다
마지막 jvmargs는 메모리를 설정해주는 것으로 궁금해서 4096으로 돌려봤는데 오히려 빌드가 느려졌다
환경에 맞게 메모리 할당량을 설정해주고 잘 모르겠으면 자신이 사용하는 IDE 툴과 같은 크기의 메모리를 할당해주자
gradle.yml
org:
gradle:
caching: true
configureondemand: true
parallel: true
jvmargs: -Xmx2048m
./gradlew test
25개의 tasks를 돌리는데 45초가 걸렸다
캐시와 병렬 실행으로 45초 -> 9초 획기적인 단축을 만들었다
2022.01.01 약 300개의 테스트 코드 기준
캐시의 영향이 없도록 clean build 이용하여 총 49초 단축 가능
매번 clean할 필요는 없고 여기서는 명령어의 수행 시간을 정확하게 비교하기 위해 수행하였음
일반적으로 테스트 코드 작성 후 돌려볼 때는 ./gradlew test --parallel로 더 가볍게 실행 가능하며 20s ~ 1m 수행 시간
./gradlew clean build
./gradlew clean build --parallel
참고
'Spring > Spring Setting' 카테고리의 다른 글
[Intellij] 구글 코드 스타일 적용, if문 & for문 자동 괄호 없애기 (0) | 2022.02.20 |
---|---|
[P6Spy] p6spy 콘솔에 찍고 로그 파일 저장하기 (0) | 2022.02.18 |
[P6Spy] Log4j2, p6spy 적용해보기 (0) | 2021.11.29 |
[JPA] Spring Data JPA, QueryDSL setting (0) | 2021.09.03 |
Gradle Multi Module Setting 그레들 멀티 모듈 프로젝트 세팅 (0) | 2021.08.14 |