JustDoEat

[실험] Projection은 DTO 보다 빠를까 ? 본문

카테고리 없음

[실험] Projection은 DTO 보다 빠를까 ?

kingmusung 2024. 11. 8. 01:06

개요

https://kingmusung.tistory.com/71

 

Data JPA, DTO, Projection 방식중 적합 한 방식을 찾아보았다.

개요.JPA를 이용해서 쿼리의 결과를 가지고 오는 도중 궁금증이 생겼다. 쿼리의 결과로, 엔티티 객체 자체를 가지고 와서 서비스 로직에서 DTO로 맵핑하는 방법만 머리에 있었다. 그리고 복잡한

kingmusung.tistory.com

 

Projection과 DTO 방식 중 적합한 방식을 찾던 중, 계속 궁금증이 생겼다.

 

간단한 쿼리에서 Projection이 가독성도 좋고 작성하기도 편한데, 과연 속도도 빠를까?

 


 

 

여기서 id, mainImage, title, price만 가지고 오려고 한다.

 

 

DTO

@Getter
@Builder
public class ProductResponseDto {
    private Long id;
    private String mainImage;
    private String title;
    private int price;
}

 

Projection 

public interface ProductResponseProjection {
   Long getId();
   String getMainImage();
   String getTitle();
   String getPrice();
}

 


🧪 실험조건

 

1. 상품데이터 25만 개를 넣은 후 똑같은 쿼리로 검색을 함.

 

2. 상품데이터 5만개를 넣은 후 똑같은 쿼리고 검색을 함.

 

3. 동일한 쿼리에서 서비스 로직의 실행시간을 측정.

 

4. Mac, 활성 상태 보기에서 CPU 사용량 측정.(동일한 쿼리문을 반복적으로 날려 CPU사용량이 특정 구간에 수렴하는 수치 측정.)

 

데이터는 CommandLineRunner로 넣어주었음.

 

DTO로 먼저 조회 => Projection으로 조회 순으로 하겠음.

 

보통 Projection방식이 조인이  이루어지지 않는 루트쿼리에 대해 실행했을 때 비교적 효율적이라고 들었었다.

 

그래서 조인이 없는 단순한 테이블에 대해서 실험을 하였음.


Case1. 데이터 25만개.

 

 

DTO (170~ 196 ms, CPU 38%)

 

 

 

Projection (684 ~ 713 ms, CPU 45% )

 

 

 


정리

확실히 실행속도에서 DTO를 쓰면 빠르다는 게 느껴진다, 컴 사양이 안 좋은 편이 아님에도 불구하고 Projection방식으로 쿼리를 날리면 버벅거린다, DTO는 스무스함.

 


Case 2. 데이터 5만 개.

 

DTO(2x ~ 33 ms, CPU 24%)

 

Projection(6x ~ 74 ms, CPU 31%)

 


정리.

데이터를 5만 개로 확 줄여서 테스트를 했을 때 또한 DTO가 빠르긴 하다, 이보다 데이터가 훨씬~ 작아진다면 사용자가 느끼는 채감이 엄청 크지는 않을 거 같지만, 데이터가 많이 지면 많이 질수록 차이가 많이 커질 거 같다.

 


왜 상대적으로 느릴까?

 

간단하다는 건 그만큼 내부적으로 열심히 무언가가 일어나기 때문에 간단한 거 같다고 생각을 한다.

 

projection 방식은 동적프록시를 생성해 필요한 값만 담는 방식으로 동작을 한다고 했다.

 

 

. getClass로 확인을 해보니 jdk.proxy4라는 Java Reflection API동적 프록시에 관련된 클래스가 위치한 패키지가 보인다.

 

 

동적프록시가 무수하게 많이 생성이 되니 컴퓨터가 살려달라고 하는 게 이해가 된다.