본문 바로가기
JPA

@Query 값, DTO로 반환받기

by 혀눅짱 2023. 10. 11.

@Query 어노테이션을 이용해서 엔티티 뿐만아니라 단일값과 DTO형태로도 리턴받을 수 있다.

다음예제를 보자 먼저

 

단일값으로 리턴받는 경우이다.

 

@Query("select m.name from Member m where m.id= :id")
String findByIdValue(@Param("id")Long id);

 

먼저 JPARepository를 상속받는 인터페이스에 구현한다.

사용할 컬럼을 셀렉트에서 명시하면되서 단순하다.

 

@GetMapping("queryMethodValueTest")
public String queryMethodValueTest(Long id){
    return memberDataJpaRepository.findByIdValue(id);
}

해당 메소드를 호출하는 컨트롤러에서 호출하면 된다.

 

다음은 DTO로 리턴받는예제이다.

@Query("select new com.example.jpabook.dto.MemberDto(m.id,m.email,m.name) from Member m where m.name= :name")
MemberDto findByNameDto(@Param("name") String username);

추출할 필드들을 DTO생성자 파라미터로 사용한다. 여기서 new연산자를 사용하는데 해당 DTO의 풀패키지경로를 적어야한다. 이게 좀 가독성이 안좋은것 같다....

 

해당메소드도 컨트롤러에서 호출하면 결과가 DTO로 반환되어 정상적으로 나온다.

@GetMapping("queryMethodDtoTest")
public MemberDto queryMethodDtoTest(String name){
    return memberDataJpaRepository.findByNameDto(name);
}
{
"id": 1,
"email": null,
"pw": null,
"name": "userA"
}

 

DTO로 반환받는 방법은 자주 사용할 거 같긴하다. 일단 API서버에서는 엔티티타입으로 리턴하는 것을 지양해야한다.(스키마 노출 및 api 스펙의 변화방지) 그렇기 때문에 DTO로 리턴하게된다. 물론 엔티티타입을 dto타입으로 바꿀떄 modelmapper같은 라이브러리도 있지만 바로 DTO로 반환받고 리턴하는것도 효율적인 것 같다.

'JPA' 카테고리의 다른 글

Data JPA 반환타입  (0) 2023.10.11
Data JPA collection 파라미터 바인딩  (0) 2023.10.11
Data JPA 쿼리메소드  (0) 2023.10.10
변경감지  (0) 2023.10.06
Join vs Fetch Join  (1) 2023.10.04