이것도 오더 서비스의 기능이긴 한데,
동적 쿼리가 필요한 부분이라 다른 것들 먼저 개발했다.
조회를 할 때 서비스에서,
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 |