상품 도메인 개발과 주문 도메인 개발

이가현·2022년 10월 28일
0

1️⃣ 상품 도메인 개발

개발 순서 리마인드 : 엔티티 -> 레포지토리 -> 서비스

상품 레포지토리 개발

📍

public void save(Item item) {
	if (item.getId() == null) { // 새로운 회원일 때
    	em.persist(item);
    }
    else {                      // DB에 이미 저장된 엔티티 '수정'
    	em.merge(item);
    }
}

상품 서비스 개발

  • 레포지토리 클래스에 위임만 하는 클래스 !!

2️⃣ 주문 도메인 개발

상품 도메인 개발과 방법이 유사함.

주문 검색 기능 개발

  • JPA에서 동적 쿼리를 어떻게 처리해야 하는가?

1) 검색 조건으로 파라미터에 OrderSearch 클래스를 추가한다.

package jpabook.jpashop.domain;
public class OrderSearch {
	private String memberName; //회원 이름
	private OrderStatus orderStatus;//주문 상태[ORDER, CANCEL] //Getter, Setter
}

그 다음, 리포지토리 클래스에 코드 추가 !

public List<Order> findAll(OrderSearch orderSearch) { 
	//... 검색 로직
}

2) JPA 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();
}

실무에서 쓰기엔 너무 복잡함. -> Querydsl 사용 !

0개의 댓글