-
객체 지향 쿼리
-
복잡한 검색 조건을 지원하기 위한 JPA의 기술
-
테이블이 아닌 객체를 대상으로 쿼리하여 데이터베이스에 의존하지 않는다
-
종류는 세가지가 존재한다.
- JPQL: 자바 영속성 쿼리 언어
- Criteria: JPQL을 작성하기 위한 API, 빌더 모음
- NativeSQL: JPQL 대신 직접 SQL을 이용 ( 벤더 의존 ).
- JDBC와 달리 영속성 컨텍스트 기능을 이용할 수 있다
-
서포터
- SQL을 보다 편리하게 사용하기 위한 서포터 라이브러리
- QueryDSL, Mybatis
- 이 중 Mybatis는 네이티브 쿼리를 이용하여 사용 전/후 영속성 컨테스트 동기화가 필요하다
-
JPQL
- 엔티티 객체를 조회하는 객체 지향 쿼리. 특정 데이터베이스에 의존하지 않는다
- 객체 별칭을 필수로 사용해야 한다
- Select 절에 지정한 엔티티만 조회한다 ( 연관 관계를 고려하지 않음 )
- 파라미터 바인딩
- SQL 인젝션을 방지하고 성능 향상을 위해 사용한다
- 위치 기준 바인딩: ex ) select m from m where ?1
- 이름 기준 바인딩: ex) select m from m where :userName → 주로 사용된다
- 특징
- 항상 데이터베이스를 조회한다
- 조회한 엔티티는 영속상태이다
- 영속성 컨텍스트에 이미 존재하면 새로운 쿼리를 버린다
-
프로젝션(Projection)
- 조회 대상을 지정하는 방식에 대한 지칭
- 종류
- 엔티티 프로젝션
- 일반적으로 사용하는 엔티티 조회 방법. 영속성 컨텍스트에서 관리된다.
- 임베디드 타입 프로젝션
- 조회의 시작점이 될 수 없다
- 엔티티를 통하여만 조회가 가능하다
- 영속성 컨텍스트에서 관리되지 않는다
- 스칼라 타입 프로젝션
-
기본 데이터 타입만을 대상으로 쿼리하는 경우
-
엔티티의 여러 대상을 한꺼번에 조회하여 새로운 객체로 반환이 가능하다
-
영속성 컨텍스트에서 관리되지 않는다
-
예시
Select new jpa.test.newerDTO(o.address, o.product) from Order O
-
JPQL 조인 문법
- Inner Join: Inner는 생략가능
- Collection Join: 연관된 다른 엔티티를 컬렉션 형태로 Left Join 한다
- Seta Join: Inner Join만 지원한다. 서로 연관없는 엔티티를 Join하게 한다
- JoinOn: Join 시에 대상을 필터링 하여 Join 한다
- FetchJoin
- Join에 접속사로써 연관된 엔티티나 컬렉션을 한번에 Join하는 최적화 기능
- 별칭을 사용할 수 없다
- 둘 이상의 컬렉션을 Fetch 할 수 없다
- 페이징 API를 사용 할 수 없다
-
경로 표현식( Path Expression )
- 객체 그래프를 탐색하는 경로를 표현하는 식
- 용어
- 상태 필드: 단순히 값을 저장하는 프로퍼티. 추가 탐색이 불가능하다
- 연관 필드: 연관 관계를 위한 필드 ( 임베디드 타입 포함 )
- 묵시적 조인: 경로 표현식에 의해 탐색 시 JPA 자체적으로 Join 하여 데이터를 보여주는 것. Inner Join만 사용된다
- 단일 연관: ManyToOne, OneToOne . 묵시적 조인이 일어난다. 계속 탐색 가능
- 컬렉션 연관: OneToMany, ManyToMany. 묵시적 조인. 추가 탐색이 불가능하다
-
Named Query
- 정적 쿼리로써 Class에 쿼리를 부여하여 특정 객체를 생성 할 수 있다
-
Criteria
- 프로그래밍 코드로 JPQL의 작성을 서포트 한다
- 어노테이션 프로세서를 이용하여 메타 모델로 작성하여 문자열 코딩 제거 가능
- 동적 쿼리 작성에 유리
- 컴파일 시점에 오류 발견 가능
-
심화 쿼리
- 벌크연산
- 여러 건을 한번에 수정하거나 삭제하는 연산
- Entity Manager의 excuteUpdate 함수를 이용한다
- id 생성 방식이 외부 인프라에 있는 경우 사용 할 수 없다
- 영속성 컨텍스트를 무시하고 저장소에 직접 쿼리한다
- 영속성 컨텍스트 유지 방법
- Entity Manager의 refresh 함수를 통해 다시 조회한다
- 벌크 연산을 먼저 수행한다
- 영속성 컨텍스트를 초기화(clear) 한다
-
Spring Data JPA
- 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트
- Interface인 Jpa Repository만을 상속하여 런타임에 프레임워크가 실제 객체를 주입하여 사용한다
- 신규 엔티티 판단 전략은 식별자 값이 EMPTY VALUE(blank, null, 0) 여부로 결정된다.
- 쿼리 메소드 기능
- 메소드 이름으로 쿼리 생성: 정해진 규칙으로 메소드 이름을 작성 할 시 쿼리를 자동으로 생성
- 메소드 이름으로 Named쿼리 생성
- 정적 쿼리 작성 서포트: Query 어노테이션으로 정적 쿼리 지원
- 벌크성 수정 쿼리
- 페이징과 정렬: Pageable, Sort 인터페이스를 통해 자동으로 페이징 및 정렬 지원
- 쿼리 힌트 및 락을 편리하게 사용 할 수 있도록 어노테이션 제공
- 명세(Specification)
- 도메인 클래스 컨버터
-
영속성 관리
-
컬렉션과 부가기능
| --- | --- | --- | --- |
-
Collection,List는 중복 비교가 필요하지 않기 때문에 엔티티를 추가해도 지연 로딩된 컬렉션을 초기화 하지 않는다.
-
Set은 중복을 비교하기 위해 엔티티 추가 시 컬렉션을 초기화 한다
-
OrderColumn 어노테이션은 불필요한 쿼리가 많이 사용하게 되어 잘 사용되지 않는다
-
OrderBy 어노테이션
-
Converter
-
리스너
-
엔티티 그래프
-
예외 처리