Reference. 자바 ORM 표준 JPA 프로그래밍
책 목차 및 이전 글
더보기
들어가기 전 JPA 특징, Q&A
1. JPA 소개
3. 영속성 관리
4. 엔티티 매핑
4.1 - 4.3 @Entity, @Table, 다양한 매핑
4.4 - 4.5 데이터베이스 스키마 자동 생성, DDL 생성 기능
5. 연관관계 매핑 기초
6. 다양한 연관관계 매핑
7. 고급매핑
8. 프록시와 연관관계 관리
9. 값 타입
10.1 객체체지향 쿼리 소개
- JPA에서 가장 단순한 검색 방법
- 식별자로 조회
EntityManager.find()
- 객체 그래프 탐색 (예:
a.getB().getC()
)
- 식별자로 조회
- 현실적이고 복잡한 검색에는 단순한 방법으로는 해결이 어려움, 그럴 떄 JPQL을 사용
- JPQL의 특징
- 테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리
- SQL을 추상화해서 특정 데이터베이스 SQL의 의존하지 않음 (데이터베이스 변경 가능)
- JPA는 다양한 검색 방법을 제공, JPA가 공식 지원하는 기능
JPQL (Java Persistence Query Language)
Criteria 쿼리 (Criteria Query)
: JPQL을 편하게 작성하도록 도와주는 API
네이티브 SQL (Native SQL)
: JPQL대신 직접 SQL 사용
QueryDSL
: Criteria 쿼리처럼 JPQL을 도와주는 빌더 클래스, 비표준 오픈소스 프레임워크
JDBC
,MyBatis 같은 SQL 매퍼 프레임워크
사용
10.1.1 JPQL 소개
- JPQL은 엔티티 객체를 조회하는 객체지향 쿼리
- 문법은 SQL과 비슷, ANSI 표준 SQL이 제공하는 기능을 유사하게 지원
- JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않음 (방언(
Dialect
) 사용)
- JPQL은 SQL보다 간결, 엔티티 직접 조회, 묵시적 조인, 다형성 지원
JPQL 사용과 쿼리 결과
//JPQL 사용 String jpql = "select m from Member as m where m.username = 'kim'"; List<Member> resultList = em.createQuery(jpql, Member.class).getResultList(); //실제 실행된 SQL select member.id as id, member.age as age, member.team_id as team, member.name as name from Member member where member.name = 'kim'
10.1.2 Criteria 쿼리 소개
- Criteria는 JPQL을 생성하는 빌더 클래스
- 문자가 아닌
query.select(m).where(...)
처럼 프로그래밍 코드로 JPQL을 작성
- JPQL은 오타가 있어도 런타임 시점에 오류가 발생, Criteria는 이런 단점을 컴파일시 발견 가능
- Criteria의 장점
- 컴파일 시점에 오류 발견 가능
- IDE를 사용하면 코드 자동완성을 지원
- 동적 쿼리를 작성하기 편리
Criteria 쿼리 사용 예시
//Criteria 사용 준비 CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Member> query = cb.createQuery(Member.class); //루트 클래스(조회를 시작할 클래스) Root<Member> m = query.from(Member.class); //커리 생성 CriteriaQuery<Member> cq = query.select(m).where(cb.equal(m.get("username"), "kim")); List<Member> resultList = em.createQuery(cq).getResultList();
- "username"의 문자를 코드로 작성하고 싶으면 메타 모델을 사용
- 메타 모델 API는 어노테이션 프로세서 기능을 사용하여 Criteria 전용 클래스를 생성
- m.get("username") → m.get(Member_.username)으로 변경 가능
- Criteria는 장점도 많지만 복잡하고 장황하여 작성한 코드도 한눈에 들어오지않는 큰 단점
10.1.3 QueryDSL 소개
- QueryDSL도 JQPL 빌더 역할
- 코드 기반이면서 단순하고 사용하기 쉽다는 장점
- QueryDSL은 JPA 표준은 아니고 오픈소스 프로젝트
JPA뿐 아니라 JDO, 몽고DB, Java Collection 등 거의 같은 문법으로 지원
Query DSL 코드 예시
//준비 JPAQuery query = new JPAQuery(em); QMember member = QMember.member; //쿼리, 결과 조회 List<Member> members = query.from(member) .where(member.username.eq("kim")) .list(member);
10.1.4 네이티브 SQL 소개
- SQL을 직접 사용할 수 있는 기능
- 특정 데이터베이스에서만 동작하는 SQL을 사용할 때 주로 사용 (
오라클 CONNECT BY
)
- 특정 데이터베이스에 의존하는 SQL을 작성하는 단점이 발생 (데이터베이스 변경시 수정 필요)
네이티브 SQL 코드 예시
String sql = "SELECT ID, AGE, TEAM_ID, NAME FROM MEMBER WHERE NAME = 'kim'"; List<Member> resultList = em.createNativeQuery(sql, Member.class).getResultList();
10.1.5 JDBC 직접 사용, 마이바티스 같은 SQL 매퍼 프레임워크 사용
- 하이버네이트에서 JDBC 커넥션을 직접 접근하려면 JPA 구현체가 제공하는 방법을 사용
하이버네이트 JDBC 획득
Session session = entityManager.unwrap(Session.class); session.doWork(new Work() { @Override public void execute(Connection connection) throws SQLException { //work... } });
- JDBC, 마이바티스를 JPA와 함께 쓰면 영속성 컨텍스트를 적절한 시기에 강제 플러시가 필요
- JDBC, SQL 매퍼는 JPA를 우회해서 데이터베이스 접근, JPA는 인지하지 못하는 문제가 발생
- JPA를 우회해서 SQL을 실행하기 전 수동으로 플러시해서 영속성 컨텍스트 동기화가 필요
- 스프링 프레임워크에 AOP를 통해 우회접근시 플러시하면 문제를 깔끔히 해결 가능
'개발서적 > 자바 ORM 표준 JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 10.3 Criteria (0) | 2021.09.13 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 10.2 JPQL (0) | 2021.09.13 |
[자바 ORM 표준 JPA 프로그래밍] 9.3~5 값 타입과 불변 객체, 값 비교, 값 타입 컬렉션 (0) | 2021.09.13 |
[자바 ORM 표준 JPA 프로그래밍] 9.1~2 기본값 타입, 임베디드 타입 (0) | 2021.08.25 |
[자바 ORM 표준 JPA 프로그래밍] 8.4~5 영속성 전이, 고아 객체 (0) | 2021.08.25 |