inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

탄탄한 백엔드 NestJS, 기초부터 심화까지

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

563

작성자 없음

작성한 질문수 0

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한 서비스를 사용한겁니다.

 

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

 

 

express nodejs mongodb NestJS ssr

답변 1

0

조교C

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

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

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

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

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

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

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

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

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

프로젝트 환경 세팅할 때 최신 노드 버젼을 사용하시는 분들은 참고하셔도 좋을 것 같아요~

2

80

1

DTO에 대한 질문

1

87

2

백엔드 MVC에서 View의 역할은 무엇인가요?

1

93

2

추가 업데이트 관련 건

0

90

2

nest js 버전문제

0

79

2

mongdb 스키마 공식 문서와 형태가 다른 이유 궁금합니다.

0

103

1

라인 끝에 에러 표시(eslint) 때문에 구글 찾아 보니.

0

74

1

전체 고양이 조회 라우터 중 error.message 오류

0

67

1

캡슐화 추가 설명 중 단일책임원칙 관련 질문

0

104

0

42강 고양이끼리 소통 댓글 구현 중 Schema hasn't been registered for model 'comments' 에러 해결

0

81

1

채팅 이슈

0

133

1

모듈이 더 이상 지원하지 않는답니다

0

206

1

오류가 있습니다

0

106

1

import 에서 오류가 납니다

0

127

1

이런 오류가 나옵니다

0

100

1

에러가 발생합니다

0

109

1

프론트 에러 뜨는데 수정 안해주시나요

0

156

1

emit() broadcast.emit() 질문있습니다

0

101

1

서버연결이 안됩니다.

1

403

1

[PM2][ERROR] Command not found

0

519

1

S3에 업로드까지는 성공했는데 사진이 나오지 않습니다.

0

248

1

error_code : Property 'user' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.ts(2339)

0

601

1

jwt를 따로 연습하고 있는데 env를 못읽는 것 같습니다.

0

322

2

Ec2로 안하시는 이유가 있을까요?

0

343

1