Chap10 -1
이 글은 김영한님의 jpa책을 보고 공부한 흔적입니다.
JPA Chap 10-1 객체지향 쿼리 언어
객체지향 쿼리 소개
EntityManager.find() 메소드를 사용하면 식별자로 엔티티 하나를 조회할 수 있다.
이 조회는 하나를 조회할 뿐 다수를 조회할 때는 어렵다.
왜냐면 하나씩 검색해서 모든 회원 엔티티를 메모리에 올려두기는 힘들기 때문이다.
이 문제를 해결하기 위해서 나온것이 바로 JPQL이다.
JPQL의 특징이란?
테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리다.
SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.
즉 엔티티 객체를 대상으로 하는 객체지향 쿼리이고, 조회한 결과로 엔티티 객체를 생성해서 반환한다.
객체지향 쿼리 종류
JPQL
Criteria 쿼리
네이티브 SQL
QueryDSL
JDBC 직접 사용, MyBatis 같은 SQL 매퍼 프레임워크 사용
JPQL이란?
엔티티 객체를 조회하는 객체지향 쿼리다.
JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않는다.
JPQL은 SQL보다 간결하다.
Creteria 쿼리란?
문자가 아닌 query.select (m) .where(...)처럼 프로그래밍 코드로 JPQL을 작성할 수 있다.
컴파일 시점에 오류를 발견할 수 있다.
IDE를 사용하면 코드 자동완성을 지원한다.
동적 쿼리를 작성하기 편하다.
모든 장점을 상쇄할 정도로 복잡하고 장황하다. 사용하기가 불편한 건 물론이고 Criteria로 작성한 코드도 한눈에 들어오지 않는다는 단점이 있다.
QueryDSL 이란?
JPQL 빌더 역활을 한다.
코드기반이면서 단순하고 사용하기 쉽다.
네이티브 SQL 이란?
SQL은 지원하지만 JPQL이 지원하지 않는 기능이 있을때 네이티브 SQL을 사용한다.
특정 데이터베이스에 의존하는 SQL을 작성해야 한다.
데이터베이스를 변경하면 네이티브 SQL도 수정해야 한다.
JDBC 직접 사용, 마이바티스 같은 SQL 매퍼 프레임워크 사용
JDBC 커넥션에 직접 접근하고 싶으면 JPA는 JDBC 커넥션을 획득하는 API를 제공하지 않으므로 JPA 구현체가 제공하는 방법을 사용해야 한ㄷ,
JDBC나 마이바티스를 JPA와 함께 사용하면 영속성 컨텍스트를 적절한 시점에 강제로 플러시 해야한다.
JPA를 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트를 수동으로 플러시해서 데이터베이스와 영속성 컨텍스트를 동기화하면 된다.
스프링 프레임워크를 사용하면 JPA와 마이바티스를 손쉽게 통합할 수 있다.
스프링 프레임워크의 AOP를 적절히 활용해서 JPA를 우회하여 데이터베이스에 접근하는 메소드를 호출할 때마다 영속성 컨텍스트를 플러시하면 깔끔히 해결 할 수 있다.
Last updated