JPA/자바 ORM 표준 JPA 기본

JPQL vs Native SQL

동구나라 2022. 12. 23. 18:00

JPQL(Java Persistence Query Language)

  • JPQL이라고 하는 것은 JPA의 일부분으로 정의된 플랫폼 독립적인 객체지향 쿼리 언어입니다.
  • JPA에서 사용할 수 있는 쿼리 언어로 일반 SQL이 데이터베이스를 바라보고 작성한다면 JPQL은 엔티티 클래스를 바라보고 작성해야 합니다.
  • JPQL은 엔티티 객체를 조회하는 객체지향 쿼리다.
  • 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다.
  • SQL과 비슷한 문법을 가지며, JPQL은 결국 SQL로 변환된다.
  • JPA에서 제공하는 메소드 호출만으로 섬세한 쿼리 작성이 어렵다는 문제에서 JPQL이 탄생된 것이다.

 

JPQL 특징

  • 테이블이 아닌 객체를 검색하는 객체지향 쿼리
  • SQL을 추상화 했기 때문에 특정 벤더에 종속적이지 않음
  • JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회

 

 

기본 문법

 

String jpql = "select m from Member as m where m.name = 'coco'";

 

 

그리고 @Query어노테이션에 들어있는 nativeQuery라는 속성을 이용하여 JPQL로 작성한 것인지 SQL로 작성한 것인지를 구분할 수 있습니다.

 

  • nativeQuery = true → SQL
  • nativeQuery = false (default) → JPQL

Native SQL

 

Native SQL을 사용하는 이유

 - JPQL은 표준 SQL이 지원하는 대부분의 문법과 SQL 함수들을 지원한다.

 - 하지만 특정 데이터베이스에 종속적인 기능은 지원하지 않는다. 이때, 네이티브 SQL을 직접 작성하여 사용할 수 있다.

 

 

종속적인 기능을 사용하는 방법

  • 특정 DB만 사용하는 함수 사용하기
  • 네이티브 SQL 함수 호출하여 사용할 수 있다.
  • 하이버네이트: DB 방언에 각 DB에 종속적임 함수들을 정의해두었고, 이것을 직접 호출할 수 있다.

 

  • 특정 DB만 지원하는 SQL 쿼리 힌트 사용하기
  • 하이버네이트를 포함한 몇몇 JPA 구현체들이 지원하여, 사용할 수 있다.

  • 인라인 뷰(From 절에서 사용하는 서브쿼리), UNION, INTERSECT 사용하기
  • 하이버네이트는 지원하지 않는다.

  • 스토어 프로시저 사용하기
  • JPQL에서 스토어드 프로시저를 호출할 수 있다.

 


  • 특정 DB만 지원하는 문법 사용하기
  • 너무 종속적인 SQL 문법은 지원하지 않는다. 이땐 네이티브 SQL을 사용해야 한다.

Native SQL이란

 

  • 위처럼 다양한 이유로 JPQL을 사용할 수 없을 때, JPA는 SQL을 직접 사용할 수 있는 기능을 제공한다.
  • 이것을 네이티브 SQL이라고 한다.
  • 네이티브 SQL은 SQL을 개발자가 직접 정의하는 것이다.

 

  • 네이티브 SQL을 사용하면, 엔티티를 조회할 수 있고 JPA가 지원하는 영속성 컨텍스트의 기능을 그대로 사용할 수 있다.

 

반면 JDBC API를 직접 사용하면, 단순히 데이터의 나열을 조회할 뿐이다.

 

 

'JPA > 자바 ORM 표준 JPA 기본' 카테고리의 다른 글

일대다 양방향 정리  (0) 2024.05.07
엔티티의 생명 주기  (0) 2023.06.05
영속성 컨텍스트  (0) 2023.01.02
JPA 구동 방식  (0) 2022.12.29
JPA  (0) 2022.12.23