Back-end/Spring

[Spring] JPA Query 메서드 DTO 바로 생성하기

shoney9254 2024. 4. 7. 15:49
반응형

Spring Data JPA를 사용하여 데이터베이스에서 정보를 가져올 때 DTO(DTO: Data Transfer Object)를 사용하는 경우가 많습니다. DTO는 보통 데이터베이스의 엔티티(Entity)와 클라이언트 간의 데이터 전송을 위해 사용됩니다. 이 글에서는 Spring Data JPA에서 Query 메서드를 사용하여 DTO를 바로 생성하는 방법을 알아보겠습니다.

1. DTO 클래스 생성

DTO 클래스는 데이터 전송을 위한 객체입니다. 먼저 DTO 클래스를 생성해야 합니다. 예를 들어, 장바구니에 담긴 상품 정보를 전달하기 위한 CartItemListDto 클래스를 만들어봅시다.

package com.example.demo_mall.mallapi.dto;

public class CartItemListDto {
    private Long cino;
    private int qty;
    private String pname;
    private double price;
    private String fileName;

    // 생성자, 게터 및 세터 생략
}

2. Repository 인터페이스 작성

이제 DTO를 사용하여 데이터를 가져올 Repository 인터페이스를 작성합니다. 여기서는 CartItemRepository를 예로 들어 설명하겠습니다.

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface CartItemRepository extends JpaRepository<CartItem, Long> {

    @Query("select " +
            "new com.example.demo_mall.mallapi.dto.CartItemListDto(ci.cino, ci.qty, p.pname, p.price, pi.fileName) " +
            "from CartItem ci " +
            "inner join Cart mc on ci.cart = mc  " +
            "left join Product p on ci.product = p " +
            "left join p.imageList pi " +
            "where mc.owner.id = :id " +
            "and pi.ord = 0 " +
            "order by ci.cino desc")
    List<CartItemListDto> getItemsOfCartDtoById(@Param("memberId") Long id);
}

위의 코드에서 @Query 어노테이션을 사용하여 직접 SQL 쿼리를 정의하고 있습니다. 그러나 여기서 특이한 점은 SQL 쿼리의 결과를 바로 CartItemListDto 객체로 매핑하고 있다는 것입니다.

3. Query 메서드 사용하기

Spring Data JPA에서는 Query 메서드를 사용하여 간단한 쿼리를 작성할 수 있습니다. 그러나 Query 메서드를 사용하여 DTO를 바로 생성하는 것은 조금 더 복잡합니다. 따라서 위와 같이 @Query 어노테이션을 사용하여 직접 SQL 쿼리를 작성하는 것이 필요합니다.

위의 예제에서는 getItemsOfCartDtoById 메서드를 통해 CartItemListDto 객체를 바로 생성하고 있습니다.

결론

이렇게 Spring Data JPA를 사용하여 Query 메서드를 통해 DTO를 바로 생성하는 방법을 알아보았습니다. DTO를 사용하여 데이터베이스에서 필요한 정보를 효율적으로 전달할 수 있습니다. 이를 통해 코드의 가독성과 유지 보수성을 향상시킬 수 있습니다.

반응형