### **순수 C# 진입점 (Plain C# Entry point)**
- **목표:** `MonoBehaviour`가 아닌 일반 C# 클래스를 애플리케이션 로직의 진입점으로 사용하여, `MonoBehaviour`가 가진 많은 기능(이벤트 처리, 제어 흐름, 도메인 로직 호출 등)으로부터 핵심 로직을 분리하고 단순한 제어 흐름을 구축하도록 돕습니다.
- **구현 방법:** 특정 "마커 인터페이스(marker interface)"를 구현하는 클래스를 VContainer에 등록하면, 해당 클래스의 메서드가 Unity의 `PlayerLoop` 시스템에 스케줄링되어 특정 시점에 자동으로 실행됩니다.
**기본 예시:**
C#
```
class FooController : IStartable // IStartable 인터페이스 구현
{
void IStartable.Start()
{
// Do something...
}
}
// LifetimeScope의 Configure 메서드에서 등록
builder.RegisterEntryPoint<FooController>();
```
- **설명:** `FooController` 클래스는 `IStartable` 인터페이스를 구현합니다. `builder.RegisterEntryPoint<FooController>()`를 통해 이 클래스를 등록하면, `IStartable.Start()` 메서드가 Unity의 `MonoBehaviour.Start()`와 유사한 시점에 자동으로 호출됩니다.
**VContainer 진입점 및 타이밍:**
VContainer는 여러 가지 마커 인터페이스를 제공하며, 각 인터페이스는 Unity의 `PlayerLoop` 주기 내에서 특정 실행 타이밍을 가집니다. 이는 `MonoBehaviour`의 `Awake`, `Start`, `Update`, `FixedUpdate`, `LateUpdate`와 유사한 생명주기 이벤트를 순수 C# 클래스에서 처리할 수 있게 합니다.
|VContainer Entry Point|Timing|
|:--|:--|
|`IInitializable.Initialize()`|컨테이너 빌드 직후|
|`IPostInitializable.PostInitialize()`|`IInitializable.Initialize()` 이후|
|`IStartable.Start()`|`MonoBehaviour.Start()`와 거의 동일|
|`IAsyncStartable.StartAsync()`|`MonoBehaviour.Start()`와 거의 동일 (비동기)|
|`IPostStartable.PostStart()`|`MonoBehaviour.Start()` 이후|
|`IFixedTickable.FixedTick()`|`MonoBehaviour.FixedUpdate()`와 거의 동일|
|`IPostFixedTickable.PostFixedTick()`|`MonoBehaviour.FixedUpdate()` 이후|
|`ITickable.Tick()`|`MonoBehaviour.Update()`와 거의 동일|
|`IPostTickable.PostTick()`|`MonoBehaviour.Update()` 이후|
|`ILateTickable.LateTick()`|`MonoBehaviour.LateUpdate()`와 거의 동일|
|`IPostLateTickable.PostLateTick()`|`MonoBehaviour.LateUpdate()` 이후|
|`IDisposable.Dispose()`|컨테이너 폐기 시 (Singleton / Scoped 라이프타임용)|
Sheets로 내보내기
- **`IAsyncStartable`:** `IStartable`의 비동기 버전으로, `async UniTask StartAsync()`와 같이 비동기 작업을 시작할 수 있습니다. `UniTask`를 사용하는 경우 `VCONTAINER_UNITASK_INTEGRATION` 컴파일러 심볼이 활성화되어야 합니다.
- **예외 처리 (Unhandled Exceptions):**
- 기본적으로 VContainer는 `Start()`, `Tick()` 등에서 발생한 처리되지 않은 예외를 `UnityEngine.Debug.LogException`으로 기록합니다.
- 사용자 정의 예외 처리를 위해 `builder.RegisterEntryPointExceptionHandler(ex => { /* Custom handling */ });`를 등록할 수 있습니다.
- **주의:** `RegisterEntryPointExceptionHandler`를 사용하면 기본 예외 로깅은 건너뛰게 됩니다.
**PlayerLoopSystem 사용의 이점:**
- `PlayerLoopSystem`을 사용하기 때문에, 언제든지 (예: 게임 중간에) 새로운 진입점을 등록해도 Unity의 게임 루프에 정확하게 스케줄링되어 작동합니다.
- 이는 `MonoBehaviour`에 의존하지 않고도 게임의 핵심 로직을 유연하게 제어하고, 도메인 로직과 뷰를 명확하게 분리하는 데 큰 장점을 제공합니다.
### 요약
VContainer의 핵심적인 "순수 C# 진입점" 기능을 소개합니다. 이 기능을 통해 개발자는 `MonoBehaviour`에 묶이지 않고도 Unity의 `PlayerLoop`에 통합되는 생명주기 이벤트를 가진 일반 C# 클래스를 정의하고 등록할 수 있습니다. 이는 코드의 분리, 테스트 용이성, 그리고 아키텍처의 유연성을 크게 향상시키는 데 기여합니다.
---
이전 : [[4.7 Register Callbacks]] | 다음 : [[5.2 UniTask]]