Page History
...
| 역할 | 어노테이션 / 구성 |
|---|---|
| Aggregate | @Aggregate, @AggregateIdentifier |
| Command | 클래스 + @CommandHandler |
| Event | 클래스 + @EventSourcingHandler |
| Query | 클래스 + @QueryHandler |
| Saga | @Saga, @SagaEventHandler |
| 이벤트 저장소 | Axon Server / RDB / Kafka 등 |
🧭 Akka vs Axon DDD 프레임워크 비교
| 항목 | Axon Framework | Akka / Pekko (Typed) |
|---|---|---|
| 주요 언어 | Java, Kotlin | Scala, Java, Kotlin (Pekko로 JVM 범위 확대 중) |
| DDD 지원 방식 | CQRS + Event Sourcing + Aggregate 직접 구현 | Actor = Aggregate 역할, 메시지 핸들링 기반 상태 전이 |
| Command/Query 분리 | 내장 CQRS 구조 제공 (@CommandHandler, @QueryHandler) | 별도 설계 필요 (Actor 메시지 타입을 직접 설계) |
| Event Sourcing | 자동 관리 (Axon Event Store or Axon Server 사용) | 수동 구현 (EventPersistence + Snapshot 관리 필요) |
| Aggregate 관리 | @Aggregate 어노테이션 기반 | FSM 또는 PersistentActor로 수동 구성 |
| Saga 프로세스 | @Saga 기반 장기 트랜잭션 처리 | Actor 간 메시지 기반 오케스트레이션 (FSM 또는 Supervisor Pattern) |
| 복구/재처리 | 이벤트 재생으로 Aggregate 상태 복구 | 이벤트 소싱 재생 및 Snapshot 활용 |
| 분산 메시징 | Axon Server or Kafka 연동 | Akka Cluster & Sharding + Akka |
아래는 DDD 패턴을 구현할 때의 Axon vs Akka(Pekko) 기본 예제 비교입니다. 공통 시나리오는 간단한 주문(Order) 생성 및 상태 변경이며, 모두 Kotlin 기준입니다.
...
✅ 시나리오
명령(Command):
CreateOrderCommand(orderId, product)이벤트(Event):
OrderCreatedEvent(orderId, product)Aggregate는
OrderAggregate로 구현
🟦 1. Axon Framework - Kotlin 예제
| Code Block | ||
|---|---|---|
| ||
@Aggregate
class OrderAggregate() {
@AggregateIdentifier
lateinit var orderId: String
constructor(cmd: CreateOrderCommand) : this() {
AggregateLifecycle.apply(OrderCreatedEvent(cmd.orderId, cmd.product))
}
@EventSourcingHandler
fun on(event: OrderCreatedEvent) {
this.orderId = event.orderId
println("Order created: ${event.product}")
}
}
data class CreateOrderCommand(val orderId: String, val product: String)
data class OrderCreatedEvent(val orderId: String, val product: String)
|
🟢 Axon 특징
@Aggregate,@CommandHandler,@EventSourcingHandler어노테이션만 붙이면 핵심 구조 완료이벤트 저장, 복원, CQRS QueryModel 자동 처리 가능
🟧 2. Akka (Pekko) Persistence - Kotlin 예제
| Code Block | ||
|---|---|---|
| ||
sealed interface Command
data class CreateOrder(val orderId: String, val product: String) : Command
sealed interface Event
data class OrderCreated(val orderId: String, val product: String) : Event
data class OrderState(val orderId: String? = null, val product: String? = null) {
fun apply(event: OrderCreated) = this.copy(orderId = event.orderId, product = event.product)
}
class OrderAggregate private constructor(
private val context: akka.actor.typed.javadsl.ActorContext<Command>
) : EventSourcedBehavior<Command, Event, OrderState>(
PersistenceId.ofUniqueId("order-${context.self.path().name}"),
OrderState()
) {
companion object {
fun create(): Behavior<Command> = Behaviors.setup { ctx -> OrderAggregate(ctx) }
}
override fun commandHandler(): CommandHandler<Command, Event, OrderState> =
newCommandHandlerBuilder()
.forAnyState()
.onCommand(CreateOrder::class.java) { state, cmd ->
Effect().persist(OrderCreated(cmd.orderId, cmd.product))
}.build()
override fun eventHandler(): EventHandler<OrderState, Event> =
newEventHandlerBuilder()
.forAnyState()
.onEvent(OrderCreated::class.java) { state, event ->
state.apply(event)
}.build()
} |
🟡 Akka 특징
명시적인 FSM 스타일 구조
이벤트 핸들링과 상태 관리 수동 구현
Behavior,CommandHandler,EventHandler분리복잡하지만 분산 시스템/Actor 모델에 적합
...
📊 비교 요약
| 항목 | Axon | Akka / Pekko |
|---|---|---|
| 코드 양 | 매우 간결 (어노테이션 기반) | 많음 (핸들러와 상태 분리 명시 필요) |
| 구조적 통합성 | CQRS/EventSourcing 통합 관리 | 구성요소 직접 설계 필요 |
| 학습 난이도 | 중급 (Spring 기반 경험 있으면 쉬움) | 고급 (Actor, FSM, 메시지 처리 이해 필요) |
| 확장성 | Axon Server or Kafka | Akka Cluster, Sharding, Projection |
| 유즈케이스 | 도메인 중심 시스템, 전통 시스템 CQRS 전환 | 실시간 처리, 고부하 분산 시스템, IoT, 게임 서버 등 |
...
🔚 결론
Axon: DDD + CQRS + Event Sourcing을 간단하게 구조화하고 싶은 경우 → 선언형으로 빠르게 구현 가능
Akka: 고성능, 실시간성, 분산 처리 중심 시스템에서 더 유연하게 동작 → 자유도는 높지만 복잡도도 높음
서로다른진영 가령 자바와 닷넷이 상호 경쟁하면서도 서로영향을 주며발전했듯이 - 플스vs엑박처럼
한가지 진영만 우월하다고 타진영을 무시하는것보다. 다른 진영도 참고하면서 학습하는 방식은 자신이 숙련도가 높다라고 믿는 진영에서도 더 발전하는 오픈마인드식 접근이라 생각이들어 AKKA에 대응하는 또다른 컨셉을 프레임워크를 조사해보았습니다.