관심쟁이 영호

[#12] Spring Boot ㅣ 스프링 부트 ㅣ 주문 검색기능 기발, 동적 쿼리 본문

Bank-End/인프런- Spring 공부

[#12] Spring Boot ㅣ 스프링 부트 ㅣ 주문 검색기능 기발, 동적 쿼리

관심쟁이 영호 2021. 4. 17. 01:30
반응형

 

이 강의에서는

주문 검색기능을 추가하였다.

주문 검색기능을 제일 마지막에 한 이유는,

사용자의 입력에 따라, 동적인 쿼리를 생성해주어야 하기 때문에 알아야하는 부분이 있다고 하신다.

 

근데 동적쿼리를 생성하는게 상당히 까다롭다고 하신다.

그냥 생성하면, 되는거지만 유지보수를 하다보면 상당히 고충이 있다고 하신다.

 

총 3가지의 방법이 있는데

- JPQL을 생성할 때, OrderState 값을 살펴보고 판단하는 방법.

 

- Criteria 방법이 있다고 하신다. 이건 동적쿼리 생성을 도와주기 위해서 나온거라고 말씀 하셨는데, 상당히 코드를 구분하기가 힘들다. 만들 때는 어렵지 않지만 데이터가 JOIN되고, 조건붙고 하다보면

코드를 한번에 알아보기 힘들어서 유지보수가 힘들다고 하신다.

 

- 실무에서는 3번째 방법을 사용하시다고 하셨는데, 말씀하시는 부분이 많은지 일단은 Criteria를 사용하자고 하신다. 어차피 실무에서도 사용안한다면, 여기에는 자세히 배워두지않고 다음에 JPQL을 다루실 때, 유심히 들어보자.

 

쨋든 코드를 입력해준다.

동적 쿼리 생성에 대한 부분은 Criteria에 대한 부분을 모르기에, 정리를 하지 않겠다.

 

 

 public List<Order> findAllByCriteria(OrderSearch orderSearch) {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Order> cq = cb.createQuery(Order.class);
        Root<Order> o = cq.from(Order.class);
        Join<Order, Member> m = o.join("member", JoinType.INNER); //회원과 조인
        List<Predicate> criteria = new ArrayList<>();
        //주문 상태 검색
        if (orderSearch.getOrderStatus() != null) {
            Predicate status = cb.equal(o.get("status"),
                    orderSearch.getOrderStatus());
            criteria.add(status);
        }
        //회원 이름 검색
        if (StringUtils.hasText(orderSearch.getMemberName())) {
            Predicate name =
                    cb.like(m.<String>get("name"), "%" +
                            orderSearch.getMemberName() + "%");
            criteria.add(name);
        }
        cq.where(cb.and(criteria.toArray(new Predicate[criteria.size()])));
        TypedQuery<Order> query = em.createQuery(cq).setMaxResults(1000); //최대1000건
        return query.getResultList();


    }

 

테스트 코드도 생성해 보았고, 성공적이다!!

 

본 강의는 인프런의 김영한 개발자님이 강의하고 계신

"실전! 스프링 부트와 JPA활용1 - 웹 애플리케이션 개발"을 수강하면서 정리한 글입니다.

300x250
Comments