데코레이터 노드의 개념과 정의 (Concept and Definition of Decorator Nodes)

데코레이터 노드의 개념과 정의 (Concept and Definition of Decorator Nodes)

1. 개요

데코레이터 노드(decorator node)는 행동 트리에서 정확히 하나의 자식 노드를 가지며, 해당 자식의 실행 동작이나 반환 상태를 수정하는 단항(unary) 제어 노드이다. 소프트웨어 공학에서의 데코레이터 패턴(Decorator Pattern)에서 유래한 이 개념은, 기존 객체의 코드를 변경하지 않고 새로운 동작을 추가하는 구조적 설계 원칙을 행동 트리에 적용한 것이다. 본 절에서는 데코레이터 노드의 형식적 정의, 행동 트리 내에서의 위치, 다른 노드 유형과의 관계를 다룬다.

2. 형식적 정의

2.1 행동 트리에서의 데코레이터

행동 트리 \mathcal{T}에서 데코레이터 노드 D는 다음과 같이 정의된다.

D : \mathcal{S}_{\text{child}} \rightarrow \mathcal{S}_{\text{parent}}

여기서 \mathcal{S} = \{\text{SUCCESS}, \text{FAILURE}, \text{RUNNING}\}은 노드 상태 집합이다. 데코레이터는 자식의 상태를 입력으로 받아, 변환된 상태를 부모에게 반환하는 상태 변환 함수(state transformation function)로 작용한다.

일반적 상태 변환 규칙

데코레이터의 상태 변환은 자식의 현재 상태뿐만 아니라, 데코레이터 내부 상태(실행 횟수, 경과 시간 등)에도 의존할 수 있다.

s_{\text{parent}}(t) = f(s_{\text{child}}(t), \sigma_D(t))

여기서 \sigma_D(t)는 시점 t에서의 데코레이터 내부 상태이다.

3. 행동 트리 노드 분류에서의 위치

3.1 노드 유형 계층

TreeNode (최상위 기반)
├── ControlNode (제어 노드: 복수 자식)
│   ├── SequenceNode
│   ├── FallbackNode
│   ├── ParallelNode
│   └── ...
├── DecoratorNode (데코레이터 노드: 단일 자식)
│   ├── InverterNode
│   ├── RetryNode
│   ├── TimeoutNode
│   └── ...
└── LeafNode (리프 노드: 자식 없음)
    ├── ConditionNode
    └── ActionNode

데코레이터는 제어 노드와 리프 노드 사이에서 중개자(mediator) 역할을 수행하며, 제어 노드의 복잡성을 증가시키지 않으면서도 세밀한 동작 조정을 가능하게 한다.

3.2 다른 노드 유형과의 비교

특성제어 노드데코레이터 노드리프 노드
자식 수\geq 1 (일반적으로 \geq 2)= 1= 0
역할자식 간 실행 흐름 제어단일 자식의 동작 수정실제 동작 수행
상태 결정복수 자식의 상태 결합단일 자식의 상태 변환자체 평가
예시Sequence, FallbackInverter, RetryAction, Condition

4. 데코레이터의 설계 원칙

4.1 단일 책임

각 데코레이터는 하나의 동작 수정만을 담당한다. 결과 반전, 실행 횟수 제한, 시간 제한 등의 기능은 별도의 데코레이터로 구현하고, 필요 시 중첩하여 조합한다.

4.2 투명성

데코레이터는 자식 노드의 인터페이스를 변경하지 않는다. 자식 노드의 관점에서 데코레이터의 존재 여부에 관계없이 동일하게 동작한다.

4.3 조합 가능성

데코레이터는 다른 데코레이터와 자유롭게 조합할 수 있다. 중첩된 데코레이터는 내부에서 외부 순서로 적용된다.

<Timeout msec="5000">
    <Inverter>
        <Condition ID="IsObstacleDetected"/>
    </Inverter>
</Timeout>

4.4 halt()의 전파

데코레이터가 halt될 때, 자식 노드에도 halt를 전파하여야 한다. 이를 통해 자식 노드가 보유한 리소스를 안전하게 해제하고, 진행 중인 비동기 작업을 취소할 수 있다.

5. 데코레이터 노드의 분류 체계

5.1 상태 변환 기반 분류

분류설명예시
결과 변환자식의 반환 상태를 다른 상태로 변환Inverter, ForceSuccess, ForceFailure
흐름 제어자식의 실행 횟수나 시점을 제어Retry, Repeat, RunOnce, Delay
시간 제어자식의 실행 시간에 제약을 부여Timeout, RateController
조건부 실행특정 조건에서만 자식을 실행KeepRunningUntilFailure, SkipUnlessUpdated

5.2 상태 보존 여부 기반 분류

분류설명예시
무상태 데코레이터내부 상태 없이 즉시 변환Inverter, ForceSuccess
상태 유지 데코레이터내부 상태를 유지하며 동작Retry(횟수), Timeout(시간), Repeat(반복수)

무상태 데코레이터는 자식의 현재 반환값만으로 결과를 결정하며, 상태 유지 데코레이터는 이전 tick의 이력에 따라 동작이 달라진다.

6. BehaviorTree.CPP에서의 구현 인터페이스

class BT::DecoratorNode : public BT::TreeNode
{
public:
    void setChild(TreeNode* child);
    const TreeNode* child() const;
    TreeNode* child();

    virtual void halt() override;
    // halt() 기본 구현: 자식의 halt 호출 후 자신을 IDLE로 설정
};

사용자 정의 데코레이터는 DecoratorNode를 상속하고 tick() 메서드를 구현한다.

7. 참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • Gamma, E., et al. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley.
  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/

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