[Springboot] JPA interface projection

sue·2023년 7월 1일
1

Spring

목록 보기
2/2

해당 글을 정리해서 올리는 이유는 회사에서 interface를 사용해 특정 데이터만 가지고 오고 있는데 alias를 사용하지 않으면 null로 데이터가 넘어왔다. 왜 그러는지 궁금해서 찾아보다가 projection 개념을 알게 되어서 정리한다.

Jpa에서 entity 전체 말고 일부분만 select 해서 가지고 오고 싶을 때 projection을 사용해서 가지고 온다.
projection에서 interface 기반과 class 기반이 있다.
회사에서는 interface projection을 사용하고 있으므로 interface projection에 대해서만 정리하겠다.

1. alias를 사용하는 이유

별칭을 사용하지 않았을 때 데이터가 null로 넘어오는 경우가 있다 . 그 이유는 보통 alias(별칭)을 붙이지 않아 생기는 일이다.
별칭을 사용하는 이유는 별칭을 통해 interface 속성과 맵핑을 할 수 있기 때문이다. 별칭은 interface에 명시한 속성과 일치해야한다.

@Query(value = "SELECT u.id AS userId, u.name AS userName FROM users u", nativeQuery = true)
List<UserProjection> getUsers();

interface UserProjection {
    Long getUserId();    // Matches the alias "userId"
    String getUserName(); // Matches the alias "userName"
}

2. interface 메소드에 get을 붙이는 이유

이건 단순히 왜 사용하는지 궁금해서 찾아봤는데 getter 메소드이기 때문이고 (생각해보면 당연한 소리..) getter 메서드를 사용하여 쿼리 결과를 해당 속성에 자동으로 매핑할 수 있다고 한다.

3. 이외의 projection 사용 방법

나는 회사에서 여러 테이블을 조인해서 원하는 데이터들만 명시해서 가지고 올 목적으로 interface를 사용했지만 보통 entity에 있는 속성들 중에서 몇 가지의 데이터를 골라서 가지고 오기 위해서 projection을 사용한다고 한다. 전체 list를 불러올때 원하는 데이터만 부르는 건 안 되는 것 같고 id로 찾아서 list를 가지고 올 때나 몇 가지 데이터만 가지고 오기 위해 사용한다. 사용 방법은 아래 다른 블로그를 참고하길 바란다.

참고
https://devhan.tistory.com/216

profile
All is well ! 🔥

1개의 댓글

comment-user-thumbnail
2023년 11월 16일

자바 버전에 따라서 record를 사용하는 짧은 방법도 있어요!
글 뒷부분에 record 사용이 있어서 공유해 드립니다!

https://letsdev.hashnode.dev/jpa-projection-kor

답글 달기