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 테스트를 생성하여 구현을 테스트할 수 있습니다.

 

끝 ~~