숏컷 코드
text
Composition Root
-> 의존성 조립이 끝나는 곳
Bootstrap
-> 앱/게임 시작 순서를 여는 곳
둘을 섞으면
-> 초기화 순서와 wiring이 같이 꼬임문법과 예시
composition root는 "누가 무엇을 연결하는가"를 끝내는 지점이다
객체 생성과 연결을 여기저기서 하면 의존 관계가 흐려집니다. composition root는 서비스, 시스템, presenter, runtime entry를 한곳에서 조립하고 "이후부터는 조립이 아니라 실행"이라는 경계를 만드는 지점입니다.
text
BootScene
-> SaveService 생성
-> InventoryService 생성
-> QuestService 생성
-> GameplayEntry에 주입bootstrap은 시작 순서를 여는 runtime entry다
bootstrap은 게임이 켜질 때 무엇을 먼저 준비하고 어떤 씬이나 상태로 넘길지 정합니다. 여기서는 순서와 전환이 핵심이고, 개별 도메인 규칙을 품기 시작하면 bootstrap이 커집니다.
가장 흔한 실패는 조립과 런타임 분기를 한 파일에 다 넣는 것이다
GameBootstrapper가 의존성 생성, 저장 복구, 씬 전환, 로그인 분기, 튜토리얼 분기, 첫 전투 시작까지 전부 맡으면
composition root와 bootstrap이 한 덩어리가 됩니다. 이 상태에서는 테스트도 어렵고 초기화 실패 지점도 찾기 어려워집니다.
조립 경계를 나눌 때 핵심
| 상황 | 더 자연스러운 선택 |
|---|---|
| 객체 생성과 연결을 한 번만 정리하면 될 때 | composition root |
| 앱 시작 순서와 진입 흐름을 열어야 할 때 | bootstrap |
| 조립 후에는 런타임 객체가 직접 협력해야 할 때 | root에서 주입하고 흐름은 외부로 넘김 |
| 시작 파일이 도메인 규칙까지 품기 시작할 때 | bootstrap 축소 후 별도 entry/service로 분리 |
| 어느 시점부터 실행 상태인지 설명이 안 될 때 | 조립 끝나는 지점부터 다시 나눔 |
특이 케이스와 주의할 점
흔한 실패는 composition root를 "전역 서비스 등록기"처럼 계속 재사용하는 것입니다. 조립 지점은 초기 wiring으로 끝내고, 런타임 중간에 또다시 의존성 조립이 퍼지지 않게 막는 편이 안전합니다.
text
실패 예시
- GameplaySystem이 런타임 중간에 ServiceLocator에서 새 서비스를 계속 resolve
- Bootstrapper가 튜토리얼 규칙과 저장 복구 규칙까지 직접 분기
결과
- 조립 경계와 실행 경계가 섞임
- 초기화 순서 버그와 숨은 의존성이 늘어남