프로젝트/크루트

jpa 쿼리 수 줄이기

발전생 2022. 6. 21. 19:35

프로젝트 관련된 정보를 수정하려 할 때 프로젝트의 멤버인지를 체크해주는 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의 성능 차이 때문에 실행 시간 차이가 크게 난 것일 수도 있지만 내 코드는 개선되었다.