세이프티 넷 (Resolve 1회 복구)
MasterInstaller와 SceneInstaller의 Resolve 는 내부적으로 같은 패턴을 씁니다.
딕셔너리에 키가 없을 때 조건부로 한 번 베이크 리스트에서 런타임 맵을 다시 만들고, 같은 키로 재조회합니다.
플래그 의미
-
_safetyNetArmed == true— 다음 조회에서 미스가 나면 재구성을 1회 시도할 수 있습니다. -
재구성을 한 번 시도한 직후
false로 바뀝니다. -
그 상태에서 같은 키가 또 없으면 추가 재구성 없이
null을 반환합니다.
즉 연속 미스마다 재구성 루프에 빠지지 않도록 제한합니다.
재정비 (true Again)
다음 케이스 중 하나가 발생하면 다시 true 가 됩니다.
-
RebuildRuntimeRegistry/RebuildSceneRegistry가 호출될 때 (직렬화 리스트 기반 전체 재구성 진입점). -
Register(Component)가 호출될 때 — 런타임에 맵이 바뀌었으므로 다음 미스에서 다시 한 번 복구 기회를 줍니다.
ObjectInstaller의 ResolveInternal 은 이 플래그를 쓰지 않고,
씬·전역 싱글톤의 Resolve에 위임할 때 상대 스코프의 세이프티 넷이 적용됩니다.
어디에 적용되나
-
MasterInstaller—_runtimeRegistry조회 경로 (ResolveByKey). -
SceneInstaller—_sceneRegistry조회 경로.
Object Installer에 안전망이 없는 이유
ObjectInstaller._localRegistry 에는 세이프티 넷이 없습니다.
로컬에 없으면 곧바로 상위 Resolve로 넘어갑니다.
기대 효과·한계
-
부트 순서나 첫 프레임에서 맵이 아직 비어 있는 타이밍에 첫
Resolve가 실패하는 엣지 케이스를 완화합니다. -
애초에 등록되지 않은 타입에 대해서는 재구성해도 없으면 두 번째도
null입니다. 근본 원인은 등록·베이크·스코프 선택입니다.
당연하게도, 등록되지 않은 타입에 대해서는 재구성을 시도해도 계속해서 null 입니다.
// 첫 Resolve가 빈 맵 타이밍을 만나면 1회 재빌드 후 재시도될 수 있음
// 두 번째도 없으면 null — 매니저 배치·Refresh·Register를 점검