Web Programming/JPA

nativeQuery을 제거해보자, 이유 + 성능체크

Sean-creative 2023. 11. 2. 17:20

글을 쓰게 된 이유

코드가 지저분해 보여서, chatGPT에게 정리를 부탁했더니 nativeQuery 사용을 지양하라는 팁을 받았습니다.

딱히 생각하지 못한 부분이였는데, 왜 nativeQuery를 지양해야하는지 다시 물어봤습니다.

몇개의 질문과 답변이 오고갔는데, 정리하면 이렇습니다.

  • nativeQuery를 사용하면 데이터베이스에 대한 종속성이 높아지므로, 데이터베이스를 변경하거나 다른 환경으로 전환해야 할 때 작업이 복잡해질 수 있습니다. 
  • JPQL이나 QueryDSL과 같은 ORM을 위한 쿼리 언어를 사용하여 코드의 유연성과 이식성을 높이는 것이 좋습니다. 
  • 여기서 말하는 코드의 이식성은, 다른 환경이나 플랫폼으로 쉽게 이동할 수 있는 능력을 말합니다. (특정 DB에서만 작동하는게 않도록)

 

변경할 코드 (nativeQuery를 지울 코드)

  • 하나의 unit은 여러개의 contract를 가지고 있는데, 현재날짜를 기준으로 종료되지 않는 계약 이면서 종료일 기준 2개만 가져오도록 하는 쿼리입니다.
  • 이부분에서 nativeQuery를 지우고, CURDATE()와 LIMIT 2를 수정할 것입니다.

 

변경된 코드

  1. nativeQuery 제거
  2. CURATE() -> CURRENT_DATE   (CURRENT_DATE는 JPQL의 현재 날짜를 반환하는 함수입니다)
  3. LIMIT 2 -> Pageable을 활용

  • PageRequest.of(0, 2)를 통해 page=0, size=2로 설정하여 원래의 의도대로 계약을 2개만 가져오도록합니다.

 

속도 비교

nativeQuery 사용x
nativeQuery 사용o

  • 일반적으로는 nativeQuery가 JPQL보다 빠르다고 여겨집니다. JPA의 오버헤드를 피할 수 있기 때문입니다.
  • 하지만 밑의 요인들을 고려하여 최적화 해야 빠른것이고, 저의 경우에는 오히려 nativeQuery를 사용하지 않으니 속도가 조금 개선된것을 확인 할 수 있었습니다.