이 강의에서는 따로 적을게 별로없다. 그냥 개발하는 내용이 다임
테스트 환경설정#
테스트를 할때, 기본적으로
/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;
}