hoondev

[Spring JPA] 객체지향 쿼리 언어 본문

Spring JPA

[Spring JPA] 객체지향 쿼리 언어

hoondev3 2023. 2. 10. 12:49

JPA 지원하는 쿼리 방법

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

 

JPQL

JPA를 사용하면 엔티티 객체를 중심으로 개발하게 된다.

문제는 검색 쿼리인데 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 해야한다.

모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다.

애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.

 

JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공한다.

SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.

SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다.

JPQL은 엔티티 객체를 대상으로 쿼리를 생성하고

SQL은 데이터베이스 테이블을 대상으로 쿼리를 생성한다.

//검색
String jpql = "select m from Member m where m.age > 18"; 
List<Member> result = em.createQuery(jpql, Member.class)
 .getResultList();
실행된 SQL 
 select 
     m.id as id, 
     m.age as age, 
     m.USERNAME as USERNAME, 
     m.TEAM_ID as TEAM_ID 
 from 
     Member m 
 where 
     m.age>18

 

Criteria

//Criteria 사용 준비
CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Member> query = cb.createQuery(Member.class); 

//루트 클래스 (조회를 시작할 클래스)
Root<Member> m = query.from(Member.class); 

//쿼리 생성 CriteriaQuery<Member> cq = 
query.select(m).where(cb.equal(m.get("username"), “kim”)); 
List<Member> resultList = em.createQuery(cq).getResultList();

문자가 아닌 자바코드로 JPQL을 작성할 수 있다.

JPQL 빌더 역할을 한다. 

JPA 공식 기능이다.

하지만 너무 복잡하고 실용성이 없다.

Criteria 대신에 QueryDSL 사용하자.

 

QueryDSL

 JPAFactoryQuery query = new JPAQueryFactory(em);
 
 QMember m = QMember.member; 
 List<Member> list = query.selectFrom(m)
                          .where(m.age.gt(18)) 
                          .orderBy(m.name.desc())
                          .fetch();

문자가 아닌 자바코드로 JPQL을 작성할 수 있다.

JPQL 빌더 역할을 한다.

컴파일 시점에 문법 오류를 찾을 수 있다.

동적쿼리 작성이 편리하다. 단순하고 쉽다.

실무 사용 권장.

 

네이티브 SQL

String sql = 
 “SELECT ID, AGE, TEAM_ID, NAME FROM MEMBER WHERE NAME = ‘kim’"; 
 
List<Member> resultList = 
 em.createNativeQuery(sql, Member.class).getResultList();

JPA가 제공하는 SQL을 직접 사용하는 기능이다.

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

 

JDBC 직접 사용, SpringJdbcTemplate

JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, 스프링 JdbcTemplate, 마이바티스등을 함께 사용 가능하다.

단 영속성 컨텍스트를 적절한 시점에 강제로 플러시가 필요하다. 예) JPA를 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트 수동 플러시

 

Reference

https://www.inflearn.com/course/ORM-JPA-Basic

'Spring JPA' 카테고리의 다른 글

[Spring JPA] JPQL 프로젝션  (0) 2023.02.14
[Spring JPA] 기본 문법과 쿼리 API  (0) 2023.02.13
[Spring JPA] 값 타입 컬렉션  (0) 2023.02.09
[Spring JPA] 값 타입의 비교  (0) 2023.02.08
[Spring JPA] 값 타입과 불변 객체  (0) 2023.02.07
Comments