인터페이스 기반 프로젝션

짱센호랑이·2023년 12월 13일

인터페이스 기반 프로젝션을 사용하는 경우

  1. 성능 항상
  2. No converter found capable of converting from type 에러

나는 프로젝트를 진행하면서 Native Query를 작성했는데

 /**
     * 내 옷장 카테고리 별 가격
     *
     * @param memberId - 사용자 UUID
     * @return List<IClothesAnalysisCost> - 옷 가격 분석 정보
     */
    @Query(value = "SELECT SUBSTRING(c.middle_category_id, 1, 3) as largeCategoryId, SUM(c.price) as price, COUNT(*) as amount " +
            "FROM clothes c " +
            "WHERE c.member_id = ?1 " +
            "GROUP BY SUBSTRING(c.middle_category_id, 1, 3) " +
            "ORDER BY SUBSTRING(c.middle_category_id, 1, 3)", nativeQuery = true)
    List<IClothesAnalysisCost> findCostOfMyClothesByCategory(UUID memberId);

2번과 같은 에러가 떴다.

이와 같은경우 Alias를 써서 컬럼 명을 맞춰줘야한다.

하지만 나는 맞춰 줬음에도 불구하고 에러가 그대로 떴다.

그래서 인터페이스 기반 프로젝션을 사용했다.

아래와 같이 Clothes Entity 처럼 요소가 엄청 많은 경우가 있다.

public class Clothes {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id; // 옷 id

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member; // 사용자 정보

    @OneToOne
    @JoinColumn(name = "middle_category_id")
    private MiddleCategory middleCategory; // 중분류 카테고리 정보

    @NotNull
    @Column(length = 50)
    private String name; // 옷 이름

    @NotNull
    @Column(length = 4)
    private String season; // 계절

    @NotNull
    @Column(length = 20)
    private String color; // 색상

    @NotNull
    private Integer thickness; // 두께

    private Integer price; // 가격

    @Column(length = 30)
    private String shop; // 구매처

 .....
 

이 중 원하는 요소만 골라서 성능을 향상시킬 수 있게 해준다.

아무튼!

Query문을 작성한대로

public interface IClothesAnalysisCost {

   String getLargeCategoryId(); // 대분류 카테고리 id

   Integer getPrice(); // 가격

   Integer getAmount(); // 개수
}

프로젝션을 작성해주고

Service단에서

List<IClothesAnalysisCost> itemList = clothesRepository.findCostOfMyClothesByCategory(memberId);

아래처럼 받아와 줬더니 문제 해결!

profile
뭐라도 해야지

0개의 댓글