티스토리 뷰

카테고리 없음

StateMachineAccessor 소개

행복[HappY] 2025. 3. 7. 19:00

StateMachineAccessor에 대한 설명

StateMachineAccessor는 Spring State Machine에서 StateMachine 인스턴스를 동적으로 관리하고 설정하는 역할을 하는 인터페이스입니다. 주로 상태 머신의 내부 구성 요소를 조작하거나, 실행 중인 상태 머신에 접근하여 특정 설정을 변경할 때 사용됩니다.

 

 

 

1. StateMachineAccessor의 역할

Spring State Machine은 일반적으로 StateMachineFactory를 통해 여러 개의 StateMachine 인스턴스를 생성하고 관리합니다. 그러나 생성된 상태 머신을 실행 중에 조작해야 하는 경우가 있습니다. 이때 StateMachineAccessor를 사용하여 다음과 같은 작업을 수행할 수 있습니다.

 

주요 기능

  1. 상태 머신 컨텍스트 설정 및 가져오기
    • 특정 상태 머신의 현재 상태를 가져오거나 설정할 수 있습니다.
  2. 지역(Local) 및 공통(Region-wide) 컨텍스트 설정
    • 상태 머신 내부에서 특정 상태에 대한 지역적인 접근을 할 수 있도록 지원합니다.
  3. 상태 머신의 내부 구성 요소 설정
    • StateMachineInterceptor, StateMachinePersist 등의 컴포넌트를 추가하여 상태 머신의 동작을 커스터마이징할 수 있습니다.

 

 

 

2. StateMachineAccessor 사용 예시

예제 1: 실행 중인 상태 머신의 상태 변경

@Autowired
private StateMachineFactory<States, Events> stateMachineFactory;

public void updateState() {
    StateMachine<States, Events> stateMachine = stateMachineFactory.getStateMachine();
    StateMachineAccessor<States, Events> accessor = stateMachine.getStateMachineAccessor();

    accessor.doWithAllRegions(access -> {
        access.resetStateMachine(new DefaultStateMachineContext<>(States.STATE2, null, null, null));
    });

    stateMachine.start();
}

설명

  • getStateMachineAccessor()를 사용하여 StateMachineAccessor 인스턴스를 가져옵니다.
  • resetStateMachine()을 호출하여 현재 상태를 STATE2로 변경합니다.
  • start()를 호출하여 새로운 상태로 초기화된 상태 머신을 다시 시작합니다.

 

예제 2: StateMachineInterceptor 추가

public void addInterceptor(StateMachine<States, Events> stateMachine) {
    StateMachineAccessor<States, Events> accessor = stateMachine.getStateMachineAccessor();

    accessor.doWithAllRegions(access -> {
        access.addStateMachineInterceptor(new StateMachineInterceptorAdapter<States, Events>() {
            @Override
            public void preStateChange(State<States, Events> state, Message<Events> message, 
                                       Transition<States, Events> transition, StateMachine<States, Events> stateMachine) {
                System.out.println("상태 변경 전: " + state.getId());
            }
        });
    });
}

설명

  • StateMachineInterceptorAdapter를 추가하여 상태 변경 전에 특정 동작을 수행하도록 설정합니다.
  • preStateChange()를 오버라이드하여 상태가 변경되기 전에 로그를 출력할 수 있습니다.

 

 

 

3. StateMachineAccessor의 주요 메서드

메서드 설명

doWithAllRegions(Consumer<StateMachineAccess<S, E>> consumer) 모든 상태 머신 지역(Region)에 대해 특정 설정을 적용합니다.
resetStateMachine(StateMachineContext<S, E> context) 특정 상태 컨텍스트를 기반으로 상태 머신을 초기화합니다.
addStateMachineInterceptor(StateMachineInterceptor<S, E> interceptor) 상태 머신에 인터셉터를 추가하여 상태 변경 이벤트를 가로챕니다.

 

 

 

4. StateMachineAccessor 사용 시 주의점

  1. 상태 머신이 시작되기 전에 설정을 변경해야 합니다.
    resetStateMachine()을 호출한 후 stateMachine.start();를 실행해야 합니다.
  2. 여러 개의 상태 머신을 관리하는 경우 주의해야 합니다.
    doWithAllRegions()을 사용하면 모든 상태 머신 영역(Region)에 동일한 설정이 적용될 수 있으므로 특정 상태 머신에만 적용하려면 개별적으로 설정해야 합니다.
  3. 상태 머신의 동작을 변경할 때 인터셉터를 적극 활용하는 것이 좋습니다.
    StateMachineInterceptor를 활용하면 상태 변경 시 특정 로직을 실행할 수 있어 활용도가 높습니다.

 

 

 

5. 요약

  • StateMachineAccessor는 실행 중인 StateMachine의 상태를 조작하거나 내부 설정을 변경할 때 사용됩니다.
  • resetStateMachine()을 활용하여 상태를 재설정할 수 있습니다.
  • StateMachineInterceptor를 추가하여 상태 변경을 가로채고 원하는 동작을 수행할 수 있습니다.
  • doWithAllRegions()을 사용하면 여러 상태 머신 영역에 대한 설정을 쉽게 변경할 수 있습니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함