[Spring boot] Axon Framework로 시작하는 CQRS 기초

반응형

많이 미루어진 Axon Framework에 대해 알아보도록 하겠습니다. 이 포스트를 다루기 전에 아주 오랜 시간 전, MSA의 트랜잭션 이야기 중 이벤트 소싱과 CQRS에 대해 다뤄본 적이 있습니다. 해당 내용을 먼저 숙지하신 다음 진행해보는 것을 권장합니다.

 

2021.03.21 - [Architecture/MSA] - [MSA] 7. MSA의 트랜잭션 이야기 3 - 이벤트 소싱과 CQRS

 

[MSA] 7. MSA의 트랜잭션 이야기 3 - 이벤트 소싱과 CQRS

이벤트 소싱을 처음 접하게 된 것은 2017 SpringCamp에서였습니다. 당시에는 MSA라는 개념에 대해 잘 알지도 못했고, MSA는 대기업에서나 쓸 수 있고, 적용가능한 엄청나게 큰 아키텍처였다. 라고만 인

blog.neonkid.xyz

 

 

 

Axon Framework

Axon Framework는 Java 언어에서 Event Sourcing과 CQRS를 쉽게 구현하도록 도와주는 프레임워크입니다. Axon Framework는 네덜란드에서 설립된 AxonIQ 회사에서 개발을 주도하고 있으며 현재 오픈 소스로 되어 있습니다.

 

https://github.com/AxonFramework/AxonFramework

 

GitHub - AxonFramework/AxonFramework: Framework for Evolutionary Event-Driven Microservices on the JVM

Framework for Evolutionary Event-Driven Microservices on the JVM - GitHub - AxonFramework/AxonFramework: Framework for Evolutionary Event-Driven Microservices on the JVM

github.com

Axon Framework는 Event Store와 결합하여, CQRS, Event Sourcing을 구현할 수 있으며 여기에 MSA를 적용하는 경우 각 서비스끼리 메시지를 주고 받기 위한 Axon Server까지 사용하면 Java 언어에서 우리가 이전에 다뤘던 MSA의 다양한 트랜잭션을 구현해 볼 수 있습니다.

 

 

 

 

Axon Framework Architecture

프레임워크를 사용해보기 전, Axon Framework가 어떤 구성을 사용하고 있는지에 대해서 알아보도록 하겠습니다.

 

UI에서 사용자가 애플리케이션에 명령(command)를 보내면 명령을 핸들링하는 Component가 명령을 받아 처리합니다. 처리 중에 외부 저장소(DB)에 영속이 필요한 경우 persist 작업을 거치고, 이러한 변화에 대한 이벤트(Event)를 이벤트 핸들링 Component가 받아 처리하는 방식을 사용하는 아키텍처입니다.

 

이러한 구조는 우리가 지난 포스트에서 다뤘던 CQRS 구조입니다. Axon Framework는 기본적으로 CQRS 구조를 가지고 있고, Java 언어에서 사용할 수 있습니다.

 

 

 

Install Axon Server

이제 구조를 파악했으니 사용하는 방법에 대해 알아보겠습니다. 우리는 JVM 계열에서 자주 사용하는 Spring Framework를 기반으로 REST API 서버를 만들고 그 내부에서 Axon Framework를 이용해보도록 하겠습니다.

 

먼저 이벤트를 받기 위한 Axon Server를 구동합니다. Axon Server 구동을 위해 Docker를 사용해보겠습니다.

 

docker run 명령을 이용하여 Axon Server를 로컬에 띄웁니다. 이 때 8024번 포트는 웹에서 스토어의 상태를 볼 수 있는 대시보드 접속용 포트이고, 8124번 포트는 메시지를 주고 받는 포트입니다.

 

이미지를 다운로드 받고 실행되었다면 docker ps 명령어를 입력하여 서버가 제대로 구동되었는지를 확인합니다.

 

웹 브라우저를 열고, 8024번 포트에 접속하여 대시보드가 나온다면 설치가 완료된 것입니다.

 

 

 

Create Project

이제 스프링 프로젝트를 만들어보겠습니다. 이 주제에서는 멀티 모듈을 사용할 것이지만 이번 포스트에서는 Axon Framework를 어떻게 스프링 프로젝트에 도입할 수 있는지를 먼저 살펴보기 위함이므로 단일 모듈로 진행하겠습니다.

 

인텔리J를 열고 Spring Initializr를 이용해 프로젝트를 만듭니다.

 

build.gradle을 열어서 Axon Framework 4.2.1 버전으로 implementation 코드를 넣어줍니다.

 

 

 

Config Axon Server

이제 아까 구동한 Axon Server의 주소와 포트를 설정합니다. Spring 프로젝트에서 application.yml을 엽니다.

 

axon 프로퍼티를 이용하여 Axon Server 주소를 지정합니다. 그리고 serializer는 xstream으로 사용하는데, 여기서 serializer는 메시지를 주고 받을 떄 사용하는 시리얼라이징 포맷을 스트림으로 하겠다는 것입니다.

 

 

 

Command Handler / Event Handler

Axon Framework에서는 이벤트를 발행하는 Command와 이벤트를 구독하는 Query로 하여금 메시지를 주고 받습니다. 이것이 CQRS의 기본이며 Axon Framework에서는 이들의 이벤트를 핸들링 할 수 있는 어노테이션을 제공합니다.

 

  • CommandHandler
  • EventHandler

 

CommandHandler는 이벤트를 Event Store로 전달하는 핸들러이고, EventHandler는 해당 이벤트를 받아 처리하는 핸들러입니다. 실제로 Spring 애플리케이션에서 두 핸들러를 선언해야만 Axon Server에 연결이 됩니다.

 

Spring boot 메인 코드에 CommandHandler를 선언하고 그 이벤트를 받을 메서드를 구현합니다. 일단 연결이 되는지를 확인하기 위해 메서드에는 아무런 내용도 적지 않겠습니다.

 

그런 다음 Spring boot Application을 실행하면 Axon Server 주소에 연결되었음을 알 수 있으며 Command Handler 하나가 등록된 것을 볼 수 있습니다.

 

그리고 메서드의 argument로 지정한 obj는 실제 Command이며 차후 Event Handler를 사용했을 때 해당 객체를 argument로 주는 경우, Command Handler에서 이벤트를 발행했을 때 해당 Event Handler가 실행되는 구조입니다.

 

Dashboard에 접속하면 application이 Axon Server와 연결되어 있는 모습을 볼 수 있습니다.

 

여기에 EventHandler를 추가하면 CommandHandler에서 나타나는 이벤트를 EventHandler가 받게 됩니다.

 

애플리케이션 실행 후 로그를 보면 TrackingEventProcessor가 할당되었음을 알 수 있는데, 이 어노테이션이 바로 이벤트를 추적하는 녀석입니다.

 

 

 

마치며..

Axon Framework를 통해서 CQRS가 어떻게 구현될 수 있는지를 간단히 살펴봤습니다. CQRS의 본질은 이것이 끝이 아니며 우리는 그 중에서 가장 기초적인 부분인 설치와 연결을 다룬 것입니다.

 

아직까지 생소한 단어들이 있습니다. CommandBus, EventHandler, CommandHandler 기초적인 개념은 알았지만 이 부분을 어떻게 쓰면 좋을까요?

 

다음 포스트에서 실전 예제를 가지고 한 번 다뤄보도록 하겠습니다.

반응형

Tistory Comments 0