[Spring boot] Axon Framework ๋ง๋ณด๊ธฐ
์ด๋ฒ ํฌ์คํธ๋ถํฐ Spring์ ์ด์ฉํ CQRS์ ๋ํด ์ ์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ช ํํธ๊ฐ ์ง๋ ํฌ์คํธ์์ ์ฐ๋ฆฌ๋ MSA์ ํธ๋์ญ์ ์ด์ผ๊ธฐ ์ค ์ด๋ฒคํธ ์์ฑ๊ณผ CQRS์ ๋ํด ์ด์ผ๊ธฐ ํ์์ต๋๋ค.
CQRS์ ์ด๋ฒคํธ ์์ฑ์ ๋ํ ๊ฐ๋ ์ ์ ๋๋ก ์ดํด๋์์ง๋ง ์ด์ ๋ํ ๊ตฌํ์ ์ด๋ป๊ฒ ํ์๋์ง ์ ๊ฐ์ด ์์ค์ค ์ ์์ ๊ฒ์ ๋๋ค. ์ ๋ํ ์ฒ์ CQRS์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ๋ค์์ ๋๋ ๊ทธ ๊ฐ๋ ์กฐ์ฐจ๋ ์์ํ๊ณ , ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ์์ด ๊ธฐ์กด์ ํธ๋์ญ์ ์ด ์ ๋ง ๋ง์กฑ์ค๋ฌ์ด๋ฐ, ์ด๋ฌํ ํธ๋์ญ์ ์ด ์ ํ์ํ์ง๋ ์ ๋ชฐ๋์์ต๋๋ค.
ํ์ง๋ง ์๋น์ค์ ๋ถ๋ฆฌ, ๋์จํ ๊ฒฐํฉ์ ๋ํด ๊ทธ ํ์์ฑ์ ๋ผ์ํ๊ฒ ๋๋ผ๊ณ ์ง๊ธ ์ด ์๊ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋์ญ์ ์ ์์กดํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ํธ๋์ญ์ ๊น์ง ๋งก๋๋ค๊ณ ์๊ฐํ๋ค๋ฉด ์ด๋ฌํ ๊ฐ๋ ์ด ํ์ํ ์ ๋ฐ์ ์์ ๊ฒ์ด๋ผ๊ณ ๋ด ๋๋ค. ๊ทธ๋์ ์ ๋ ๋ฐฑ์๋ ํ๋ ์์ํฌ ์ค ๊ฐ์ฅ ์์ ์๋ Spring Framework๋ฅผ ๊ณจ๋ผ์ CQRS๋ฅผ ๊ฐ๋จํ ๊ตฌํํด๋ณด๊ณ ์๋ ๋ค์ง์ ํ์์ต๋๋ค.
Axon Framework
Java, ํนํ Spring ์ง์์์๋ CQRS๋ฅผ ์ฌํํ๊ธฐ ์ํ ๊ตฌํ์ฒด๊ฐ ์ด๋ฏธ ์กด์ฌํ๋๋ฐ, ๊ทธ ์ค ๋ํ์ ์ธ ๊ฒ์ด ๋ฐ๋ก Axon Framework ์ ๋๋ค.
Axon์ ๋ค๋๋๋์ AxonIQ์์ ๊ฐ๋ฐํ์ฌ ์คํ ์์ค์ ์์ฉ ์ํํธ์จ์ด๋ก ์ด์ํ๊ณ ์๋ CQRS ๊ตฌํ ๋๊ตฌ์ ๋๋ค. CQRS๋ฅผ ๊ตฌํํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง๋ง Axon์ CQRS๋ฅผ ์ฒ์ ์ ํ๋ ๊ฐ๋ฐ์๋ค๋ ์ฝ๊ฒ ๊ทธ ๊ตฌํ์ ํ ์ ์์ด์ ๊ฝค ์ฅ์ ์ผ๋ก ๊ผฝํ๊ณ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ Axon Framework, EventStore, Axon Server ์ด๋ ๊ฒ 3๊ฐ์ง๋ฅผ ์ด์ฉํ์ฌ CQRS๋ฅผ ๊ตฌํํด๋ณด๊ณ ์ ํฉ๋๋ค.
Architecture
๋งจ ์ผ์ชฝ์ ์๋ UI(Front)์ด๊ฑฐ๋ API๊ฐ ๋ ์๋ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ค์ด์จ ์์ฒญ์ Command๋ผ ์ ์ํ๊ณ , ํด๋น ๋ช ๋ น์ด ๋ค์ด์ค๋ฉด ๊ทธ ๋ช ๋ น์ EventStore์ ์ ์ฅํ๊ณ Event Broker์ ํด๋น ์ด๋ฒคํธ๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ๊ณผ์ ์ด ๋ฐ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ์ผ๋ จ์ ๊ณผ์ ์ ๋๋ค.
์ด ๊ณผ์ ์ CQRS์ ๋์ผํ๋ฉฐ Axon์ด CQRS๋ฅผ ์ฑํํ์ฌ ๋์ํ๊ณ ์์์ ์๋ ค์ฃผ๋ ์ํคํ ์ฒ์ ๋๋ค.
Axon Server ์ค์น
Axon Server๋ CQRS์์ EventStore์ Event Broker์ ๋ ๊ฐ์ง ์ญํ ์ ์ํํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค. ๊ทธ๋ฌ๋ Axon Framework๋ฅผ ์ด์ฉํ๋ ๋ฐ ์์ด ํ์๋ก ์ค์นํด์ผ ํ๋ ์ฌํญ์ ์๋๋ฉฐ Axon Framework๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ง์ํ๋ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์ฉํ ์๋ ์์ต๋๋ค.
- Kafka
- Spring Cloud
- MongoDB
- AMQP
- Open Tracing
๋จผ์ Axon Server๋ฅผ ์ค์นํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์์ ๋งํฌ๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฆ๊ณผ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์ ๋ ฅํ ํ, ์ง์ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ๊ฑฐ๋ ์์ถ ํ์ผ ํน์ Docker ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ ์๋ ์์ต๋๋ค.
์ ๋ ์ฌ๊ธฐ์ Docker Image๋ก ์งํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
$ docker run -d --name axonserver -p 8024:8024 -p 8124:8124 axoniq/axonserver
์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด์ Axon Server๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ 2๊ฐ์ ํฌํธ๋ฅผ ์ด๊ณ axonserver๋ฅผ Docker ์์ ๋์์ค๋๋ค.
์์ ํ๋ฉด์ด ๋์จ๋ค๋ฉด ์ ์งํํ๊ณ ์๋ ๊ฒ์ ๋๋ค.
docker ps ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด์ Axon Server๊ฐ ์ ์คํ๋์๋์ง ํ์ธํด์ค๋๋ค. ์ฌ๊ธฐ๊น์ง ๋์๋ค๋ฉด Axon Server์ ์ค์น๋ ์๋ฃ๋ ๊ฒ์ ๋๋ค.
๊ฐ ํฌํธ ์ฃผ์๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋๋ฉด..
- 8024: Dashboard (Web)
- 8124: Message Routing
๋์๋ณด๋์์ Axon์ผ๋ก ๋ค์ด์ค๊ณ ๋๊ฐ๋ ๋ฉ์์ง๋ฅผ ์ง์ ํ์ธํ๋ ๋ฑ์ ์ํ๋ฅผ ์น์ผ๋ก ์๊ฐํ๋ ํํ์ ํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค.
Axon ๋์๋ณด๋์์๋ ์๋ฒ์ ์ํ์ Command, Query์ ์ํ ๋ฑ ๋ค์ํ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ..
์์ฃผ ๊ฐ๋จํ๊ฒ Axon์ ๋ํด์ ์์๋ณด๊ณ , ์๋ฒ๋ฅผ ์ค์นํ๋ ์๊ฐ์ ๊ฐ์ ธ๋ดค์ต๋๋ค. Axon ์๋ฒ๋ Spring ๊ธฐ๋ฐ์ผ๋ก ๋์ด ์์ผ๋ฉฐ JVM ํ๋์ ํตํด์ ๋น์ฆ๋์ค์ ๋ง๊ฒ ํ๋ํ ์ ์๋ค๋ ์ ์ด ๋๋ณด์๋๋ฐ์.
๋ค์ ํฌ์คํธ์์๋ ์ง์ Spring ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด์ Axon์ ์ฌ์ฉํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.