해결된 질문
작성
·
516
0
안녕하세요. 현재 실무에서 mybatis를 사용하고 있지만, 주도적으로 JPA를 실무에 도입하고 싶어 공부중인 주니어 개발자입니다.
한가지 궁금한 점이 생겼는데요.
어느 하나의 db table select 쿼리에서 지연이 발생한다면,
mybatis는 mapper의 쿼리 실행 계획을 보고 직접 query를 개선할 수 있는데,
JPA의 경우는 query를 자동으로 생성해주기 때문에 메소드 선언만으로는 개발자가 디테일한 쿼리 수정을 할 수 없다고 생각합니다.
이 경우, 차선으로 JPA가 생성해주는 query를 테스트 코드나 yml 설정을 통해 로그로 확인하고
JPQL을 사용해서 성능 개선을 해야하나요 ??
(DBA가 Java를 모른다는 전제 하에 이러한 궁금증이 생겨서 질문드립니다 ^^)
답변 1
0
안녕하세요. FRODO님^^
네 맞습니다. JPQL을 사용해서 성능을 개선하면 됩니다.
좀 더 자세히 설명드릴께요.
mybatis나 스프링 JdbcTemplate처럼 SQL을 직접 다루면 SQL을 직접 복사해서, 실행계획 툴에 넣거나 해서 실행계획을 바로 확인할 수 있습니다.
JPA는 JPQL을 사용하기 때문에 JPQL을 수정하면 됩니다. JPQL을 실행해서, 로그나 콘솔에 찍힌 SQL을 뽑은 다음에 실행계획을 확인하고, JPQL을 수정하면 됩니다.
저도 생각해보니 95% 정도의 문제를 대부분 JPQL로 해결했습니다. 그런데 정말 가끔 JPQL로 해결이 안되면, 대신에 native SQL을 직접 할 수 있습니다. 이런 경우 JPA가 제공하는 native SQL을 사용하거나 또는 스프링 JdbcTemplate를 사용하면 됩니다.
질문해주신 메소드 선언만으로는 개발자가 디테일한 쿼리를 수정할 수 없다고 생각합니다.
-> 이 부분은 스프링 데이터 JPA를 말씀하시는 것 같네요^^ 스프링 데이터 JPA도 @Query를 통해 JPQL을 직접 사용할 수 있으니, 쿼리 수정이 필요하면 이것을 사용하면 됩니다.
감사합니다^^ 추가 질문이 있으면 언제든지 편하게 질문해주세요.