인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

양준석님의 프로필 이미지

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

Module, Provider 그리고 Inversion of Control 코드로 이해하기

Resource 마다 Provider를 설정해줘야 하는 이유가 몰까요?

작성

·

65

0

모듈마다 provider를 설정해줘야 되는 장점이 몰까요? 예를 들어 post.service 를 post.controller 에도 쓸수있지만 user.service 에도 post.service를 주입해도 쓸수있는데 그럼 user.module에 또 provider로 post.service를 추가 해야되는건가요? 그냥 IoC에서 등록만하면 되게 하지않았을까요?

답변 2

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

global 하게 한번 등록하시면 중복 등록할 필요 없게 설계 가능합니다.

하지만 그럴경우 어떤 모듈에서 어떤 프로바이더들을 주입하고 있는지 한눈에 보이지 않기 때문에 프로젝트 관리가 어려워질 수 있습니다.

감사합니다!

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 양준석님.

NestJS와 같은 프레임워크에서 모듈 시스템과 의존성 주입(Dependency Injection)은 코드의 구조를 더욱 효율적으로 만드는데 중요한 역할을 합니다. 질문하신 내용과 관련하여, 각 모듈마다 provider를 설정하는 이유에 대해 좀 더 상세하게 설명드리겠습니다.

모듈별 Provider 설정의 이유

  1. 모듈별 독립성: 모듈은 일반적으로 응집력이 높은 단위로 설계됩니다. 즉, 특정 기능이나 리소스와 관련된 서비스, 컨트롤러 등을 하나의 모듈로 묶어서 관리합니다. 이를 통해 모듈 간 결합도를 낮추고 각 모듈의 독립성을 높이며, 유지보수성과 재사용성을 증가시킬 수 있습니다.

  2. 명확한 의존성 관리: 각 모듈에서 필요로 하는 의존성을 명확히 함으로써, 모듈의 책임 범위를 명확하게 하고, 외부 변경으로 인한 영향도 최소화할 수 있습니다.

  3. 테스트 용이성: 독립적인 모듈 구조는 테스트 작성 시 모듈 단위로 독립적으로 테스트하기 쉽도록 합니다.

  4. 자동화된 의존성 주입: NestJS의 IoC(Inversion of Control) 컨테이너는 각 모듈에서 어떤 provider들이 필요한지를 자동으로 주입하는 역할을 합니다. 따라서, 필요한 provider를 명시적으로 지정하지 않으면, 해당 모듈에서 원하는 서비스를 사용할 수 없는 경우가 발생할 수 있습니다.

PostService 사용 예시

만약 PostServiceUserModule에서도 사용하고 싶다면, UserModule에 이 서비스를 추가해야 합니다. NestJS에서 서비스를 다른 모듈에서 사용하려면 그 모듈에 해당 서비스가 exports되어 있어야 하고, 사용하는 모듈에서는 imports를 통해 해당 모듈을 가져와야 합니다.

직접 IoC에서 등록만으로 모든 모듈에서 자유롭게 사용할 수 있도록 하는 방법도 가능합니다만, 그러한 접근은 모듈 간 경계를 모호하게 해서 코드 관리와 유지보수를 어렵게 할 수 있습니다.

더 나은 이해를 위해 아래의 게시글들을 참고해 보시면 좋을 것 같습니다:
- AuthService를 주입 받지 못하는 이유를 모르겠어요
- 포스트 컨트롤러에서 UseGuard를 추가하면 디펜던시 에러가 나타납니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.