1 minute read

JPA 지원 쿼리 방법들에 대한 소개

종류

  • JPQL
  • JPA Criteria
  • QueryDSL
  • 네이티브 SQL
  • JDBC API 사용, MyBatis, SpringJdbcTemplate 병행 사용.

JPQL

  • JPA에서 사용하는 객체지향 SQL
  • JPQL로 작성하면 ANSI SQL(표준 SQL)로 번역된다.
  • 쿼리 작성 규칙은 거의 SQL과 동일하지만, 테이블대신 객체를 사용하고, 조회 컬럼대신 객체 자체만 선언해도 된다.
    • e.g "Select m from Member m where m.name like '%xxx%' "
한계 단점.
  • 단순 문자열이기 때문에 발생할 수 있는 오류. 심지어 빌드시에도 발생하지 않는 오류가 있다.
  • 동적쿼리를 만들 때, 스트링을 분기하는 등의 컨트롤이 오류를 발생하기 좋다.

Criteria(크라이테이리아)

  • JPA 스펙임.
  • 자바 코드로 jpql을 만들어 냄.
    //생략
    //Criteria 사용 준비
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Member> query = db.createQuery(Member.class );
    //조회 시작할 클래스
    Root<Member> m = query.from(Member.class);
    //쿼리 생략
    CriteriaQuery<Member> sq = query.selet(m).where(cb.equal(m.get("username"),"kim"));
    //쿼리 실행
    List<Member> resultList = em.createQuery(cq).getResultList();
    //생략
    
  • 복잡하고 실용성이 낮음.
  • 동적쿼리 쉬움.
  • 컴파일 오류로 잡기 쉬움. 오타 발생도 낮음.
  • 가독성이 떨어짐. 굳이 안써도 될 듯.

QueryDSL

  • 세팅이 팍팍하다.
  • 컴파일시 문법 오류 찾을 수 있고
  • 자바코드로 JPQL 작성할 수 있음.
  • 동적쿼리 작성이 쉽다.
  • 가독성이 좋다.
  • 쉽다. 단순하다.

네이티브 SQL

  • JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능사용이 필요할 때 사용가능 em.createNativeQuery메서드.
    • e.g 오라클 connect by 등

JDBC 직접 사용

  • SpringJdbcTemplete, MyBatis 등.
  • 주의점.
    • jpa는 영속성 컨텍스가 있다는 점 유념. jpa 우회 즉, 직접 생sql을 실행할 경우 dbconn.excuteQuery("select...from..") 실행 전에 em.flush() 해줘서 영속성 컨텍스트를 강제 flush 될 수 있도록 할 것.

Comments