데코레이터 노드의 조합 패턴 (Decorator Node Combination Patterns)
1. 개요
데코레이터 노드의 조합 패턴은 복수의 데코레이터를 중첩하여 더 복잡한 실행 정책을 구현하는 설계 패턴이다. 각 데코레이터는 단일 기능을 담당하며, 이들을 계층적으로 조합함으로써 시간 제한 + 재시도, 반복 + 실패 무시, 지연 + 행동 등의 복합 동작을 표현한다.
2. 조합의 원리
2.1 중첩 순서
데코레이터의 중첩에서 외부 데코레이터가 먼저 tick되고, 내부 데코레이터를 자식으로 tick한다. 따라서 외부 데코레이터의 정책이 우선 적용된다.
<Outer>
<Inner>
<Action ID="Task"/>
</Inner>
</Outer>
Outer가 먼저 평가되며, Outer의 조건이 충족되면 Inner를 tick하고, Inner의 조건이 충족되면 Task를 tick한다.
3. 주요 조합 패턴
3.1 Timeout + Retry: 시간 제한 재시도
<Timeout msec="60000">
<RetryNode num_attempts="5">
<Action ID="DownloadMap"/>
</RetryNode>
</Timeout>
전체 60초 이내에서 최대 5회 재시도한다. Timeout이 외부이므로, 재시도 중이라도 60초가 경과하면 전체가 halt된다.
3.2 Retry + Delay: 지연을 포함한 재시도
<RetryNode num_attempts="3">
<Delay delay_msec="2000">
<Action ID="ConnectToServer"/>
</Delay>
</RetryNode>
각 재시도 사이에 2초 간격을 둔다.
3.3 Repeat + ForceSuccess: 실패 무시 반복
<Repeat num_cycles="10">
<ForceSuccess>
<Action ID="TryScan"/>
</ForceSuccess>
</Repeat>
스캔이 실패해도 10회 반복을 완료한다.
3.4 Timeout + Repeat: 시간 제한 반복
<Timeout msec="300000">
<Repeat num_cycles="-1">
<Action ID="PatrolWaypoint"/>
</Repeat>
</Timeout>
5분 동안 순찰을 무한 반복한다.
3.5 Inverter + Retry: 성공할 때까지 반복 (역 Retry)
<Inverter>
<RetryNode num_attempts="10">
<Inverter>
<Action ID="WaitForEvent"/>
</Inverter>
</RetryNode>
</Inverter>
WaitForEvent가 SUCCESS를 반환할 때까지 최대 10회 반복한다. 내부 Inverter가 SUCCESS를 FAILURE로 변환하여 Retry를 트리거하고, 외부 Inverter가 최종 결과를 다시 반전한다.
3.6 RunOnce + Retry: 초기화 재시도 후 캐싱
<RunOnce>
<RetryNode num_attempts="3">
<Action ID="InitializeSensor"/>
</RetryNode>
</RunOnce>
센서 초기화를 최대 3회 재시도하고, 결과를 캐싱하여 이후에는 재실행하지 않는다.
4. 다중 중첩 규칙
4.1 중첩 깊이 권장
데코레이터 중첩은 2~3단계 이내로 제한하는 것이 가독성 측면에서 바람직하다. 3단계를 초과하면 서브트리로 분리한다.
4.2 중첩 순서의 의미론
| 외부 | 내부 | 의미 |
|---|---|---|
| Timeout | Retry | 전체 시간 내에서 재시도 |
| Retry | Timeout | 각 시도에 시간 제한 |
| Repeat | ForceSuccess | 실패 무시하고 반복 |
| ForceSuccess | Repeat | 반복 전체 실패를 무시 |
외부-내부 순서에 따라 의미가 완전히 달라지므로 주의하여야 한다.
5. 설계 시 고려 사항
5.1 halt 전파의 올바름
다중 중첩 데코레이터에서 halt가 발생하면, 외부에서 내부로 순차적으로 전파되어야 한다. 각 데코레이터의 halt()가 올바르게 자식의 halt를 호출하는지 검증하여야 한다.
5.2 상태 변환의 합성 결과 예측
복수의 상태 변환 데코레이터가 중첩되면, 합성 변환 결과가 직관적이지 않을 수 있다. 변환 테이블을 작성하여 각 입력에 대한 최종 출력을 사전에 확인한다.
6. 참고 문헌
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-05 | 초안 작성 |