Skip to main content

3. 도메인 개발

·233 words·2 mins· loading
Table of Contents

이 강의에서는 따로 적을게 별로없다. 그냥 개발하는 내용이 다임

테스트 환경설정
#

테스트를 할때, 기본적으로 /test/resources/application.yml에 있는 설정 파일을 먼져 읽는다. (없으면 기본 파일읽음) 따라서, 이곳에 테스트에서의 설정을 생성할 수 있다.

또한, 스프링부트는 아무 설정이 안되어있는 경우, 기본적으로 메모리DB(H2)로 설정을 한다. 따라서, 빈 application.yml을 만들기만 하면, 기본적으로 메모리DB가 설정된다.

동적쿼리
#

JPA에서 기본적인 동적쿼리는 지원하지만, 코드가 진짜 끔찍해진다. 따라서 QueryDsl과의 동작이 잘 어울린다.

JPA
#

혐주의
 
```java
// 하이라이트는 노가다로 해야되는듯? js도안먹히고
public List findAllByString(OrderSearch orderSearch) {
      //language=JPAQL
      String jpql = "select o From Order o join o.member m";
      boolean isFirstCondition = true;
//주문 상태 검색
if (orderSearch.getOrderStatus() != null) {
          if (isFirstCondition) {
              jpql += " where";
              isFirstCondition = false;
          } else {
              jpql += " and";
}
          jpql += " o.status = :status";
      }
//회원 이름 검색
if (StringUtils.hasText(orderSearch.getMemberName())) {
          if (isFirstCondition) {
              jpql += " where";
              isFirstCondition = false;
          } else {
              jpql += " and";
}
          jpql += " m.name like :name";
      }
      TypedQuery query = em.createQuery(jpql, Order.class) .setMaxResults(1000); //최대 1000건
      if (orderSearch.getOrderStatus() != null) {
          query = query.setParameter("status", orderSearch.getOrderStatus());
      }
      if (StringUtils.hasText(orderSearch.getMemberName())) {
          query = query.setParameter("name", orderSearch.getMemberName());
      }
      return query.getResultList();
  }
  ```

QueryDsl
#

훨씬 깔끔

    public List<Order> findAll(OrderSearch orderSearch){

                String memberName = orderSearch.getMemberName();
                OrderStatus status = orderSearch.getOrderStatus();
                
        return  query.select(order)
				eqOrderStatus(status))
                .where(eqOrderStatus(status))
                .fetch();
    }

    private BooleanExpression eqMemberName(String memberName){
        return StringUtils.hasText(memberName) ? order.member.name.eq(memberName) : null;
    }

    private BooleanExpression eqOrderStatus(OrderStatus orderStatus){
        return orderStatus != null ? order.status.eq(orderStatus) : null;
    }