자바 ORM 표준 JPA 프로그래밍(인프런)

Ch10. 객체지향 쿼리 언어1(기본 문법) - 객체지향 쿼리 언어(JPQL) 소개

webmaster 2021. 12. 17. 10:47
728x90

JPA는 다양한 쿼리 방법을 지원

  • JPQL 
  • JPA Criteria 
  • QueryDSL 
  • 네이티브 SQL 
  • JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용

JPQL

JPQL 사용 예시( username에 KIM이 포함된것을 모두 조회한다)
실행 결과

  • JPA를 사용하면 엔티티 객체를 중심으로 개발
    • 문제는 검색 쿼리 
  • 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 
    • SQL을 짜더라도 테이블이 아닌 엔티티 객체를 대상으로 해야 된다.
  • 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 
  • 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요
  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
  • SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 
    • JPQL은 엔티티 객체를 대상으로 쿼리
    • SQL은 데이터베이스 테이블을 대상으로 쿼리
  • 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
  • SQL을 추상화해서 특정 데이터베이스 SQL에 의존 X 
  • JPQL을 한마디로 정의하면 객체 지향 SQL

Criteria 

JPQL 같은 경우 단순 String이기 때문에 동적 쿼리를 작성하기 어렵다.

Criteria 문법이 너무 복잡해서 JPA표준이긴하나 현업에서 자주 사용하지 못한다.
실행 결과 ( 동적쿼리를 편한하게 작성할 수 있다)

  • 컴파일 시 에러를 잡을 수 있고, 동적 쿼리를 작성하는데 훨씬 간편하다.
  • 단점은, SQL 같지 않다..(유지보수가 안된다)
  • 문자가 아닌 자바 코드로 JPQL을 작성할 수 있음
  • JPQL 빌더 역할 
  • JPA 공식 기능 
  • 단점: 너무 복잡하고 실용성이 없다. 
  • Criteria 대신에 QueryDSL 사용 권장

QueryDSL 

http://querydsl.com/

 

Querydsl - Unified Queries for Java

Unified Queries for Java. Querydsl is compact, safe and easy to learn. <!-- Querydsl Unified Queries for Java Querydsl provides a unified querying layer for multiple backends in Java. Compared to the alternatives Querydsl is more compact, safer and easier

querydsl.com

QueryDsl (JPQL과 모양이 비슷하고, 한눈에 어떤 쿼리를 동작시키는지 파악하기 쉽다)

  • 문자가 아닌 자바코드로 JPQL을 작성할 수 있음
  • JPQL 빌더 역할 
  • 컴파일 시점에 문법 오류를 찾을 수 있음
  • 동적 쿼리 작성 편리함 
  • 단순하고 쉬움 
  • 실무 사용 권장
  • 오픈 소스 라이브러리

네이티브 SQL

데이터 베이스에 의존적인 Native 쿼리도 작성할 수 있다
실행 결과 - 쿼리가 그대로 실행

  • JPA가 제공하는 SQL을 직접 사용하는 기능
  • JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능 
    • 예) 오라클 CONNECT BY, 특정 DB만 사용하는 SQL 힌트

JDBC 직접 사용, SpringJdbcTemplate 등

  • JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, 스프링 JdbcTemplate, MyBatis 등을 함께 사용 가능 
  • 단 영속성 컨텍스트를 적절한 시점에 강제로 플러시 필요 
    • 예) JPA를 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트 수동 플러시
728x90