Nest.js 특징과 장단점
1. Express의 문제점
Node.js 환경에서는 주로 Express를 사용하여 서버 애플리케이션을 개발합니다. Express는 서버 애플리케이션을 개발하기 위한 프레임워크이며, Javascript의 특징을 그대로 살렸기 때문에 매우 유연하게 동작합니다. 하지만, Express의 유연함
은 때로는 단점으로 작용하기도 합니다. 특히, 협업에 있어서는 매우 큰 단점이 되기도 하는데, 그 이유는 다음과 같습니다.
- 정해진 아키텍처 디자인 패턴이 없다. 특히, 협업하는 경우 서로의 코드를 쉽게 이해 가능한 구조로 작성하여야 하는데, 저마다의 코드 작성 스타일이 다를 수 있다는 점에서 매우 큰 단점으로 작용한다.
- 필요한 기능을 직접 구현하여야 한다. 가령, 데이터 유효성 검사 등의 기능은 직접 구현하여야 하며, 안정적인 서비스를 위해 테스트를 진행하여야 한다.
2. NestJS란?
Java Spring의 구조를 차용한 Node.js 환경의 새로운 프레임워크입니다. 이는 MVC 디자인 패턴(Controller
, Service
, Entity
, Repository
등)을 기본 패턴으로 하므로 역할과 구현(또는 책임)이 명확하게 구분된다는 장점이 있습니다. 따라서, 협업 시 매우 효율적으로 작업할 수 있으며, Typescript를 기본으로 적용하므로 잠재적인 오류 발생 확률을 줄일 수 있습니다. 또한, 별도의 cli를 제공하므로 새로운 기능을 추가할 때 직접 코드를 작성하지 않고도 해당 기능에 대한 모듈 구조가 생성됩니다. 이는 NestJS 공식 문서를 참고하여 설치 및 사용할 수 있습니다.
3. 기본 구조 및 역할
Express로 개발한 대부분의 서버 애플리케이션의 구조는 다음과 같으며, 본 글을 참고하시는 분들은 이미 Express를 경험해보신 분들이라고 생각하여 자세한 설명은 생략하겠습니다.
- App : Express 애플리케이션
- Router : 라우터 경로 및 미들웨어 설정
- Controller : 라우터 경로에 따른 모든 비즈니스 로직 처리
- Model : 데이터베이스의 데이터 모델을 객체로 매핑한 모델 객체
반면, NestJS의 기본 구조는 App과 여러 개의 Module로 나눌 수 있으며, 이 둘은 또 다시 다음과 같은 구조로 구성됩니다.
- Module : 특정 기능의 의존성 주입(DI)을 위한 모듈
- Controller : 라우터 경로 및 미들웨어 설정
- Service : 모든 비즈니스 로직 처리
- Entity : 데이터베이스의 데이터 모델을 객체로 매핑한 엔티티
- Repository : 실제 데이터베이스 처리를 담당하는 부분
NestJS의 Controller는 Express의 Router와 같은 역할을 담당하고 있으며, 데이터 유효성 검사 등의 Pipe를 배치시킬 수 있습니다. 여기서 Pipe는 Express의 미들웨어와 비슷한 개념입니다. 또한, NestJS에서 모든 비즈니스 로직 처리는 Service에서 담당하며, 이는 Express의 Controller와 비슷합니다. 단, Express의 Controller에서는 비즈니스 로직 처리와 데이터베이스 처리를 모두 담당하지만, NestJS에서는 각각 Service와 Repository로 구분되어 있습니다.
4. 장점
위의 내용은 매우 간단하게 NestJS의 기본 구조에 대해서 설명한 내용이며, Express에 비해 보다 역할이 세분화되어 있다는 것을 알 수 있습니다. 이와 같이 역할이 세분화되어 있는 경우 장점은 다음과 같습니다.
- 역할에 따른 기능이 명확해진다.
- 기능이 명확해짐에 따라 협업 시 효율적인 개발(역할 분담 등)이 가능하다.
- 기능별로 세분화되어 있으므로 디버깅 및 유지 보수, 신규 기능 개발 시 훨씬 효율적이다.
또한, Typescript와 DTO(Data Transfer Object)를 사용하며, 그와 관련된 라이브러리(@nestjs/mapped-types
, class-validator
, class-transformer
등)를 지원하므로 데이터 유효성 및 타입 검사 시 매우 효율적입니다. 그리고, NestJS 프로젝트 설치 시 TDD 툴(jest
)도 함께 설치되고, 설정된다는 부분 또한 매우 큰 장점인 것 같습니다.
5. 단점
아직까지 NestJS의 단점이라고 할 수 있는 부분은 찾지 못하였지만, 굳이 나열해보자면 다음과 같습니다.
- Express에 비해 정형화된 구조
- Java Spring의 구조를 토대로 한 프레임워크이다보니, DI, IoS 등의 OOP 개념 습득 필요
- Typescript를 기본 언어로 제공하므로 정적 타입에 대한 이해 필요
그러나, 위의 항목을 단점으로 받아들이기 보다는 성장하기 위해 언젠가는 반드시 거쳐야 하는 과정이라고 생각하면 매우 큰 장점이 될 수 있다고 생각합니다.
6. 참고자료
- https://docs.nestjs.com/
- https://nomadcoders.co/nestjs-fundamentals
- https://youtu.be/3JminDpCJNE