| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 쿼리
- 데이터베이스
- 프로그래머스
- jsp
- oracle
- SQL
- 자바
- 정리
- spring
- 자바스크립트
- jpa
- Next.js
- 스프링부트
- 알고리즘
- JavaScript
- 코드테스트
- 프런트엔드
- 코드 테스트
- 스프링
- 서버
- java
- 프론트엔드
- 디자인 패턴
- MySQL
- 오라클
- 미니정리
- 백엔드
- web
- node.js
- BACK-END
- Today
- Total
참치코더의 꿈 메모장
JPA / 경로 탐색, 패치 조인 미니 정리 본문

경로 탐색
- 경로탐색은 JPQL에서 엔티티의 속성을 점(.)으로 접근해서 연관된 엔티티나 값을 탐색하는 것이다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
@ManyToOne
private Team team;
}
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
}
SELECT m.team from Member m -> 경로 탐색
// m.team -> Member가 가진 team 필드를 통해 다른 엔티티로 탐색
|
cs |
경로 탐색의 3가지 종류
1. 상태 필드 : m.username, 값 타입, 탐색의 끝이다.(더 이상 탐색이 불가능 하다.)
2. 단일 값 연관 필드 : m.team, 엔티티, 탐색이 가능하다.(m.team.name)
3. 컬렉션 값 연관 필드 : t.members, 컬렉션, 탐색이 불가능 하다.(명시적 선언으로 탐색해야 가능하다.)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/*상태 필드*/
SELECT m.username FROM Member m
/*단일 값 상태 필드*/
SELECT m.team.name FROM Member m
/*컬렉션 값 연관 필드*/
/*
t.members.username 처럼 컬렉션을 바로 타고 들어갈 수는 없다.
JOIN으로 별칭을 줘야만 가능하다.
*/
SELECT m FROM Team t JOIN t.members m
|
cs |
주의해야 할 점
- JPQL은 묵시적 내부 조인을 자동으로 수행한다.
- 묵시적 조인은 명시적 조인보다 제어하기 어렵고, 성능 이슈를 초래할 수 있으므로 주의해야 하며
실무에서는 명시적 조인을 사용하여 실제 내부 동작과 쿼리가 일치하도록 작성을 해야 한다.
패치 조인
- 패치 조인은 연관된 엔티티를 한 번에 함께 조회하기 위한 성능 최적화 기술이다.
SELECT m FROM member m ;
- > 이걸 한다고 가정
Member만 조회하니까, m.getTeam().getName()을 호출하면, 지연 로딩(Lazy Loading)으로 인해
추가 SQL이 실행된다. 이게 데이터가 100개가 다 다르면, 1개 호출할때 쿼리문 1개, 최소 100개 이상
의 쿼리가 실행되므로, N+1문제 엄청난 데이터 지연이 발생한다.
- 이 후 각 Member 마다 SELECT * FROM team WHERE team_id = ? 총 N + 1개의 쿼리가 실행된다.
이때 사용하는 것이 패치 조인이다.
SELECT m FROM Member m JOIN FETCH m.team
- Member와 Team을 한 번의 쿼리로 함께 조회한다.
- N+1 문제를 해결할 수 있다.
컬렉션 패치 조인
SELECT t FROM Team t JOIN FETCH t.members;
- 이렇게 하면 각 팀에 속한 멤버들을 한 번에 조회한다.
- 단 컬렉션 패치 조인을 사용하면 1:N 관계에서 Team이 조인 과정에서 N번 반복 조회된다.
- DB 입장에서 중복된 데이터가 생겨, JPA가 메모리에서 페이징한다.(심각한 성능 저하가 발생한다.)
컬렉션 패치 조인을 사용하면 이런 단점이 존재하는데 이것을 해결하기 위해 DISTINICT 명령어를 사용해
해당 중복 값들을 JPA 단에서 제거를 해주면 원하는 1개의 데이터만 얻을 수 있다.
JPA는 쿼리 결과를 받아서 엔티티 객체 그래프로 변환 할때 DISTINCT가 포함되어 있으면, 엔티티의
식별자(PK) 기준으로 중복을 제거한다.
즉 같은 PK를 가진 엔티티는 이미 영속성 컨텍스트에 존재하므로, JPA가 새로운 객체를 만들지 않고,
기존 객체를 재사용한다.
'JPA' 카테고리의 다른 글
| JPA / Named Query, 벌크 연산 기본 정리 (0) | 2025.11.10 |
|---|---|
| JPA / 다형성 쿼리, 엔티티 직접 사용 정리 (0) | 2025.11.07 |
| JPA / JPA 프로젝션, 페이징 API, JOIN 정리 (0) | 2025.10.29 |
| JPA / 값 타입 컬렉션(Value Type Collection) 정리 (0) | 2025.10.27 |
| JPA / 기본값 타입, 임베디드 타입 정리, 불변객체란?, 그에 따른 비교 (0) | 2025.10.24 |