jpa와 jpa를 활용하기 위한 다양한 방법들

JPQL

  • 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 SQL.
  • 단순한 persist 로 해결할 수 없는 복잡한 쿼리를, 직접 SQL을 작성하여 구현.
  • 표준 SQL을 따르며 관련한 문법을 지원.
  • DB마다의 방언으로 자동 번역.
  • JPA의 잘 활용하기 위한 가장 기본적인 기술.

QueryDSL

  • QueryDSL은 일종의 JPQL의 빌더.
  • JPQL의 문법 오류를 QueryDSL로 사용할 경우 컴파일 시점에서 잡아 내기 때문에, QueryDSL를 자주 사용.
  • 다만 QueryDSL을 이해하기 위해서는 JPQL에 대한 깊은 이해가 필요.
  • QueryDSL과 JPQL로 사실상 대부분의 문제를 해소할 수 있음.

JPQL과 QueryDSL로 해소가 안되는 문제는? 네이티브 SQL, JDBC의 직접 사용

네이티브 SQL

  • JPA는 JPQL로 해결할 수 없는 것에 대하여 네이티브 SQL을 지원함.
  • 엔티티 매니저를 통해 사용할 수 있음.
  • JPQL과 더불어 네이티브SQL은 해당 쿼리를 호출하기 전에 자동으로 flush 기능이 있음.
Member member1 = new Member();
member1.setName("kim");
em.persist(member1);

Member member2 = new Member();
member2.setName("lee");
em.persist(member2);

// em.flush();
// em.clear();

final List<Member> resultList = em.createNativeQuery("SELECT * FROM MEMBER WHERE NAME = 'kim'", Member.class).getResultList();

System.out.println("size : " + resultList.size());

for (Member member : resultList) {
    System.out.println("member = " + member);
}
Hibernate: 
    /* dynamic native SQL query */ SELECT
        * 
    FROM
        MEMBER 
    WHERE
        NAME = 'kim'
size : 1
member = jpa8_query.a_native.Member@53c6f96d

JDBC, SpringJdbcTemplate 의 사용

  • JPQL, 네이티브 sql로 해결할 수 없으면 JDBC나 SpringJdbcTemplate을 사용함.
  • 영속성 컨텍스트로 관리되지 않으므로, flush가 자동적으로 수행되지 않아, 데이터 불일치가 일어날 수 있음.
  • 그러므로 JDBC 등을 JPA와 함께 사용할 때는 반드시 강제로 플러시를 해야함.