Retry의 모든 재시도 실패 시 반환 (Retry’s Return When All Attempts Fail)
1. 개요
Retry 데코레이터가 지정된 최대 재시도 횟수를 모두 소진하였음에도 자식이 SUCCESS를 반환하지 못한 경우, Retry는 최종적으로 FAILURE를 반환한다. 이 최종 FAILURE는 “모든 재시도를 시도하였으나 성공하지 못하였다“는 의미를 가지며, 상위 제어 구조에서 복구 전략이나 대체 행동으로의 전환을 유발한다.
2. 최종 FAILURE 반환의 조건
2.1 정형적 정의
f_{\text{Retry}}(\text{FAILURE}, k, N) = \text{FAILURE} \quad \text{if } k \geq N
재시도 카운터 k가 최대 횟수 N에 도달하고, 마지막 시도의 자식이 FAILURE를 반환하면, Retry는 FAILURE를 반환하고 카운터를 리셋한다.
시퀀스 예시 (num_attempts=3)
시도 1: Child → FAILURE (k=1)
시도 2: Child → FAILURE (k=2)
시도 3: Child → FAILURE (k=3, k≥N)
→ Retry = FAILURE (최종)
최종 FAILURE의 상위 전파
Retry의 FAILURE는 부모 노드에 전달되어 행동 트리의 제어 흐름에 영향을 미친다.
Sequence 내 Retry
<Sequence>
<RetryNode num_attempts="3">
<Action ID="ConnectToSensor"/>
</RetryNode>
<Action ID="ReadSensorData"/>
</Sequence>
Retry가 FAILURE → Sequence가 FAILURE → ReadSensorData는 실행되지 않음.
Fallback 내 Retry
<Fallback>
<RetryNode num_attempts="3">
<Action ID="PrimaryMethod"/>
</RetryNode>
<Action ID="FallbackMethod"/>
</Fallback>
Retry가 FAILURE → Fallback이 FallbackMethod를 시도 → 대체 방법 실행.
ReactiveSequence 내 Retry
<ReactiveSequence>
<Condition ID="IsSystemActive"/>
<RetryNode num_attempts="5">
<Action ID="PerformTask"/>
</RetryNode>
</ReactiveSequence>
Retry가 FAILURE → ReactiveSequence가 FAILURE → 상위 노드에서 처리.
최종 FAILURE 후의 복구 패턴
패턴 1: Fallback에 의한 대체 행동
<Fallback>
<RetryNode num_attempts="3">
<Action ID="ConnectViaPrimary"/>
</RetryNode>
<RetryNode num_attempts="3">
<Action ID="ConnectViaBackup"/>
</RetryNode>
<Action ID="ReportConnectionFailure"/>
</Fallback>
주 연결 3회 재시도 실패 → 백업 연결 3회 재시도 → 이마저도 실패 → 연결 실패 보고.
패턴 2: 상위 Retry에 의한 전체 재시도
<RetryNode num_attempts="2">
<Sequence>
<Action ID="ResetSystem"/>
<RetryNode num_attempts="3">
<Action ID="InitializeSensor"/>
</RetryNode>
</Sequence>
</RetryNode>
내부 Retry가 3회 실패 → 시스템 리셋 후 다시 3회 재시도 → 총 6회 시도.
패턴 3: 실패 로깅 후 계속 진행
<Sequence>
<ForceSuccess>
<RetryNode num_attempts="3">
<Action ID="OptionalSetup"/>
</RetryNode>
</ForceSuccess>
<Action ID="MainAction"/>
</Sequence>
선택적 설정이 3회 모두 실패하더라도, ForceSuccess에 의해 MainAction이 실행된다.
설계 시 고려 사항
FAILURE의 의미론
Retry의 최종 FAILURE는 단순한 1회 실패와 의미론적으로 구분된다. 이는 “지정된 횟수만큼 시도하였으나 해결되지 않은 실패“를 나타내므로, 상위 구조에서 더 강력한 복구 전략을 적용하거나 운용자에게 알림을 발행하는 것이 적절하다.
실패 정보의 보존
최종 FAILURE 반환 시, 어떤 오류로 인해 실패하였는지의 정보를 블랙보드에 기록하면 상위 노드에서 적절한 복구 전략을 선택하는 데 활용할 수 있다.
재시도 후 상태 정리
모든 재시도가 실패한 후, 자식 행동이 남긴 부분적 상태(열린 파일, 활성화된 서비스 등)를 정리하는 것이 중요하다. 이를 위해 ForceSuccess로 감싼 정리 행동을 Retry 후에 배치할 수 있다.
참고 문헌
- 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-04 | 초안 작성 |