JAVA
AXON Framework 구현 방법
wooyit
2023. 2. 24. 13:05
JAVA에서 AXON Framework 하는 단계
1. 종속성 추가 Axon Framework를 사용하려면 프로젝트에 종속성을 추가해야 합니다. Maven을 사용하는 경우 pom.xml에 다음을 추가합니다
<dependency>
<groupId>org.axonframework</groupId>
<artifactId>axon-spring-boot-starter</artifactId>
<version>4.6.3</version>
</dependency>
2. 명령 및 이벤트 개체 만들기
시스템 상태 변경 요청을 나타내는 명령 개체와 시스템 상태 변경을 나타내는 이벤트 개체를 만듭니다.
public class CreateOrderCommand {
private String orderId;
private String product;
private int quantity;
// constructor, getters, setters
}
public class OrderCreatedEvent {
private String orderId;
private String product;
private int quantity;
// constructor, getters, setters
}
3. 명령 처리기 및 집계 개체 만들기
명령을 처리하고 이벤트를 생성하는 명령 처리기와 시스템 상태를 저장하고 이벤트를 생성하는 집계를 만듭니다.
public class OrderAggregate {
@AggregateIdentifier
private String orderId;
private String product;
private int quantity;
public OrderAggregate() {
// default constructor required
}
@CommandHandler
public OrderAggregate(CreateOrderCommand command) {
// generate and publish event
apply(new OrderCreatedEvent(command.getOrderId(), command.getProduct(), command.getQuantity()));
}
@EventSourcingHandler
public void on(OrderCreatedEvent event) {
this.orderId = event.getOrderId();
this.product = event.getProduct();
this.quantity = event.getQuantity();
}
// getters, setters
}
public class OrderCommandHandler {
private final CommandGateway commandGateway;
public OrderCommandHandler(CommandGateway commandGateway) {
this.commandGateway = commandGateway;
}
@CommandHandler
public void handle(CreateOrderCommand command) {
// create aggregate and publish command
OrderAggregate order = new OrderAggregate();
commandGateway.sendAndWait(command);
}
}
4. Axon Framework는 Spring Framework와 통합되도록 설계되었습니다. Axon을 구성하고 집계 및 명령 처리기 개체를 Bean으로 등록합니다.
@Configuration
public class AxonConfig {
@Bean
public OrderCommandHandler orderCommandHandler(CommandGateway commandGateway) {
return new OrderCommandHandler(commandGateway);
}
@Bean
public OrderAggregate orderAggregate() {
return new OrderAggregate();
}
@Bean
public SpringAggregateSnapshotterFactoryBean springAggregateSnapshotterFactoryBean() {
return new SpringAggregateSnapshotterFactoryBean();
}
@Bean
public SpringTransactionManager springTransactionManager(PlatformTransactionManager transactionManager) {
return new SpringTransactionManager(transactionManager);
}
@Bean
public EventStore eventStore() {
return EmbeddedEventStore.builder().storageEngine(new InMemoryEventStorageEngine()).build();
}
@Bean
public EventHandlingConfiguration eventHandlingConfiguration() {
return new EventHandlingConfiguration();
}
@Bean
public SagaConfiguration sagaConfiguration() {
return new SagaConfiguration();
}
@Bean
public CommandBus commandBus() {
SimpleCommandBus commandBus = SimpleCommandBus.builder().build();
commandBus.registerDispatchInterceptor(new BeanValidationInterceptor<>());
return commandBus;
}
@Bean
public CommandGateway commandGateway(CommandBus commandBus) {
return DefaultCommandGateway.builder().commandBus(commandBus).build();
}
}
5. JUnit 테스트를 생성하여 구현을 테스트할 수 있습니다.
끝 ~~