public interface Speficiation<T> {
public boolean isSatisfiedBy(T agg);
}
public class OrderSpec implements Specification<Order> {
private String orderId;
public OrderSpec(String ordererId) {
this.ordererId = ordererId;
}
public boolean isSatisfiedBy(Order agg) {
return agg.getOrdererId().getMemberId().getId().equals(ordererId);
}
}
public class MemoryOrderRepository implements OrderRepository {
public List<Order> findAll(Specification spec) {
List<Order> allOrders = findAll();
return allOrders.stream().filter(order -> spec.isSatisfiedBy(order)).collect(toList());
}
위 방식에는 전체 데이터를 메모리에 로딩한 다음에 검사를 하기 때문에 성능문제가 발생한다.
Criteria-Builder나 Predicate를 사용해서 검색조건을 구현함으로써 성능문제를 해결할 수 있다.
리포지터리는 애그리거트의 저장소를 표현하는 것으로서 다음 용도로 리포지터리를 사용하는 것은 적합하지 않다.
- 여러 애그리거트를 조합해서 한 화면에 보여주는 데이터 제공
- 각종 통계 데이터 제공