[JPA 기본] JPQL, Criteria, QueryDSL, 네이티브 SQL, JDBC 직접 사용

강신현·2022년 7월 27일
1

필요성

JPA를 사용하여 엔티티 객체를 중심으로 개발하면 검색 할 때 문제가 발생한다.
테이블이 아닌 엔티티 객체를 대상으로 검색하는데, 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하기 때문이다.
따라서 필요한 데이터만 DB에서 불러오는 SQL이 필요하다.

💡 JPQL

SQL을 추상화한 객체 지향 쿼리 언어

  • JPQL : 엔티티 객체를 대상으로 쿼리
  • SQL : 데이터베이스 테이블을 대상으로 쿼리
    👉 JPQL로 작성하면 SQL로 번역되어 실행됨 (JPQL은 특정 데이터베이스 SQL에 의존하지 않는다.)
//검색
String jpql = "select m From Member m where m.name like ‘%hello%'";

List<Member> result = em.createQuery(jpql, Member.class).getResultList();

💡 Criteria

너무 복잡하고 실용성이 없어 실무에서 사용안함.
Criteria 대신 QueryDSL 사용을 권장

💡 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로 해결할 수 없는 특정 데이터베이스에 의존적인 기능
  • 예 : 오라클 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 직접 사용

  • JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, 스프링 JdbcTemplate, 마이바티스 등을 함께 사용 가능하다.
  • db에서 읽어와야 하기 때문에 영속성 컨텍스트를 적절한 시점에 강제로 플러시가 필요하다.
profile
땅콩의 모험 (server)

0개의 댓글