• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

DI(의존성 주입)을 왜 해야하나요?

22.10.10 21:07 작성 조회수 245

1

cats.service.ts 파일

import { Injectable } from '@nestjs/common';

@Injectable()
export class CatsService {
  getAllCats(): string {
    return 'get all cats1';
  }
}

export const getAllCatsTest = () => {
  return 'get all cats2';
};

 

cats.controller.ts 파일

import { CatsService } from './cats.service';
import * as catsService2 from './cats.service';
import {
  Controller,
  Get,
} from '@nestjs/common';

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

  @Get()
  getAllCat() {
    return this.catsService.getAllCats();
  }

  @Get('2')
  getAllCat2() {
    return catsService2.getAllCatsTest();
  }
}

 

 

Dependency Injection을 사용해야하는 이유가 명확히 이해가 안됩니다.

 

A라는 클래스에서 B라는 클래스를 인스턴스화 (new 키워드 사용) 했을 때,

A클래스가 B클래스에 대해서 의존성이 발생하고

만약에 B 클래스의 수정점이 발생한다면, A클래스도 수정해줘야하는 부분은 인지를 했습니다.

 

그런 경우에 변화를 유연하게 대응하기 위해 A클래스에서 직접 인스턴스화를 하는것이 아니라,

인스턴스화된 클래스를 주입받아 사용만 하는걸 Dependency Injection(의존성 주입)으로 이해했습니다.

 

하지만, import해서 쓰면 되는걸 왜 굳이 의존성주입이라는 형태로 사용해야하는지 이해를 못했습니다.

 

제가 위에 예시로 작성한 service 파일과 controller를 보시면,

getAllCat()는 의존성 주입해서 사용한거고, getAllCat2는 import한 서비스를 사용한겁니다.

 

어떠한 이유에서 의존성 주입의 개념을 사용해야하는지 명쾌하게 알고 싶습니다.

 

 

답변 1

답변을 작성해보세요.

0

조교C님의 프로필

조교C

2023.02.19

안녕하세요 :)
답변 드립니다. 더 궁금하신 점 있으시면 언제든지 답글 달아주세요!

어떠한 이유에서 의존성 주입의 개념을 사용해야 하는지 명쾌하게 알고 싶습니다.
-> 일단 이것을 알기 위해서 한 문장으로 명쾌히 설명할 수 없습니다. Spring 프레임워크의 IoC 와 DI 를 이해하셔야 하며 이는 추가로 검색을 통해 학습하시길 바랍니다.

밑에는 제 개인적인 의견입니다.

1. nodejs는 express로 백엔드를 만들어왔습니다. 많은 장점이 있었지만, 단점도 많았습니다. 그 중 장점이자 단점인 것이 있었는데, 바로 "자유롭다"입니다.

2. 자유롭다 보니 설계패턴, 디자인패턴, 구현방식 등 개발이 다 제각각이다 보니 (보안도 안좋기도 합니다.) 엔터프라이즈 백엔드로 크지 못한 이유가 여기에 있습니다.

3. 그렇기 때문에 엔터프라이즈 급 백엔드인 Spring의 설계 + TS + 구글의 앤터프라이즈 프레임워크 Angular 의 좋은 점들을 조합하여 NestJS를 만들었습니다.

4. 여기서 Spring의 IoC 와 DI 를 좀 배껴온 것 같습니다.

5. IoC 랑 DI 를 통해서 NestJS 에 provider 들을 관리하는 컨테이너를 띄우고 싱글턴 패턴을 활용해서 컨테이너에 인스턴스들을 등록합니다.

6. 정리하자면 각 인스턴스들을 여러개 띄우는 것이 아니라 싱글턴 패턴으로 일관성을 유지하고 이들의 관계를 module 로 컨테이너가 관리함으로써 엔터프라이즈 백엔드로 (큰 규모의 백엔드) 설계를 할 수 있도록 한 것입니다.