[Nest DI] 결합성을 낮춰주는 의존성 주입

손연주·2021년 12월 27일
1
post-custom-banner

의존성 주입이 없을 때

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 예시

하지만, 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를 통해서 인자가 고정되지 않고 매개변수를 활용하여 결합성을 낮춘다.

profile
할 수 있다는 생각이 정말 나를 할 수 있게 만들어준다.
post-custom-banner

2개의 댓글

comment-user-thumbnail
2022년 4월 21일

요즘 express로 작성된 api 서버 레거시를 nest로 마이그레이션하는데 di, ioc 개념이 모호해서 구글링 중 좋은 글 찾다보니 또 선생님 벨로그군요.. 언제까지 저한테 도움만 주실겁니까?! 하트 누르고 갑니다 총총

1개의 답글