본문 바로가기
Spring Boot/JPA

[Spring][JPA] DTO로 조회 하기

by Lee David 2022. 10. 11.
반응형
프로젝트 구조

JPA DTO 사용하는 이유

JPA 사용시에 Table 구조가 변경된 경우나 변경을 하지 않고 두개 이상의 Table을 Join해야 하는 경우에 종종 사용합니다.

entity를 조회하여 코드상에서 데이터 조합을 하지 않고 JPA 쿼리를 이용하여 좀 더 빠른 성능을 낼수 있습니다.

// 테이블 예제1

@Getter
@Setter
@Entity
@Table(name = "shopping_basket")
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ShoppingBasketEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long basket_id;
    private String owner;
    private long total_price;
    private long count;
}
// 테이블 예제 2
@Getter
@Setter
@Entity
@Table(name = "shopping_client")
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long user_id;
    private String name;
    private String email;
    private int age;
}

두개의 테이블에 아무런 연관관계가 없는 상태에서 쿼리를 진행하려면 dto를 먼저 생성해 줍니다.

// DTO 생성
@Data
@AllArgsConstructor
public class TestDto {
    private String email;
    private long total_price;
    private int age;
}

JPA에서 사용하는 repository를 만들어 dto 형식의 쿼리를 작성해 줍니다.

@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {
    @Query(
            value = 
            "SELECT " +
            "    new com.example.jpatest.dto.TestDto(" +
                    "user.name, basket.total_price, user.age) " +
            "FROM " +
            "   UserEntity user " +
            "LEFT JOIN " +
            "   ShoppingBasketEntity basket " +
            "ON " +
            "   user.name = basket.owner " +
            "WHERE " +
            "   user.name = ?1 " +
            "AND " +
            "   basket.count > ?2 "
    )
    List<TestDto> getMarketHistory(String name, long count);
}

쿼리 상에 SELECT 이후에 오는 컬럼들을 DTO 생성자로 작성해야 합니다.

추가로 사용하는 DTO 상에 파라미터를 넘겨받는 생성자를 작성해야 쿼리상에서 오류 없이 진행이 가능합니다.

반응형

'Spring Boot > JPA' 카테고리의 다른 글

[Spring][JPA] Transactional Annotation  (0) 2022.09.15
[Spring][JPA] JPA란?  (0) 2022.09.14