Projection

more·2023년 7월 28일
0

JPA 심화 3일차

목록 보기
3/3
  • 별 쿼리
    • JPARepository 로 find() 또는 findAll() 메소드를 사용할때 Entity 단위로 조회하는 것
      • 예시 : SELECT * FROM USER;
    • 필드가 많아질 수록 느려짐
    • 따라서 projection 사용 -> 일부 필드만 조회해서 성능을 최적화

Projection의 기능

  1. 원하는 필드만 지정해서 조회 가능
    -> User Entity에 username, password 이렇게 있으면 username만 따로 지정해서 가져올 수 있다는 말
  2. 여러 필드 합쳐서 재정의 필드(Alias) 조회 가능 (Nested 프로젝션)
  3. 조회 필드 그룹을 인터페이스 또는 클래스로 만들어놓고 재사용 가능

Projection 필드 사용 방법

1. get필드() 메소드로 정의

  • 정의한 필드만 조회하기 때문에 Closed 프로젝션 이라고 한다.
  • 쿼리를 줄이므로 최적화 할 수 있다.
  • 메소드 형태이기 때문에 Java 8의 메소드를 사용해서 연산을 할 수 있다.
public interface UserProfile {
  String getUsername();

  String getProfileImageUrl();
}

// select username, profileImageUrl from user; // closed projection

2. @Value 로 정의

  • 전체 필드를 조회할 수 밖에 없어서 Open 프로젝션 이라고 한다.
  • @Value(SpEL)을 사용해서 연산을 할 수 있다.
    -> SpEL : Value에 들어가는 표현식
    -> Entity의 모든 속성을 사용할 수 있기 때문에 쿼리 실행 최적화를 적용할 수 없다
    -> 샘플

Projection 구현체 정의방법

1. 인터페이스 기반 Projection

  • 예시

    public interface UserProfile {
    
      String getUsername();
    
      String getProfileImageUrl();
    
      @Value("#{target.profileImageUrl != null}")
      boolean hasProfileImage();
    
      default String getUserInfo() {
        return getUsername() + " " + (hasProfileImage() ? getProfileImageUrl() : "");
      }
    }

2. 클래스 기반 Projection (DTO 처럼 사용)

  • 예시

    @Getter
    @AllArgsConstructor
    public class UserInfo {
    
      private String username;
    
      private String password;
    
      public String getUserInfo() {
        return username + " " + password;
      }
    }

3. 다이나믹 Projection (Projection 클래스를 동적으로 지정해서 사용)

  • 예시

    // UserRepository.java
    
    <T> List<T> findByProfileImageUrlStartingWith(String profileImageUrlStartWith, Class<T> type);
profile
조금 더

0개의 댓글