JAVA

Axon Framework에서 @TargetAggregateIdentifier 주석 사용하기

wooyit 2023. 3. 24. 02:55

안녕하세요, 오늘은 Axon Framework를 사용하면서 발생했던 특정 오류와 그 해결 과정에 대해 이야기하려 합니다.

저의 경험을 통해 동일한 문제가 발생한 다른 개발자들에게 도움이 되기를 바라는 마음에서 이 글을 작성하게 되었습니다.

발생한 문제

제가 발생한 오류 메시지는 아래와 같았습니다.

An exception was thrown by the remote message handling component: Invalid command. 
It does not identify the target aggregate. 
Make sure at least one of the fields or methods 
in the [DeletePostCommand] class contains the @TargetAggregateIdentifier annotation...

Axon Framework와 @TargetAggregateIdentifier 주석

Axon Framework는 자바 프레임워크 중 하나로, CQRS(Command Query Responsibility Segregation)와 이벤트 소싱 패턴을 쉽게 구현할 수 있게 도와주는 라이브러리입니다.

CQRS는 읽기 모델과 쓰기 모델을 분리하는 아키텍처 패턴을 말하며, 이벤트 소싱은 모든 상태 변화를 이벤트로 저장하고 이를 통해 상태를 재구성하는 패턴을 의미합니다.

이러한 패턴들을 사용하기 위해 Axon Framework에서는 'Aggregate'라는 개념이 중요하게 사용됩니다.

Aggregate는 DDD(Domain-Driven Design, 도메인 주도 설계)에서 일관된 트랜잭션을 보장하는 객체의 집합을 말합니다.

명령이 특정 Aggregate에 정확하게 라우팅되기 위해서는, Aggregate를 구분할 수 있는 식별자가 필요합니다.

그때 사용하는 것이 @TargetAggregateIdentifier 주석입니다. 이 주석은 Axon에게 명령이 어떤 Aggregate를 대상으로 하는지를 알려주는 역할을 합니다.

문제의 원인 및 해결방법

위의 상황에서는 DeletePostCommand 클래스가 @TargetAggregateIdentifier 주석을 포함하고 있지 않아서, Axon Framework가 어떤 Aggregate에 이 명령을 라우팅해야 하는지를 알 수 없었던 것입니다.

이 문제를 해결하기 위해서는 DeletePostCommand 클래스 내에 적절한 필드나 메서드에 @TargetAggregateIdentifier 주석을 추가해야 합니다.

예를 들어, 만약 DeletePostCommand 클래스가 postId라는 필드를 가지고 있다면, 해당 필드에 주석을 붙여주는 것이 좋습니다.

public class DeletePostCommand {
    @TargetAggregateIdentifier
    private final UUID postId;

    // Constructor, getter methods, etc.
}

또는 getter 메서드에 주석을 붙여주는 것도 가능합니다.

public class DeletePostCommand {
    private final String postId;

    // Constructor, other methods, etc.

    @TargetAggregateIdentifier
    public String getPostId() {
        return postId;
    }
}

주석을 추가한 후에는, 해당 주석이 붙은 필드나 메서드가 null이 아닌 값을 반환하는지 꼭 확인해야 합니다. 만약 null 값을 반환한다면, Axon은 여전히 명령을 올바른 Aggregate로 라우팅할 수 없어 오류를 발생시킵니다.

이 모든 수정을 마친 후에는 프로젝트를 다시 컴파일하고, 애플리케이션을 재시작하여 수정된 DeletePostCommand 클래스가 적용되도록 해야 합니다. 그리고 이전에 실패했던 delete 명령을 다시 실행해봅니다. 이제 Axon Framework가 명령을 올바르게 처리하고, 이에 따라 포스트를 정상적으로 삭제하는 것을 확인할 수 있을 것입니다.

 

[axonframework 공식 문서]

[wooyung's IT 블로그]