ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 접근 기술 - Querydsl
    스프링/스프링 기초DB 2023. 3. 28. 14:04

    스프링 데이터 JPA로 db를 작성했더니 훨씬 편해진 것을 확인할 수 있다. 하지만 동적 쿼리는 아직도 복잡하고 어렵기 때문에 이런 것들을 간편하게 해주는 Querydsl라는 기능이 있다.

     

    @Repository
    @Transactional
    public class JpaItemRepositoryV3 implements ItemRepository {
    
        private final EntityManager em;
        private final JPAQueryFactory query;
    
        public JpaItemRepositoryV3(EntityManager em) {
            this.em = em;
            this.query = new JPAQueryFactory(em);
        }

    Querydsl이라는 기능을 사용하기 위해서는 EntityManager와 JPAQueryFactory를 가져와서 사용한다.

    save, update, findById는 Querydsl을 사용하지 않고 JPA로만 작성했을 때와 동일하다.

     

    @Override
    public List<Item> findAll(ItemSearchCond cond) {
    
        String itemName = cond.getItemName();
        Integer maxPrice = cond.getMaxPrice();
    
        List<Item> result = query
                .select(item)
                .from(item)
                .where(likeItemName(itemName), maxPrice(maxPrice))
                // where에 여러개 들어가면 and 조건으로 처리
                .fetch();
    
        return result;
    }
    
    private BooleanExpression likeItemName(String itemName) {
        if (StringUtils.hasText(itemName)) {
            return item.itemName.like("%" + itemName + "%");
        } // Qitem.item을 static import 해서 item으로 사용 중
        return null; // if문 만족 안하면 무시됨
    }
    
    private BooleanExpression maxPrice(Integer maxPrice) {
        if (maxPrice != null) {
           return item.price.loe(maxPrice);
        } // loe는 작거나 같다라는 뜻
        return null;
    }

    findAll 기능에서 동적 쿼리를 작성하는 것이 Querydsl의 장점이다. query에 select, from, where, fetch를 넣어 줄 수 있ㄴ느데, likeItemName과 maxPrice라는 메서드를 만들어서 where에 넣어줬다. likeItemName은 itemName을 받아서 itemName을 가지고 있으면 해당 값들만 리턴하고 아니면 로직을 만족 안하고 무시되는 것이다. maxPrice는 입력한 값보다 작거나 같은 아이템들을 보여주는 메서드이다.

    where에 likeItemName과 maxPrice를 넣어주면 and 로직으로 처리되어서 상품명과 가격이 있거나 없을 때의 4가지 경우를 다 검색할 수 있게 만들어준다.

     

     

    Querydsl을 이용하면 이전에 복잡했던 동적 쿼리를 훨씬 효율적으로 작성할 수 있다.

    특히 조건이 많아지면 Querydsl의 중요성은 더 커질 것이다.

Designed by Tistory.