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 개념이 모호해서 구글링 중 좋은 글 찾다보니 또 선생님 벨로그군요.. 언제까지 저한테 도움만 주실겁니까?! 하트 누르고 갑니다 총총