원래 프로그램을 제어하는 사람은 개발자들이지만, 프로그램 모두를 관여하여 관리하는 것은 힘듦
→ 제어 역전을 통해 제어권을 제 3자에게 위임
개발자가 제어하지 않고 외부 프로그램이 관리하는 것
필요한 객체를 직접 생성하는 것이 아닌 외부로부터 필요한 객체를 받아서 사용
module 클래스에서 injection할 name과 class를 설정해준다.
providers
[] 안에 특정 키를 생성하지 않고 그냥 등록하게 되면 자동으로 해당 클래스 이름으로 IoC Container에 등록 → 결국 DI를 하기 위해 IoC Container에 등록하는 행위
그렇기 때문에 @Controller에서 Service를 호출해도 문제가 없음
providers에 정의한 키와 useClass에 정의한 값을 통해 IoC Container에 등록되어 사용
@Module({
providers: [
...
// 의존 관계 주입
{
provide: 'BoardRepository', // Set Inject Name
useClass: BoardDiskRepository, // Set Inject Class
},
],
...
})
export class BoardModule {}
@Injectable()
export class BoardService {
constructor(
// IoC container에 등록한 class를 injection
@Inject('BoardRepository') // Injected Name
private readonly _boardRepository: BoardRepositoryInterface, // Injected Class
) {}
createBoard(boardDto: CreateBoardDto): number {...}
getAllBoardList(): BoardEntity[] {...}
}