@Injectable과 providers 배열은 어떤 토큰을 어떤 구현으로 만들지 알려준다
컨테이너는 생성자 타입 정보를 읽고 provider 저장소에서 필요한 인스턴스를 찾아 주입한다.
| 단계 | 컨테이너가 하는 일 | 효과 | 테스트에서 바꾸는 지점 |
|---|---|---|---|
| 01 Token조회 | 생성자가 요구한 UserService 타입을 provider 저장소에서 찾음 | 컨트롤러는 구현 생성 책임을 모름 | 같은 토큰에 mock 연결 |
| 02 Resolve재귀 해결 | 서비스가 필요한 다른 provider를 먼저 준비 | 의존성 그래프를 컨테이너가 관리 | 빠진 provider가 조립 단계에서 드러남 |
| 03 Inject인스턴스 주입 | 기본 singleton provider를 만들어 재사용 | 수명 주기 정책을 코드 밖에서 조정 | request scope나 override 정책 확인 |
핵심: 컨트롤러는 필요한 계약만 생성자로 드러내고, 컨테이너가 생성·주입·수명 주기를 맡는다.