본문 바로가기

Java, Spring/스프링부트와 JPA 활용 2

3-4. 간단주문조회V4 : JPA에서 DTO로 바로 조회(매우매우매우매우매우매우매우매우매우매우매우 중요)

이번에 할 것 : 원래 V3에서는 엔티티조회 -> DTO로 변환 하였는데 이제 JPA에서 바로 DTO를 끄집어내자!

 

DTO는 엔티티 의존 가능.

지금 편의상 static클래스로 controller 내부에 dto를 만들어 놔서 repository가 controller를 의존하는 희안한 일이 발생... -> dto 따로 빼줌

 

의존관계는 안으로 들어가야함. (controller -> repository ) 

의존관계는 한방향으로만 가야함.

 

 

 

보면 DTO로 반환받는 로직이다.

 

select o 라 했는데 Order은 resultClass인 OrderSimpleQueryDto 에 매핑 될 수가 없다.

-> JPA는 엔티티, 임베더블(값 타입) 만 반환 할 수 있다.

-> 나머지 DTO 같은 애들은 반환을 못한다.

-> 파라미터 하나하나 넣어줘야함.

 

여기서 Order order 가 아니라 파라미터 하나하나 넣어줘야한다. 엔티티 넘기기 안됨. 엔티티넘기는 식별자로 넘어가기 때문.

그래서 V2, V3의 .map 부분도 바꿔주었다. 원래는 .map(OrderSimpleQueryDto::new)

 

 

OrderRepository.java

이렇게 new를 꼭 해주어야한다.(파라미터는 다 받아야함.)

 

 

 

 

# 결론

이 부분은 V3(페치조인) 때와 같으나 (조인 성능은 같다.)

SELECT 부분에서 DTO에 필요한 부분만 SELECT한 점이 다르다. (이건 페치조인보단 약한 성능개선이긴 함.)

V3 : SELECT 양이 적다.
V4 : SELECT 양이 적다. (DTO파라미터 지정한 것만 가져옴.)

SELECT 양이 많다.= DB접근이 많다. = 네트워크를 더 많이 쓴다.

 

V3 : Order 전체를 SELECT -> join fetch로 필요한 것만 고름

V4 : 아예 DTO에 맞는 것만 SELECT 함

 

위에껀 V3인데 재사용성이 뛰어남

하지만 밑 V4는 해당 DTO를 쓸때만 쓸 수 있음 + jpql 직접 쳐야된다는 단점. but 성능 조금 더 좋다는 장점.

 

 

 

 

 

그럼 V4가 더 좋나?

-> 둘 사이 우열을 가리기 힘들다. 

 

 

# V4 특징

############################################매우 중요#########################################

 

 

리파지토리의 쓰임목적 : 엔티티에 대한 객체 그래프 조회 but API 스펙이 맞춰 리파지토리로직이 짜여짐. -> API가 리포지토리에 들어옴(물리적으로는 계층이 나눠져 있지만 논리적으로 리포지토리가 화면을 의존함.) = API스펙이 바뀌면 리포지토리의 로직을 뜯어고쳐야함.

 

영한님 개인적으로 이정도 간단한 jpql은 리포지토리에 넣어도됨. 그래도 엔티티 순수성 유지.

 

############################################매우 중요#########################################

 

 

# V3 V4 비교.

 

V4 성능이 미세하게 더 좋음 (API의 DB 조회 성능은 대부분 FROM 절 이후 조인에서 좌우된다. SELECT로 몇개 더 가져왔다고 성능에 그렇게 큰 차이가 없다. - but SELECT 해올게 30~40개 정도 되거나 그럴때는 다시 고려.)

 

 

 

 

 

# API스펙에 의존적인 OrderRepository 해결법

JPA에서 DTO 바로 뽑는 로직이 API에 의존적이어서 OrderRepository는 순수한 엔티티용도로 유지하고자 따로 빼놈

-> 유지보수 Good (화면에 종속된 코드가 리포지토리에 있으면 너무 별로) 이런 생각 하는 게 중요

 

 

 

 

 

 

순서 지켜서 하자!!!!! 대부분 페치 조인에서 95%이상이 해결됨.

4번은 잘 안함

 

 

 

지금까지는 다 XToOne 만 보았다.

 

다음시간부터는 XToMany 해보자( 컬렉션 조회 )

Recent Posts
Popular Posts
Recent Comments