모듈형 및 확장 가능한 서비스 구조 설계 방법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
백엔드 엔지니어 및 NestJS를 사용하는 생산 시스템 개발자.
난이도: 중급 이상 (NestJS 프레임워크 경험 필요)
핵심 요약
- 모듈 기반 구조 :
@Injectable()
을 사용한 서비스 분리와feature-based
디렉토리 구조(/payments
,/users
)로 확장성 향상 - 의존성 주입(DI) 최적화 :
SharedModule
을 통해 공통 서비스(logging.interceptor.ts
,current-user.decorator.ts
) 중복 제거 - NestJS 모듈 역할 :
exports
설정으로 외부 모듈 접근 제어,providers
정의로 의존성 명시적 관리
섹션별 세부 요약
1. 기능 중심 디렉토리 구조
/src/payments/
디렉토리 내payment.controller.ts
,payment.service.ts
,payment.module.ts
파일을 병렬로 배치- 관련된 컨트롤러, 서비스, 모듈 파일을 함께 배치하여 수평 확장성 향상
- 예:
@Injectable()
으로 정의된PaymentService
는TransactionService
,WalletService
를 의존성 주입
2. 컨트롤러와 서비스 역할 분리
- 컨트롤러는 HTTP 요청 처리에 집중, 서비스는 비즈니스 로직 처리
processPayment()
메서드는walletService.debit()
과transactionService.record()
를 호출하며 분리된 서비스 사용
3. 모듈의 시야 제어 기능
UserModule
에서exports: [UserService]
설정으로 외부 모듈에 노출@Module({ providers: [UserService], exports: [UserService] })
구조로 의존성 제어
4. 의존성 주입(DI) 시스템 활용
SharedModule
을 통해 공통 인터셉터, 데코레이터, 파이프 사용 (예:shared/logging.interceptor.ts
)- 수동 인스턴스화 대신
constructor
주입 사용, 의존성 명시적 정의
5. 실무 적용 시 고려사항
@Injectable()
과@Module()
사용으로 아키텍처 패턴 준수SharedModule
을 통해 중복되는 인프라 코드 분리- NestJS의 DI 시스템을 통해 테스트 가능하고 확장 가능한 코드베이스 구축
결론
- NestJS의
feature-based
모듈 구조와SharedModule
활용으로 확장성과 유지보수성을 동시에 달성 - 의존성 주입과
@Injectable()
사용으로 테스트 가능하고 모듈 간 결합도 낮춘 설계 exports
설정과providers
정의로 모듈 간 의존성 명시적 관리하여 생산성 향상