[ETC] Fetch 옵션

2023. 8. 28. 22:12DataBase/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
            • 데이터의 양이 많거나 복잡한 연관관계의 경우 성능저하 발생 가능성 존재

  • 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