728x90

1. 💉 의존성 주입 (Dependency Injection, DI)
**의존성 주입(DI)**은 NestJS의 핵심 철학 중 하나로, 애플리케이션의 구성 요소(Component) 간의 **결합도(Coupling)**를 낮추는 디자인 패턴입니다.
728x90
🤔 왜 DI가 필요한가요?
전통적인 프로그래밍에서는 한 클래스(A)가 다른 클래스(B)의 기능이 필요할 때, A 클래스 내부에서 B 클래스를 직접 생성합니다. 이 경우, A는 B에 강하게 의존하게 됩니다.
문제: B 클래스의 구현이 바뀌면 A 클래스도 수정해야 하며, 단위 테스트 시 B를 분리하여 테스트하기 어렵습니다.
DI는 이 문제를 해결하기 위해, 필요한 의존성(클래스 B)을 외부(NestJS 런타임)에서 주입받는 방식을 사용합니다.
✨ NestJS에서의 DI
NestJS에서 DI의 주체는 주로 **프로바이더(Provider)**입니다.
- 프로바이더: @Injectable() 데코레이터가 붙은 클래스(주로 Service). 이들은 복잡한 비즈니스 로직이나 데이터 처리를 담당합니다.
- 주입: 컨트롤러나 다른 서비스에서 생성자(Constructor)를 통해 필요한 프로바이더를 타입 힌트로 요청하면, NestJS 런타임이 자동으로 해당 인스턴스를 찾아 주입해 줍니다.
$$\text{class MyController} \begin{pmatrix} \text{constructor}(\mathbf{private\;userService: UserService}) \end{pmatrix}$$
- 장점:
- 결합도 감소: 컴포넌트 간의 의존성이 느슨해져 코드 변경의 파급 효과가 줄어듭니다.
- 테스트 용이성: 특정 서비스의 실제 인스턴스 대신 Mock 객체를 쉽게 주입하여 단위 테스트를 독립적으로 수행할 수 있습니다.
2. 🧩 모듈 구조 (Modular Structure)
NestJS는 대규모 애플리케이션의 복잡성을 관리하기 위해 모듈(Module) 시스템을 채택했습니다. 모든 NestJS 애플리케이션은 최소한 하나의 루트 모듈로 시작합니다.
728x90
🏗️ 모듈이란?
모듈은 애플리케이션의 특정 기능 영역을 캡슐화하는 클래스입니다. @Module() 데코레이터를 사용하여 정의하며, 관련된 **컨트롤러(Controller)**와 **프로바이더(Provider)**를 하나의 단위로 묶습니다.
- Exports: 모듈이 제공하는 프로바이더를 다른 모듈에서도 사용할 수 있도록 외부에 **공개(Exports)**할 수 있습니다.
- Imports: 다른 모듈에서 공개된 프로바이더를 사용하려면 해당 모듈을 가져오기(Imports) 해야 합니다.
- Controllers: 해당 모듈이 처리하는 엔드포인트(HTTP 요청)를 정의하는 클래스 목록입니다.
- Providers: 서비스, 저장소(Repository), 팩토리 등 DI 컨테이너에 등록될 수 있는 클래스 목록입니다.
💡 모듈 구조의 장점
- 기능 분리: 사용자 관리(UserModule), 결제(PaymentModule), 게시판(BoardModule) 등 기능별로 코드를 명확하게 분리할 수 있습니다.
- 확장성: 새로운 기능을 추가하거나 기존 기능을 수정할 때, 해당 모듈 내부만 건드리면 되므로 전체 시스템에 미치는 영향이 최소화됩니다.
- 재사용성: 잘 정의된 모듈은 다른 프로젝트나 애플리케이션의 다른 영역에서 쉽게 재사용할 수 있습니다.
이러한 모듈화와 DI 덕분에 NestJS는 Node.js 환경에서 구조적이고 엔터프라이즈급의 애플리케이션을 구축할 수 있도록 돕는 강력한 기반을 제공합니다.
728x90
'Nest.js를 배워보자 > 1. NestJS 시작하기 — 왜 NestJS인가?' 카테고리의 다른 글
| NestJS 프로젝트 생성 및 기본 구조 설명 (0) | 2025.12.02 |
|---|---|
| NestJS와 Express/NestJS 비교: 어떤 것을 선택해야 할까요? (0) | 2025.12.02 |
| NestJS 개요: Node.js 서버 개발의 새로운 표준 (1) | 2025.12.02 |