1. 다양한 쿼리 방법의 간단한 소개
JPA는 다양한 쿼리 방법을 지원한다.
결국 SQL이 실행되어야 하고 실무에서는 복잡한 쿼리를 사용해서 데이터를 뽑아와야한다.
JPQL이라는 표준 문법이 있고 JPA Criteria, QueryDSL(Java 코드로 짜서 JPQL을 빌드해주는 제네레이터 클래스의 모음), 네이티브 SQL(JPQL이 아닌 데이터베이스에 종속적인 쿼리를 사용해야 할 때 사용)가 있다.
1) JPQL 소개
JPQL은 가장 단순한 조회 방법이며(ex. EntityManager.find() ) 객체 그래프 탐색(a.getB().getC())이다.
만약에 나이가 18살 이상인 회원을 모두 검색하고 싶다고 하자 이런 상황에서는 1개만 조회할 것이 아니라 WHERE 문을 사용해서 조건을 걸어야 하는 상황이 발생한다.
JPA를 사용하면 엔티티 객체를 중심으로 개발하게 되는데 위와 같이 문제는 검색 쿼리이다.
검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색할게 필요하다.
하지만.. 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다.
애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
SQL 문법과 유사하다. (SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원)
JPQL은 엔티티 객체를 대상으로 쿼리를 날리고, SQL은 데이터베이스 테이블을 대상으로 쿼리를 날리는 것이 가장 큰 차이점이다.
테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리이며, SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.
JPQL을 한마디로 정의하면 객체 지향 SQL이다.
2) Criteria 소개
JPQL을 살펴보면 IDE의 도움을 받아서 색상이 달라보이지만 사실 저 쿼리문은 그냥 단순히 string이다.
string으로 동적 쿼리를 만들기는 쉽지 않아 대안으로 나온 것이 Criteria이다.
Criteria는 자바 표준 스펙이며, 문자가 아닌 자바코드로 JPQL을 작성할 수 있다.
JPQL 빌더 역할을 하며, JPA 공식 기능이다.
단점으로는 너무 복잡하고 실용성이 없다.
Criteria 대신에 QueryDSL 사용을 권장한다.
3) QueryDSL 소개
문자가 아닌 자바코드로 JPQL을 작성할 수 있다.
JPQL 빌더 역할을 한다.
컴파일 시점에 문법 오류를 찾을 수 있다.
동적쿼리 작성이 편리하다.
단순하고 쉽다.
4) 네이티브 SQL 소개
JPA가 제공하는 SQL을 직접 사용하는 기능이다.
JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능을 사용할 때 쓴다.
ex) 오라클의 CONNECT BY, 특정 DB만 사용하는 SQL 힌트
5) JDBC 직접 사용, SpringJdbcTemplate 등
JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나 SpringJdbcTemplate, MyBatis 등을 함께 사용 가능하다.
단, 영속성 컨텍스트를 적절한 시점에 강제로 플러시할 필요가 있다.
(createNativeQuery를 호출할 때도 플러시가 된다.)
ex) JPA를 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트를 수동으로 플러시하기(entityManager.flush())
다음 글은 JPQL에 대한 기본 문법에 대해서 작성할 예정이다.
'TIL > JPA' 카테고리의 다른 글
[TIL/JPA] 기본개념 : 경로 표현식 (0) | 2024.09.10 |
---|---|
[TIL/JPA] 기본개념 : JPQL(Java Persistence Query Language) (0) | 2024.09.09 |
[TIL/JPA] 기본개념 : 값 타입 (0) | 2024.08.31 |
[TIL/JPA] 기본개념 : 영속성전이(CASCADE), 고아 객체 (0) | 2024.08.27 |
[TIL/JPA] 기본개념 : 프록시와 연관관계 관리[즉시(EAGER)로딩, 지연(LAZY)로딩] (0) | 2024.08.27 |