다중 데코레이터 중첩 규칙 (Rules for Multiple Decorator Nesting)

다중 데코레이터 중첩 규칙 (Rules for Multiple Decorator Nesting)

1. 개요

다중 데코레이터 중첩은 복수의 데코레이터를 계층적으로 적용하여 복합 실행 정책을 구현하는 기법이다. 중첩의 순서, 호환성, 의미론적 합성 등에 대한 규칙을 이해하는 것이 올바른 행동 트리 설계의 핵심이다.

2. 중첩 순서의 원칙

2.1 외부에서 내부로의 평가 순서

데코레이터는 외부에서 내부로 순차적으로 tick된다.

<D1>      <!-- 1번째 tick -->
    <D2>  <!-- 2번째 tick (D1이 허용한 경우) -->
        <Action/>  <!-- 3번째 tick (D2가 허용한 경우) -->
    </D2>
</D1>

외부 데코레이터(D1)가 자식(D2)을 tick하지 않기로 결정하면(Timeout 만료, Precondition 미충족 등), 내부의 모든 노드는 실행되지 않는다.

2.2 의미론적 우선순위

외부 데코레이터의 정책이 내부 데코레이터의 정책보다 우선한다.

중첩의미
Timeout(Retry(Action))전체 시간 제한 내에서 재시도
Retry(Timeout(Action))각 시도에 개별 시간 제한
ForceSuccess(Retry(Action))모든 재시도 실패해도 SUCCESS
Retry(ForceSuccess(Action))ForceSuccess가 항상 SUCCESS → Retry가 즉시 종료

3. 중첩 호환성

3.1 호환되는 조합

외부내부의미호환성
TimeoutRetry시간 제한 + 재시도호환
RetryTimeout시도별 시간 제한호환
RetryDelay재시도 간 대기호환
RepeatForceSuccess실패 무시 반복호환
RunOnceRetry초기화 재시도 후 캐싱호환
TimeoutRepeat시간 제한 반복호환

3.2 무의미하거나 주의가 필요한 조합

외부내부문제
InverterInverter항등 변환 (무의미)
ForceSuccessForceFailure항상 SUCCESS (ForceFailure 무효)
ForceFailureForceSuccess항상 FAILURE (ForceSuccess 무효)
RetryForceSuccessForceSuccess가 FAILURE를 차단하여 Retry가 항상 즉시 성공
KeepRunningUntilFailureForceSuccessFAILURE가 발생하지 않아 무한 실행

4. halt 전파 규칙

4.1 계층적 halt 전파

외부 데코레이터가 halt되면, 내부 데코레이터의 halt가 호출되고, 최종적으로 리프 노드의 halt가 호출된다.

D1.halt() → D2.halt() → Action.halt()

각 데코레이터의 halt()에서는:

  1. 자식의 haltChild() 호출
  2. 자신의 내부 상태 초기화 (카운터, 타이머 등)
  3. 기반 클래스의 halt() 호출

4.2 상태 초기화의 완전성

모든 중첩된 데코레이터의 내부 상태가 완전히 초기화되어야 한다. 중간 데코레이터의 초기화가 누락되면 다음 실행에서 잔여 상태가 영향을 미친다.

5. 중첩 깊이 제한

5.1 권장 깊이

데코레이터 중첩은 3단계 이내로 제한하는 것이 권장된다. 그 이상의 중첩이 필요한 경우 서브트리로 분리하여 가독성을 유지한다.

<!-- 3단계 이내: 허용 -->
<Timeout msec="60000">
    <RetryNode num_attempts="5">
        <Delay delay_msec="1000">
            <Action ID="Task"/>
        </Delay>
    </RetryNode>
</Timeout>

<!-- 4단계 이상: 서브트리로 분리 -->
<Timeout msec="60000">
    <SubTree ID="RetryWithDelay"/>
</Timeout>

6. 중첩 데코레이터의 상태 변환 합성

복수의 상태 변환 데코레이터가 중첩되면, 합성 변환 함수가 형성된다.

f_{\text{outer}} \circ f_{\text{inner}}(s) = f_{\text{outer}}(f_{\text{inner}}(s))

합성 결과를 사전에 테이블로 작성하여 검증한다.

참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/

버전날짜변경 사항
v0.12026-04-05초안 작성