본문 바로가기

CS 잡지식

특정 API 스펙에 맞는 JPQL문을 작성해야 할때!!

https://jbluke.tistory.com/419

 

 

DB 최적화 기법 - Projection 대상을 필요한 것만으로 한정(Feat.DTO)

@GetMapping("/api/v3/simple-orders") public List orderV3() { //fetch join을 사용하여 Order 조회! List findOrders = orderRepository.findAllWithMemberDelivery(); // 미리 정해진 API 결과 스펙을 반환하기 위하여, DTO에 정해진 스펙

jbluke.tistory.com

(위 사이트의 맥락에 이어서 설명을 하겠다)

보통,  JPQL은 Repository 계층에서 작성이 된다. 

근데, Repository는 거의 절대적으로 [조회]를 할 때 [객체]를 조회하여서, 그와 연관된 객체 탐색이 가능하도록 하여야 

한다. 

(그래야지 특정 API가 아닌, 여러 API들이 자신들의 스펙에 맞는 객체들을 탐색이 가능)

그런데 만약 Repository에서 특정 API에 필요한 [필드값]들을 NEW DTO(여기서 필요한 필드값명을 적어서, 조회해옴)

을 이용한 JPQL 쿼리문을 작성을 한다면 어떻게 될까??

그 JPQL 쿼리문은 특정 API를 이용 시에만 사용이 되고, 다른 스펙을 원하는 API들은 그 JPQL 쿼리문의 결과를 [재사용]할

수가 없으니, 일일이 Repository에서 다시 그 API 스펙에 맞는 JPQL문을 다시 작성을 해 버려야 한다. 

즉, Repository의 [재사용]성이 매우 떨이지는 결과가 되버린다. 

해당 Repository가 만약 Order객체에 대한 OrderRepository라면 JPQL을 작성을 할 때, 

Fetch Join 등을 이용한 최적화된 기법으로 Order [객체]와 그 연관 관계에 있는 [객체]를 DB로부터 조회를 해 와야 한다. 

 

그러나 어쩔 수 없이 특정 API에 특화된 JPQL을 작성해야 할 일이 있다.(그 case는 위 사이트를 참조)

그럴 때는 특정 API에 대한 JPQL 쿼리문을 위한 패키지를 따로 만들어서, orderRepository와 분리시켜 버리는 것이다. 

즉, 특정 API 스펙을 위한 별도의 Repository를 만드는 것이다.