프로젝트 관련된 정보를 수정하려 할 때 프로젝트의 멤버인지를 체크해주는 checkIsMember() 함수가 있다.
data jpa를 사용한 repository에서 코드를 이렇게 작성했었다.
하나는 count를 가져와서 project를 같이 가져오지 않는다. 그 결과 나중에 project가 필요할 때 db에 쿼리를 다시 날려서 가져와야 한다.
@Query(value = "select count(*) from (select project_id as pid from Project p where p.project_id = :projectId) join Part pa on (pa.project_id = pid) join User_Part up on (pa.part_id = up.part_id)" +
" where up.user_id = :userId", nativeQuery = true)
Long isMemberInLong(@Param("projectId") Long projectId, @Param("userId") Long userId);
이렇게 바꾸면 프로젝트 멤버인지를 체크하면서 프로젝트 정보를 같이 가져오기 때문에 다음에 프로젝트 정보를 필요로 할 때 db에 sql을 날리지 않아도 된다. entity manager가 여기에서 가져온 프로젝트 정보를 쥐고 있기 때문이다.
@Query("select p from Project p join p.parts pa join pa.userParts up where up.user.id = :userId and p.id = :projectId")
Project getProjectIfMember(@Param("projectId") Long projectId, @Param("userId") Long userId);
몇번 테스트해봤지만 두 번째 쿼리의 실행시간 차이의 오차는 크지 않았다. 1~2 ms 정도였다.
반면 첫 번째 쿼리는 69ms가 걸릴 때도 있고 들쑥날쑥하다.
실행 시간 차이를 보면 대략 20ms나 차이가 났다. 생각보다 차이가 많아서 놀랐다. 어쩌면 native query와 jpql의 성능 차이 때문에 실행 시간 차이가 크게 난 것일 수도 있지만 내 코드는 개선되었다.
'프로젝트 > 크루트' 카테고리의 다른 글
ec2를 종료해서 도커와 젠킨스가 죽었을 때 살리는 법 (0) | 2022.05.02 |
---|---|
jpa의 orphanRemoval이 잘 작동하는 지 테스트가 하고 싶을 때 (0) | 2022.04.01 |
service layer에서는 도대체 뭘 테스트 해야해요? (1) | 2022.03.31 |
Entity에 @Transactional을 쓰고 싶은데 그래도 될까? (0) | 2022.03.28 |
모바일 브라우저에서는 로그인이 안 되는 이유 (0) | 2022.03.25 |