[Spring boot] Axon Framework๋ก ์์ํ๋ CQRS ๊ธฐ์ด
๋ง์ด ๋ฏธ๋ฃจ์ด์ง Axon Framework์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ด ํฌ์คํธ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ ์ ์์ฃผ ์ค๋ ์๊ฐ ์ , MSA์ ํธ๋์ญ์ ์ด์ผ๊ธฐ ์ค ์ด๋ฒคํธ ์์ฑ๊ณผ 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 ๊ธฐ์ด์ ์ธ ๊ฐ๋ ์ ์์์ง๋ง ์ด ๋ถ๋ถ์ ์ด๋ป๊ฒ ์ฐ๋ฉด ์ข์๊น์?
๋ค์ ํฌ์คํธ์์ ์ค์ ์์ ๋ฅผ ๊ฐ์ง๊ณ ํ ๋ฒ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.