자바 ORM 표준 JPA 프로그래밍 - 객체지향 쿼리 언어2

lacblueeun·2021년 1월 14일
0

springboot

목록 보기
15/17
post-thumbnail

1. 경로 표현식

.(점)을 찍어 객체 그래프를 탐색하는 것

1-1 상태 필드

단순히 값을 저장하기 위한 필드이다. 경로 탐색의 끝이기 때문에 더이상 탐색할 수 없다.

1-2 단일 값 연관 경로

묵시적 내부 조인 발생하며, 탐색이 가능하다. 튜닝을 하면서 어려움을 겪을 수 있기 때문에 묵시적 JOIN 보다는 명식적으로 조인해야 한다.

1-3 컬렉션 값 연관 경로

묵시적 내부 조인 발생하며 탐색할 수 없다. FROM에서 명시적 조인을 통해서 별칭을 얻으면 별칭을 통해서 탐색 가능하다.

명시적 조인 : join 키워드 직접 사용한다.
묵시적 조인 : 경로 표현식에 의해 묵시적으로 SQL 조인이 발생한다.

영한님 : 묵시적 조인은 조인이 일어나는 상황을 파악하기 어렵기 때문에 실무에서는 명시적 조인을 사용해야 한다. (JPA를 잘 하는 분들은 튜닝으로 문제를 해결할 수 있지만..)

2. 페치 조인 (fetch join)

페치 조인은 SQL의 조인의 종류는 아니고, JPQL에서 성능 최적화를 위해 제공하는 기능이다. 연관된 엔티티나 컬렉션을 한 번에 같이 조회하는 기능이다.

2-1 엔티티 페치 조인

2-2 컬렉션 페치 조인

JPQL은 결과를 반환할 때 연관관계를 고려하지 않는다. 단지 SELECT 절에 지정한 엔티티만 조회할 뿐이다.

2-3 컬렉션 페치 조인 중복 제거

DISTINCT : 데이터베이스에 DISTINCT를 추가하는 것은 물론이고 애플리케이션에서 한 번 더 중복을 제거한다.


4. 페치 조인의 특징과 한계

페치 조인을 사용하면 SQL 한 번으로 연관된 엔티티들을 조회할 수 있어서 SQL 호출 횟수를 줄여 성능을 최적화할 수 있다. 최적화를 위해서 글로벌 로딩 전략을 지연로딩으로 하고 필요에 따라 페치 조인을 적용하는 것이 좋다.
(엔티티에 직접 적용하는 전략을 글로벌 로딩 전략이라 부른다.)

  1. 페치 조인 대상에는 별칭을 줄 수 없다.
  2. 둘 이상의 컬렉션을 페치할 수 없다.
  3. 컬렉션을 페치 조인하면 페이징 API를 사용할 수 없다.

5. Named쿼리 어노테이션

쿼리에 이름을 부여해서 사용하는 방법이다.
Named 쿼리는 애플리케이션 로딩 시점에 JPQL 문법을 체크하고 미리 파싱한다. 따라서 오류를 빨리 확인할 수 있고, 파싱된 결과를 재사용하므로 성능 최적화에 도움을 준다.

profile
Go for Frontend Developer 🧪

0개의 댓글