1. IoC (Inversion of Control)

원래 프로그램을 제어하는 사람은 개발자들이지만, 프로그램 모두를 관여하여 관리하는 것은 힘듦

→ 제어 역전을 통해 제어권을 제 3자에게 위임

개발자가 제어하지 않고 외부 프로그램이 관리하는 것

2. DI (Dependency Injection)

필요한 객체를 직접 생성하는 것이 아닌 외부로부터 필요한 객체를 받아서 사용

3. Nest.js

module 클래스에서 injection할 name과 class를 설정해준다.

@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[] {...}
}

Reference