스프링데이터 + JPA/웹 애플리케이션 개발

19. 주문 검색 기능 개발

sdafdq 2023. 11. 9. 07:47

이것도 오더 서비스의 기능이긴 한데,

동적 쿼리가 필요한 부분이라 다른 것들 먼저 개발했다.

 

조회를 할 때 서비스에서,

public List<Order> findOrders(OrderSearch orderSearch){
    return orderRepository.findAll(orderSearch);
}

저렇게 특정 조건을 넣어 검색하면, 그 조건에 맞는 쿼리만 가져올 것이다.

그래서 조회해올 때 동적쿼리가 필요하다.

 

조건은 어떤회원이 주문했는지, 또 어떤 주문상태인지 조건에 맞는 것만 조회할 수 있도록 그렇게 쿼리를 짜게끔 할 것이다.

 

public List<Order> findAll(OrderSearch orderSearch){
    em.createQuery("select o from Order o join o.member m", Order.class)
}

OrderRepository인데, 우선 이게 기본이다.

 

만약 orderSearch에 조건을 다 넣은 경우,

em.createQuery("select o from Order o join o.member m" +
        " where o.status = :status" +
        " and m.name like :name", Order.class)

이렇게 해서 파라미터만 바인딩 해주면 된다.

 

근데 저렇지 않은 경우가 있다.

아예 조건이 없는 경우도 있고, 특정 조건만 있는 경우도 있다.

그걸 다 조회해서 애플리케이션에서 구분하는 건 조금.. 너무 비효율 적이다.

 

그냥 딱 조건에 맞는 쿼리를 생성해서 한번에 받아오는 게 좋다.

 

우선 첫번째로 생각하는 것은 조건에 따라 저 jpql문을 문자열로 따로 만들어서, 거기서 문자열에 더덕더덕 붙이는 것이다.

솔직히 나는 할 수 있을 것 같다.

근데 실무에서는 안쓴다고 한다.

 

그 다음에 또 다른 방법이 JPA에서 제공해 주는 Criteria

이건 보면 queryDSL이랑 비슷한데, 이것도 실무에서 안쓴다. 

딱 눈에 보면 어떤 JPQL이 만들어 질 지 보이지 않아, 유지보수가 힘들다. (근데 이걸 표준으로 내놨다고 한다.)

 

 

그 다음, QueryDSL

 

아쉽지만 다음번에 한다고 한다.

이거는 딱 봐도 어떤 쿼리가 만들어 질지 눈에 선하다.

select o from Order o join o.member m where status = :orderStatus and name = '%,:name,%' limit 1000

대충 이런 식 일거다.

 

정적 쿼리도 좀 복잡해지면 QueryDSL로 짜라고 한다.

 

 

'스프링데이터 + JPA > 웹 애플리케이션 개발' 카테고리의 다른 글

21. 회원 등록  (0) 2023.11.09
20. 웹 계층 개발  (0) 2023.11.09
18. 주문 기능 테스트  (0) 2023.11.08
17. 주문 리포지토리, 서비스  (0) 2023.11.07
16. 주문 도메인 개발  (0) 2023.11.07