Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info

AKKA는 다른 프레임워크에 탑재가능해 프레임워크라기보다 툴킷형태에 가까우며

Axon은 DDD를 하기위해 만들어진 프레임워크 그자체이기때문에 DDD채택이 프레임워크보다 중요할때 선택할수 있습니다.

필자는 전면채택보다 부분채택및 부부개선에 액터모델을 일부이용하고 있기때문에 전자를 조금더 선호하지만

DDD규칙을 프레임워크가 잡아주며 전술적패턴을 학습할수 있다란점에서 조사를 진행해보았습니다.


주요링크 

...

Code Block
themeEmacs
@Saga
class OrderProcessingSaga {
    @SagaEventHandler(...)
    fun on(OrderCreatedEvent e) {
        // 다음 행동 트리거
    }
}

...

💎 Axon Framework의 장점

장점설명
DDD 구조를 잘 반영복잡한 도메인을 명확히 모듈화 가능
CQRS 구현 지원읽기/쓰기 분리로 확장성과 성능 확보
Event Sourcing 지원과거 상태 추적과 시간여행 가능
Spring Boot 통합손쉬운 설정과 Bean 관리
Axon Server 제공이벤트 저장소와 라우팅을 중앙 관리 가능
Saga로 프로세스 오케스트레이션여러 도메인의 장기 트랜잭션 처리 가능

...

📦 Axon Server (선택사항)

  • Axon 전용 이벤트 저장소 및 라우팅 서버

  • Kafka, RabbitMQ 없이도 분산 처리 가능

  • 클러스터링, 메시지 라우팅, 모니터링 포함

...

🎯 Axon은 언제 적합할까?

적합한 경우설명
복잡한 비즈니스 도메인예: 금융, 쇼핑몰, 물류, 상담 시스템 등
강한 일관성이 필요한 경우트랜잭션 단위 명확화
감사/이력 기능이 중요한 경우모든 상태 변경을 이벤트로 보존
마이크로서비스 간 프로세스 연결Saga 및 이벤트 기반 통합

...

🧱 Axon 구성요소 요약 도표

역할어노테이션 / 구성
Aggregate@Aggregate, @AggregateIdentifier
Command클래스 + @CommandHandler
Event클래스 + @EventSourcingHandler
Query클래스 + @QueryHandler
Saga@Saga, @SagaEventHandler
이벤트 저장소Axon Server / RDB / Kafka 등


🧭 Akka vs Axon DDD 프레임워크 비교

항목Axon FrameworkAkka / Pekko (Typed)
주요 언어Java, KotlinScala, 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
themeEmacs
@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
themeEmacs
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 모델에 적합

...

📊 비교 요약

항목AxonAkka / Pekko
코드 양매우 간결 (어노테이션 기반)많음 (핸들러와 상태 분리 명시 필요)
구조적 통합성CQRS/EventSourcing 통합 관리구성요소 직접 설계 필요
학습 난이도중급 (Spring 기반 경험 있으면 쉬움)고급 (Actor, FSM, 메시지 처리 이해 필요)
확장성Axon Server or KafkaAkka Cluster, Sharding, Projection
유즈케이스도메인 중심 시스템, 전통 시스템 CQRS 전환실시간 처리, 고부하 분산 시스템, IoT, 게임 서버 등

...

🔚 결론

  • Axon: DDD + CQRS + Event Sourcing을 간단하게 구조화하고 싶은 경우 → 선언형으로 빠르게 구현 가능

  • Akka: 고성능, 실시간성, 분산 처리 중심 시스템에서 더 유연하게 동작 → 자유도는 높지만 복잡도도 높음



서로다른진영 가령 자바와 닷넷이 상호 경쟁하면서도 서로영향을 주며발전했듯이 - 플스vs엑박처럼

한가지 진영만 우월하다고 타진영을 무시하는것보다. 다른 진영도 참고하면서 학습하는 방식은 자신이 숙련도가 높다라고 믿는 진영에서도 더 발전하는 오픈마인드식 접근이라 생각이들어 AKKA에 대응하는 또다른 컨셉을 프레임워크를 조사해보았습니다.