NestJS를 통한 일관적인 시스템 설계
서론
기존의 API 서버를 만들면서 기능 구현에만 급급하다 보니 제대로된 코드 분리나 정리를 따로 하지 않았습니다.
앞으로의 확장성과 유지보수성을 위해 NestJS가 기본적으로 가지고 있는 의존성 주입 패턴과 주로 사용되는 디자인 패턴들에 대해 학습해보고자 합니다.
본론
NestJS의 Dependency Injection
기본적으로 NestJS는 의존성 주입을 따르는 디자인 패턴으로 만들어져 있습니다.
의존성 주입은 특정한 클라이언트가 외부로 부터 의존성을 주입 받고, 그렇게 받아온 의존성을 통해서 외부의 서비스에 접근하는 방식을 의미합니다.
image.png
이를 통해 각 코드별 결합도가 감소하며, mock과 같은 데이터를 주입해서 테스트를 쉽게 진행할 수 있습니다.
나아가 서비스를 외부에서 주입 받기에 같은 서비스를 여러 코드에서 재활용할 수 있고 수정 및 유지보수성도 확장됩니다.
의존성 주입을 하는 방식은 크게 아래와 같습니다.
- Initializer - 초기화 시 의존성 주입
- Setter - Setter를 통해서 의존성 주입
- Interface - 의존성 Interface를 채택해서 의존성 주입
- DI Container - 의존성 관리를 위한 외부의 의존성 컨테이너로 의존성 주입
NestJS는 이런 DI 패턴이 적용되어 설계 됐습니다. Module에서 의존성을 주입 받을 서비스를 providers로 등록하고, 컨트롤러를 등록하면 해당 모듈에 주입된 서비스들을 내부 컨트롤러에서 활용할 수 있게됩니다.
- Controller에서 constructor의 매개변수로 서비스를 불러오면 의존성을 주입 받아 사용할 수 있습니다,
constructor(private readonly {${이름}: ${서비스}) {}
이렇게 서비스, 컨트롤러를 하나의 모듈로 묶을 수 있고, 모듈을 서로 다른 모듈에서 imports를 통해 불러와 사용할 수 있게 됩니다.
결론
Nest를 통해 보다 분리된 서비스를 구축하고, DDD를 편하게 적용할 수 있음을 파악할 수 있었습니다.
참고자료
https://roothyo.tistory.com/56?category=1034781
https://roothyo.tistory.com/57
https://velog.io/@jeon0976/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-DIDependency-Injection-Pattern-2-DI-Pattern-%EC%82%AC%EC%9A%A9%EB%B2%95
https://velog.io/@zvoniti/NestJS-Design-Pattern
https://medium.com/@jang.wangsu/di-dependency-injection-%EC%9D%B4%EB%9E%80-1b12fdefec4f
Subscribe to Liboo.blog
Get the latest posts delivered right to your inbox