DevBoi

[DDD] Axon framework 를 사용해보자 (3) 본문

Develop/[DDD]

[DDD] Axon framework 를 사용해보자 (3)

HiSmith 2023. 6. 12. 12:07
반응형

이제 어느정도 구현에 대한 감을 잡았다.

실제적으로 사용하기 위한 코드로, Service부터 따라가며 구현을 리팩토링 해보자

우선 서비스 부터 다시 만들어야 한다.

분석기반으로 소스를 하나씩 구현해보자, 단순히 메소드 하나만 우선 사용을 할 예정이다.

 

1) OrderQueryService

@Service
@RequiredArgsConstructor
public class OrderQueryService {
  private final QueryGateway queryGateway;

  public CompletableFuture<List<OrderResponse>> findAllOrders(){
    return queryGateway.query(new FindAllOrderedProductsQuery(), ResponseTypes.multipleInstancesOf(Order.class))
      .thenApply(r -> r.stream()
        .map(OrderResponse::new)
        .collect(Collectors.toList()));
  }

}

queryGateway를 통해서, FindallOrderProductQuery를 호출한다.

그리고 응답 타입은, Order.class로 받되, 해당 Response타입으로 바로 변경해서 리스트로 만들어서 Return 한다.

해당 작업은 전체 데이터를 조회하기 떄문에 비동기로 처리 되게 끔 래핑한다.

 

2) FindAllOrderProductQuery

public class FindAllOrderedProductsQuery {
}

쿼리 안에 내용은 없다.

그러면 얘가 어떻게 ... 처리를 하는거지? 라고 생각이 들만하다.

 

답은 이벤트 핸들러 안에있다.

해당 클래스에서 처리하는게 아니라, 해당 클래스를 인자로 사용하는 쿼리 핸들러에서 정의한다.

 

3)OrderEventHandler

public interface OrdersEventHandler  {
  List<Order> handle(FindAllOrderedProductsQuery query);
}

3) OrderEventHandlerImpl

@Service
@ProcessingGroup("orders")
public class OrderEventHandlerImpl implements OrdersEventHandler{
  private final Map<String, Order> orders = new HashMap<>();
  @QueryHandler
  public List<Order> handle(FindAllOrderedProductsQuery query) {
    return new ArrayList<>(orders.values());
  }
}

 

이렇게 하고, 컨트롤러에서 해당 데이터를 가져올 수 있는지를 먼저 확인해보자

 

4)OrderEndpoint

@RestController
@RequiredArgsConstructor
public class OrderController {
  private final OrderQueryService orderQueryService;
  @GetMapping("/all-orders")
  public CompletableFuture<List<OrderResponse>> findAllOrders() {
    return orderQueryService.findAllOrders();
  }
}

 

5) 설정 (application.yml)

spring:
  h2:
    console:
      enabled: true
      path: /h2-console

  datasource:
    url: jdbc:h2:mem:test # test 부분을 자신이 원하는 것으로 바꾸시면 됩니다.
    username: sa # username과 password는 자신의 설정에 맞게
    password:
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: create # 어플리케이션을 시작할 때 데이터베이스를 초기화하고 다시 테이블 생성
    properties:
      hibernate:
        format_sql: true # 실행되는 query를 보여줌

logging.level:
  org.hibernate.SQL: debug
server:
  port: 8080

axon:
  serializer:
    general: xstream
  axonserver:
    servers: 127.0.0.1:8124

 

해당 Endpoint로 호출 시에 데이터가 잘 온다.

그러면 다음에는 조회용 Query가 아닌, EVENT 핸들러를 구축해서,

해당 생성과 삭제를 해보자

반응형