현재 유저가 스크럼 생성 가능 여부를 알려주는 메서드입니다.
@Query("SELECT s FROM Scrum s WHERE s.user = :user AND s.deleteDate IS NULL AND s.endTime IS NULL")
List<Scrum> findByUserWithAndDeleteDateIsNullAndEndTimeIsNull(@Param("user") User user);
3개의 조건으로 해당하는 Scrum을 찾아서 List에 담은 다음에 리스트가 비었는지, 아닌지에 따라 true, false를 리턴했습니다.
그러나 다시 코드를 천천히 살펴보니, 3개 조건에 해당하는 스크럼이 하나라도 존재하면 false를 리턴해주면 되는 간단한 문제였습니다.
아마 당시에는 해당 방법이 쉬운 방법이라 생각하고 넘어갔던 것 같습니다.
그래서 성능 측정을 해보고 개선을 진행해보려고 합니다. 우선 위 쿼리로 찾았을 때 측정 결과입니다.
(DB 데이터 - 2000개, 스레드-20, 램프업-0, LoopCount-100)
평균 668ms가 나왔고, 25~35의 tps가 측정됐습니다.
해당 쿼리를 개선하기 위해서 exists를 사용하기로 결정했습니다.
JPQL에서는 SELECT절에 exists를 지원하지 않기에 쿼리메서드를 사용하였습니다.
boolean existsByUserAndDeleteDateIsNullAndEndTimeIsNull(User user);
3개의 조건이 만족하는 데이터가 나오면 바로 true를 리턴하게 됩니다.
변경 후 동일한 조건에서 측정 결과입니다.
평균 171ms가 나왔고, tps는 110~130이 측정됐습니다.
사소한 귀찮음, 실수로 인해 어떻게 보면 4~5배의 자원 낭비가 이루어졌던 상황입니다.
다행이도 해당 코드에 이상함을 느끼고 성능 개선을 할 수 있었습니다.
사실은 5배 비효율적인 코드를 사용하고 있었던 게 아닐까?
반응형
'프로젝트 > 씈크럼 프로젝트' 카테고리의 다른 글
QueryDsl로 페이지네이션 도입(검색 API 구현) (1) | 2024.02.17 |
---|---|
QueryDSL 도입기 (0) | 2024.02.17 |
조작된 토큰으로 SignatureException 발생 예외 처리 (0) | 2024.02.02 |
Swagger를 배포한 상태로 사용해보기 (0) | 2024.02.01 |