모듈이 컨테이너에 건네는 단서
`@Injectable()`이 붙은 클래스는 provider 토큰으로 등록됩니다.
생성자 타입 정보로 `UserService`가 필요하다는 요구를 남깁니다.
controllers와 providers 목록을 묶어 탐색 가능한 범위를 정합니다.
`@Injectable()`과 `providers` 배열은 단순 등록이 아니라 어떤 토큰을 어떤 구현으로 만들지 전달하는 설계도입니다.
`@Injectable()`이 붙은 클래스는 provider 토큰으로 등록됩니다.
생성자 타입 정보로 `UserService`가 필요하다는 요구를 남깁니다.
controllers와 providers 목록을 묶어 탐색 가능한 범위를 정합니다.
컨트롤러 생성자가 요구한 타입을 provider 저장소에서 찾습니다.
서비스가 다른 provider를 필요로 하면 그 의존성까지 먼저 만듭니다.
기본 singleton provider는 한 번 만든 인스턴스를 재사용합니다.
컨트롤러는 구현을 직접 만들지 않고 필요한 계약만 생성자로 드러냅니다.
singleton, 요청 범위 같은 정책은 컨테이너가 인스턴스 보관 방식을 바꾸는 지점입니다.
같은 토큰에 mock provider를 연결하면 컨트롤러 코드는 그대로 둡니다.