<aside> 💡
nGrinder 를 활용한 부하테스트, 캐싱을 활용한 성능개선
<aside> 💡
60000건 의 공지사항 전체 데이터를 조회하는 작업/api/notice공통 부하테스트 조건
전체 조회 성능 수치 변화 결과 캐싱전 → 후
| 캐싱 전 | 캐싱 후 | 개선율 | |
|---|---|---|---|
| 평균 TPS | 11.1 | 59.2 | 4.3배 |
| Peak TPS | 15.0 | 86.0 | 4.73배 |
| Mean Test Time | 897.31 ms | 167.86 ms | 81.3% 감소 |
| Executed Tests | 583 건 | 3003 건 | 4.1배 |
결론
캐싱 시 TTL(Time To Live) 20초 설정, 60초 설정 시 성능 수치 결과| TTL 20초 | TTL 60초 | |
|---|---|---|
| 평균 TPS | 59.2 | 52.0 |
| Peak TPS | 86.0 | 78.5 |
| Mean Test Time | 167.86 ms | 190.55 ms |
| Executed Tests | 3003 건 | 2634 건 |
TTL 20초 설정보다 60초 설정 시 캐싱 데이터가 장기간 유지되어
API 요청 리소스가 줄어들고, 성능이 개선된 결과를 예상하였지만, TPS, 실행 건수가 전반적으로 소폭 성능이 감소됨메모리 사용량 증가

TTL 20초 - 스카우터 모니터링 로그

TTL 60초 - 스카우터 모니터링 로그
동시성(Concurrency) 이슈
동일한 캐시 키에 요청이 몰리는 경우, 동시성 문제가 발생할 수 있음GC(Garbage Collection) 부하

캐시 적용 전 부하테스트 수행결과

캐시 적용 후 부하테스트 수행결과

<aside> 💡
GET /api/notice/page?size=100&page=[pageNum]
nGrinder 스크립트 설정
공통 부하테스트 조건
@Transactional(readOnly = true)
@Cacheable(value = "noticeCache",
key = "'noticeCache-'+ #pageable.pageNumber",
condition = "#pageable.pageNumber <= 5")
public Page<Notice> findPageNotice(Pageable pageable) {
Page<Notice> notices = noticeRepository.findAll(pageable);
// put 메소드를 사용하여 key 설정
cacheManager.getCache("noticeCache").put("noticeList" + pageable.getPageNumber(), notices);
return notices;
}
페이징 조회 성능 수치 변화 결과 캐싱전 → 후
| --- | --- | --- | --- |
결론
캐시 적용 전 부하테스트

캐시 적용 전 부하테스트 수행결과

</aside>