참치코더의 꿈 메모장

JPA / JPA 프로젝션, 페이징 API, JOIN 정리 본문

JPA

JPA / JPA 프로젝션, 페이징 API, JOIN 정리

참치깡 2025. 10. 29. 18:53
728x90

 

JPA 프로젝션(Projection)

 

- 프로젝션은 SQL의 SELECT처럼 JPQL에서 엔티티 전체가 아닌 필요한 데이터만 선택해서 조회하는 기능이다.

 

프로젝션의 종류

 

엔티티 프로젝션

 

- 엔티티 전체를 조회하는 프로젝션

- 영속성 컨텍스트로 관리되므로, 변경감지(Dirty Checking)가 가능하다.

1
2
3
List<Member> members = em.createQuery(
    "SELECT , FROM Member m", Member.class)
.getResultList();
cs

 

임베디드 프로젝션

 

- @Embeddable 타입을 조회하는 프로젝션

- 엔티티 내부에 속한 값이여서 영속성 컨텍스트로 관리가 된다.

- 별도의 테이블로 분리되지 않는다.

- 값 타입이라 불변(immutable)하게 설계하는 것이 좋다.

1
2
3
List<Address> addresses = em.createQuery(
    "SELECT m.address FROM Member m", Address.class)
    .getResultList();
cs

 

new를 사용하는 DTO 프로젝션

 

- 내가 사용하고자 하는 실제 DTO로 매핑 할수 있는 프로젝션이다.

- 항상 new에 변경하고자하는 DTO의 패키지 명을 포함하여 작성을 해야 한다.

- 주로 API 응답용, 화면 데이터 전달용으로 사용된다.

- 영속성 컨텍스트가 관리를 해주지 않는다.

1
2
3
List<MemberDto> dtoList = em.createQuery(
    "SELECT new com.example.MemberDto(m.username, m.age) FROM Member m", MemberDto.class)
    .getResultList();
cs

 

 

Paging API

 

- 대량 데이터를 한 번에 가져오는 것은 비효율적이다.

- Spring Data JPA에서는 Pageable과 Page 인터페이스로 페이징을 쉽게 구현할 수 있다.

1
2
3
4
5
6
7
8
9
// 시작 인덱스: 0부터 시작
int pageNumber = 0// 0번째 페이지
int pageSize = 5// 페이지당 5개
 
List<Member> members = em.createQuery(
    "SELECT m FROM Member m ORDER BY m.username", Member.class)
    .setFirstResult(pageNumber * pageSize) // 시작 위치
    .setMaxResults(pageSize) // 가져올 데이터 수
    .getResultList();
cs

 

 

JPA JOIN (내부조인, 외부조인, 세타조인)

 

1. 내부 조인(INNER JOIN)

 

- 두 테이블이 모두 조건이 일치할 때만 결과를 반환한다.

- JOIN ON 절로 같은 결과를 얻을 수 있다.

1
2
3
4
SELECT m
FROM Member m
JOIN m.team t ON t.name = 'teamA'
 
cs

 

1
2
3
SELECT m FROM Member m
(INNER)JOIN m.team t
WHERE t.name = :teamName
cs

 

2. 외부 조인(LEFT (OUTER) JOIN)

 

- 왼쪽 테이블은 모두 조회하고 오른쪽은 매칭되는 경우만 가져온다.

1
2
SELECT m FROM Member m
LEFT JOIN m.team t
cs

 

3. 세타 조인(Theta Join)

 

- 연관관계가 없어도 조인이 가능하다.

- CROSS JOIN 후 조건에 해당하는 값을 가져온다.

1
2
3
SELECT m FROM Member m, Team t
WHERE m.username = t.name
 
cs

 

- JOIN ON을 활용하여 세타 조인/ 연관관계 없는 조인을 만들 수 있다.

- 기존 세타 조인과 비슷하지만, JOIN에 명시적 조건 작성이 가능하다.

- 연관관계가 없어도 ON 절로 조건 지정이 가능하다.

1
2
3
4
SELECT m, t
FROM Member m
JOIN Team t ON m.username = t.name
 
cs
728x90
Comments