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

HotFried·2023년 10월 3일
0

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

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

JPQL 소개

JPA를 사용하면 엔티티 객체를 중심으로 개발한다.
문제는 검색 쿼리인데, 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다.
모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 하기 때문에
애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 필요한 SQL이 필요하다.


  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
    -> SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원

  • JPQL은 엔티티 객체를 대상으로 쿼리 <-> SQL은 DB 테이블을 대상으로 쿼리

∴ 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
∴ SQL을 추상화해서 특정 DB SQL에 의존 X
∴ 객체지향 SQL


List<Member> resultList = em
        .createQuery("select m from Member m where m.username like '%kim%'", Member.class)
        .getResultList();
  • Entity 매핑 정보를 읽어서 적절한 SQL을 만들어 보낸다.

Criteria

JPQL은 단순히 String이기 때문에 동적 쿼리를 짜기가 힘들다. 이럴 땐 Criteria를 사용한다.

  • 문자가 아닌 자바 코드로 JPQL을 작성할 수 있다.
  • JPQL 빌더 역할
  • JPA 공식 기능
  • 너무 복잡하고 실용성이 없어 QueryDSL 사용을 권장
// 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();

QueryDSL

  • 문자 대신 자바 코드로 JPQL을 작성할 수 있다.
  • JPQL 빌더 역할을 한다.
  • 컴파일 시점에 문법 오류를 찾을 수 있다.
  • 동적 쿼리 작성이 편리하다.
  • 단순하고 쉽다.
    -> 실무 사용을 권장
//JPQL
//select m from Member m where m.age > 18
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();

네이티브 SQL

  • JPA가 제공하는 SQL을 직접 사용하는 기능
  • JPQL로 해결할 수 없는 특정 DB에 의존적인 기능
    -> ex) 오라큰 CONNECT BY, 특정 DB만 사용하는 SQL 힌트
String sql = "SELECT ID, AGE, TEAM_ID, NAME FROM MEMBER WHERE NAME = ‘kim’";

List<Member> resultList =
        em.createNativeQuery(sql, Member.class).getResultList();

JDBC 직접 사용, SpringJdbcTemplate 등

  • JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, 스프링JdbcTemplate, Mybatis 등을 함께 사용 가능

  • 단, 영속성 컨텍스트를 적절한 시점에 강제로 flush() 필요
    ex) JPA를 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트 수동 flush()

참고 :

김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.

자바 ORM 표준 JPA 프로그래밍 - 기본편

profile
꾸준하게

0개의 댓글