Test 성능개선을 위한 Bean caching 전략
1. @SpringBootTest 단일 사용 지양
많은 bean을 그대로 불러오기 때문에, 지연시간이 길어진다.
2.@ContextConfiguration을 사용
실제로 필요한 bean만을 가져와 사용한다.
3. @DataJpaTest 등을 사용
특정 레이어에 맞는 테스트인 경우, 적절한 어노테이션을 사용해서 로딩 속도 증대
4. Bean이 아닌 생성자로 초기화 하여 사용
기본적으로 항상 가져가야 하는 개념은 위와 같다. 다음은 가장 핵심 전략인 Bean Caching 전략을 설명한다.
ApplicationContext 캐싱 이란?
Spring 테스트 프레임워크는 각 테스트에 필요한 ApplicationContext의 구성을 기반으로 캐싱을 수행한다. 즉, 테스트에 사용되는 구성 클래스, 액티브 프로파일, 환경 변수 등이 모두 동일하면, 동일한 ApplicationContext가 여러 테스트에서 재사용된다.
기본 개념은 다음과 같다. 하지만, 제한 조건은 모든 조건이 동일할때만 캐싱이 된다.
혹시나 캐싱에 대해 모를 수도 있는 사람을 위해 풀어서 설명해보겠다.
기존에 10개의 bean을 로드 하여 테스트를 진행하고, 다음 테스트에서 기존 10개 + 1개의 bean을 로드 한다면, 캐싱을 사용하지 못하게 되는 것이다. 하지만 다음 테스트에서 다시 기존 10개를 사용한다면 캐싱된 데이터를 사용 가능하게 되는 것이다.
캐싱 전략
즉, 이러한 특징들을 전략으로서 활용하자면 다음과 같다.
공통 구성 사용
최대한 공통 구성을 갖도록 구성 하여야 한다. 이를 위해 @ContextConfiguration과 @TestConfiguration를 적극적으로 활용한다.
예를 들면, 테스트에 사용되는 bean을 묶음 단위로써 사용하는 것이다.
테스트 A에서 bean이 5개, 테스트 B에서 bean이 테스트A + 1 이라면, 결국 두번의 로딩이 이뤄지게 된다. 이를 방지하기 위해, @TestConfiguration을 활용하여 묶음단위로 6개를 동일 적용하게 되면 캐시를 타게 된다.
무작정, @SpringBootTest를 붙여 테스트하는것보다 압도적으로 성능 개선이 되므로, 테스트가 2만개 3만개짜리 프로젝트에서는 극적인 효과를 본다.
참고사항
Spring Boot의 ApplicationContext 캐싱 저장 default 갯수 = 32
저장 갯수가 32개가 되면 성능이 저하 된다. 일반적으로 캐싱 또한 최대한 적게 저장할 수록 좋다.
물론 default값이므로 50개 이상으로 늘릴 수 는 있다.