본문 바로가기
Spring/DB 2편

데이터 접근 기술 - Querydsl

by JHyun0302 2023. 8. 11.
728x90

https://www.inflearn.com/chats/700670/querydsl-springboot-3-0%EC%9D%98-gradle-%EC%84%A4%EC%A0%95%EC%9D%84-%EA%B3%B5%EC%9C%A0%ED%95%A9%EB%8B%88%EB%8B%A4

 

 

QueryDsl SpringBoot 3.0의 gradle 설정을 공유합니다. - 인프런 | 고민있어요

최근 스프링부트 3.0이 나옴에 따라 QueryDSL 설정 내용을 공유합니다.아래 설정 내용중 Querydsl 추가 라고 나온 부분만 추가하시면 됩니다.스프링 부트: 3.0.0, 자바: 17 기준입니다!plugins { id 'java' id 'o

www.inflearn.com

 

 

 

 

 

 


적용

 

JpaItemRepository

@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);
    }
    
    @Override
    public Item save(Item item) {
        em.persist(item);
        return item;
    }
    
    @Override
    public void update(Long itemId, ItemUpdateDto updateParam) {
        Item findItem = findById(itemId).orElseThrow();
        findItem.setItemName(updateParam.getItemName());
        findItem.setPrice(updateParam.getPrice());
        findItem.setQuantity(updateParam.getQuantity());
    }
    
    @Override
    public Optional<Item> findById(Long id) {
        Item item = em.find(Item.class, id);
        return Optional.ofNullable(item);
    }
    
    public List<Item> findAllOld(ItemSearchCond itemSearch) {
        String itemName = itemSearch.getItemName();
        Integer maxPrice = itemSearch.getMaxPrice();
        QItem item = QItem.item;
        BooleanBuilder builder = new BooleanBuilder();
        if (StringUtils.hasText(itemName)) {
			builder.and(item.itemName.like("%" + itemName + "%"));
    	}
        if (maxPrice != null) {
        	builder.and(item.price.loe(maxPrice));
        }
        
        List<Item> result = query
            .select(item)
            .from(item)
            .where(builder)
            .fetch();
        return result;
    }

    @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))
              .fetch();
      return result;
    }
    
    private BooleanExpression likeItemName(String itemName) {
      if (StringUtils.hasText(itemName)) {
          return item.itemName.like("%" + itemName + "%");
      }
      return null;
    }
    
    private BooleanExpression maxPrice(Integer maxPrice) {
      if (maxPrice != null) {
          return item.price.loe(maxPrice);
      }
      return null;
    }
}

 

  • Querydsl을 사용하려면 JPAQueryFactory 가 필요하다.
  • JPAQueryFactory 는 JPA 쿼리인 JPQL을 만들기 때문에 EntityManager 가 필요하다.

 

 

findAll()

  • Querydsl에서 where(A,B) 에 다양한 조건들을 직접 넣을 수 있는데, 이렇게 넣으면 AND 조건으로 처리된다.
  • where() 에 null 을 입력하면 해당 조건은 무시한다.
  • likeItemName() , maxPrice() 쿼리 조건을 부분적으로 모듈화 할 수 있다. 자바 코드로 개발하기 때문에 얻을 수 있는 큰 장점이다.

 

 

 

 

 

 

※ 정리

List<Item> result = query
          .select(item)
          .from(item)
          .where(likeItemName(itemName), maxPrice(maxPrice))
          .fetch();

 

  • 쿼리 문장에 오타가 있어도 컴파일 시점에 오류를 막을 수 있다.
  • 메서드 추출을 통해서 코드를 재사용할 수 있다.

 

반응형

'Spring > DB 2편' 카테고리의 다른 글

스프링 트랜잭션 이해  (0) 2023.08.11
데이터 접근 기술 - 활용 방안  (0) 2023.08.11
데이터 접근 기술 - 스프링 데이터 JPA  (0) 2023.08.11
데이터 접근 기술 - JPA  (0) 2023.08.10
데이터 접근 기술 - MyBatis  (0) 2023.08.10