import { Controller, Get, Post } from '@nestjs/common';
import { AppService } from './app.service';
@Controller('abc')
export class AppController {
constructor(private readonly appService: AppService) {}
@Get('hello')
getHello(): string {
return new AppService().getHello();
이미 코드에 return 값이 new AppService().getHello()로 고정되어있기 때문에, 테스트를 하려면 return값을 new TestAppService().getHello();로 변경해야 되는 번거로움이 있다.
또한 객체를 내부에서 만들어서 부모 객체에 의존하기 때문에 결합성이 강해져 단일 책임분리에 어긋난다. 따라서 DI를 활용해 객체를 밖에서 만들어 넘겨줌으로써 결합성을 낮춰줄 수 있다.
하지만, DI를 적용해서 this.appService.getHello()를 쓴다면
import { Controller, Get, Post } from '@nestjs/common';
import { AppService } from './app.service';
import { TestAppService } from './app.service';
@Controller('abc')
export class AppController {
constructor(private readonly appService: AppService) {}
@Get('hello')
getHello(): string {
return this.appService.getHello();
}
new AppController(new AppService()); // 실제 환경
new AppController(new TestAppService()); // 테스트 환경
이런 식으로 코드를 작성하여 환경에 따라 테스트 할 수 있다. 코드의 재사용성과 활용성이 높아지는 장점이 있다.
function a (b,c) {
return b + c;
}
조금 더 쉬운 예를 들자면, DI를 적용하지 않은 코드는
b + c가 아닌 5 + c로 고정된 값을 받는 것과 같다.
this.appService...는 매개변수와 같은 역할을 해준다.
DI를 통해서 인자가 고정되지 않고 매개변수를 활용하여 결합성을 낮춘다.
요즘 express로 작성된 api 서버 레거시를 nest로 마이그레이션하는데 di, ioc 개념이 모호해서 구글링 중 좋은 글 찾다보니 또 선생님 벨로그군요.. 언제까지 저한테 도움만 주실겁니까?! 하트 누르고 갑니다 총총