[ETC] Fetch 옵션
2023. 8. 28. 22:12ㆍDataBase/JPA
[ETC] Fetch 옵션
오래간만에 Querydsl을 통해 작업을 하면서 fetch 옵션들에 대해 정리가 필요한 것 같아서 학습 겸 작성하게 되었다.
- fetchOne()
- 단일결과, 하나의 레코드만 가져올 때 사용하는 메서드
- 결과가 하나인 경우 가장 직관적이고 간단한 방법
- 결괏값이 없거나 여러 개인 경우, 'NonUniqueResultException'이 발생할 수 있다.
- 단일결과, 하나의 레코드만 가져올 때 사용하는 메서드
- fetchFirst(()
- 첫 번째 결과를 가져올 때 사용하는 메서드
- limit(1)과 유사한 역할
- 여러 개의 결괏값이 나올 때 그중 첫 번째 결괏값만 출력
- 첫 번째 결과가 필요할 때 유용
- 결과가 없는 경우 null 반환, 반드시 결과가 있다는 확신이 있을 때 사용하는 것이 좋음
fetchResult()결과 목록과 전체 결과 수를 함께 반환쿼리 결과가 매우 많은 경우, 결과 목록과 결과 개수를 한 번에 가져오기에 성능 이슈가 발생할 수 있음
페이징을 할 때 사용하면 유용QueryResults 객체에 결과 목록과 전체 결과 수를 담아 반환
fetchCount()결과의 총 개수만 가져오는 메서드주로 페이징 처리 시 총결과의 수를 확인하기 위해 사용결과의 갯수만 가져오기에 빠르게 총결과의 수를 얻을 수 있음페이징 처리에 필요한 값이 있을 때 사용
결과 목록 자체를 가져오는 것이 아니기에 실제 데이터를 다루는 작업에서는 사용 x
- fetch()
- 결과 목록을 가져올 때 사용
- 여러 개의 결과를 가져오며, 페이징 처리에도 사용
- 결과가 많이 존재할 경우 메모리 문제가 발생할 수 있음
- 페이징 처리를 위해 적절히 사용
- fetchAll()
- 모든 데이터를 조회하는 메서드
- DB에 저장된 모든 레코드를 검색하고 가져올 때 사용
- 엔티티 클래스에 매핑된 DB 테이블의 모든 레코드를 조회할 수 있음
- 데이터 베이스의 크기가 크거나 성능에 영향을 미칠 수 있음
- 필요한 데이터만 조회, 처리하는 것이 효율적
- fetchJoin()
- JPA에서 엔티티 간의 관계를 로딩할 때 사용하는 메서드
- Eager Fetching(즉시 로딩) 방식으로 가져옴
- 데이터 로딩의 두 가지 방식
- Lazy Loading - 지연 로딩
- 연관된 엔티티의 데이터를 실제로 사용할 때 해당 데이터를 로딩하는 방식
- 필요한 시점에 DB query가 실행되어 데이터 가져옴
- 불필요한 쿼리의 발생 x
- 클라이언트가 실제 데이터를 요청할 때마다 쿼리가 추가로 실행되면서 N+1 문제 발생할 수 있음
- Eager Fetching - 즉시 로딩
- 연관이 된 엔티티의 데이터를 해당 엔티티를 가져올 때 함께 로딩하는 방식
- 한 번의 쿼리로 모든 데이터를 가져오므로 N+1 쿼리 문제는 발생 x
- 데이터의 양이 많거나 복잡한 연관관계의 경우 성능저하 발생 가능성 존재
- Lazy Loading - 지연 로딩
- 데이터 로딩의 두 가지 방식
fetchResults(Function <EntityPath, EntityProjection>)특정 필드만 가져올 때 사용하는 메서드특정 필드만 가지고오기에 성능 향상에 도움이 될 수 있음
EntityProjection을 사용하여 원하는 필드만 선택적으로 가져옴특정 필드만 가져오는 경우이기에 전체 엔티티가 필요한 경우에는 부적합할 수 있음
List<String> names = queryFactory
.select(QPerson.person.name)
.from(QPerson.person)
.fetchResults(QPerson.person.name);
'DataBase > JPA' 카테고리의 다른 글
[JPA]@Transactional이란 (0) | 2024.09.24 |
---|---|
[JPA] 엔티티 매핑 (0) | 2022.12.21 |
[JPA] 영속성 관리 (0) | 2022.12.19 |