Post

[Spring Data JPA] 갑과 DTO 가져오기

📌 들어가며

이번 글에서는 @Query특정 값(단일 필드)DTO를 조회하는 방법을 정리한다. 엔티티 전체가 아니라 필요한 데이터만 뽑아올 때 유용하다.


1. 값 가져오기 (단일 필드)

엔티티가 아니라 특정 컬럼 값만 List로 조회한다.

1
2
@Query("select m.username from Member m")
List<String> findUsernameList();
1
2
3
List<String> result = memberRepository.findUsernameList();
// AAA
// BBB

2. DTO 가져오기

여러 엔티티에서 필요한 값만 골라 DTO로 받는다. 먼저 DTO를 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
@Data
public class MemberDto {
    private Long id;
    private String username;
    private String teamname;

    public MemberDto(Long id, String username, String teamname) {
        this.id = id;
        this.username = username;
        this.teamname = teamname;
    }
}

JPQL의 new로 DTO 경로를 지정해 조회한다.

1
2
3
@Query("select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) " +
       "from Member m join m.team t")
List<MemberDto> findMemberDto();

💡 JPQL에서는 new 전체경로.Dto클래스(...)로 DTO를 만든다. 이때 파라미터에 맞는 생성자가 DTO에 미리 선언되어 있어야 한다.

1
2
List<MemberDto> result = memberRepository.findMemberDto();
// MemberDto(id=1, username=AAA, teamname=teamA)
조회 대상방법
단일 값select m.usernameList<String>
DTOselect new 경로.Dto(...)List<Dto>

📝 정리

1
2
3
값 & DTO 조회
├─ 값     @Query("select m.필드") → List<타입>
└─ DTO    @Query("select new 경로.Dto(...)") + 생성자 필요
개념한 줄 정의
단일 값 조회특정 컬럼만 뽑기
DTO 조회new 문법으로 필요한 값만 조립

엔티티 전체가 아니라 필요한 데이터만 조회하면 성능과 관심사 분리에 유리하다. DTO 조회 시에는 JPQL의 newDTO 생성자가 짝을 이뤄야 한다는 점을 기억하자.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.