⚡ 개요
비지니스 로직을 작업하면서 일부 컬럼만 조회해서 사용하는 경우가 존재한다. 이때 나는 보통 queryFactory를 통해서 일부 컬럼에 대한 조회를 하는것이 익숙해서 이렇게 조회를 했다. 그러다가 문득 JPA 의 repository를 통해서 단일 컬럼 또는 일부 컬럼을 조회를 하는 것이 가능할 텐데 어떻게 하는지 궁금해졌다.
queryFactory를 사용하든 repository를 사용하든 대용량 데이터를 조회하는 게 아닌 이상 속도적인 측면은 잠시 미뤄놓고 어떤 게 더 편하게 개발을 할 수 있는지가 궁금했고 방법을 찾아보게 되었다. :)
⚡ 일부 컬럼만 조회하는 방법
결론부터 이야기 하자면 일부분 컬럼만 가져오고 싶다면 Mapping Interface를 별도로 만들고 리턴을 받을 때 Entity 대신 Mapping 된 값으로 리턴을 받으면 받을 수가 있다. :)
개발 소스의 일부분을 기준으로 설명 하도록 하겠다.
Entity
@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "userInfo")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "UI_KEY")
private Long uiKey;
@Column(name = "UI_NAME")
private String uiName;
@Column(name = "UI_Phone")
private String uiPhone;
@Column(name="EMAIL")
private String email;
...
repository
public interface UserRepository extends JpaRepository<UserInfo, Long>, userInfoRepositoryCustom {
List<UserInfo> findById(Long uiKey);
}
기본적으로 repository에서 리턴값을 지정할 때 Entity를 리턴 받도록 지정을 하게 된다. 이렇게 되면 내가 필요한 값뿐만 아니라 사용하지 않는 데이터도 같이 가져와야 하기 때문에 데이터가 많다면 비지니스 로직을 처리하는 과정에서 원치 않는 자원 소모가 이뤄질 수도 있다.
repository ( Mapping Interface 추가)
interface UserMapping {
Long getUiKey();
Long getUiName();
}
public interface UserRepository extends JpaRepository<UserInfo, Long>, userInfoRepositoryCustom {
List<UserMapping> findByUiKey(Long uiKey);
}
Mapping Interface를 추가한 repository 이다.
인터페이스는 여러개를 추가해서 만들어서 사용해도 상관없으며, findById를 조회하게 되면 내가 맵핑한 객체에 대한 리스트를 반환하게 해 준다.
테스트를 해보면 알겠지만 어떤 값에 데이터가 바인딩되는지도 나온다.
궁금해서 테스트를 해본 거지만 나는 아직까지는 queryFactory를 이용해서 특정 Dto를 반환받는 게 더 편한 거 같다... 혹시라도 repository를 이용해서 특정 컬럼만 조회해야 하는 경우에는 사용하면 좋을 거 같다.
'Spring' 카테고리의 다른 글
[Spring] Spring boot 3.x.x 버전 마이그레이션 내용 정리 (0) | 2023.12.31 |
---|---|
[JPA] save() 와 saveAndFlush() 차이점 정리 (0) | 2023.10.29 |
[QueryDsl] new CaseBuilder() 내용 정리 (0) | 2023.10.07 |
[Spring] Spring boot 3.0 + JPA 관련 gradle 설정 정리 (0) | 2023.09.25 |
[Spring] Spring Event 기능 구현하기 ApplicationEventPublisher 이용하기 (0) | 2023.08.05 |