NestJS
-
Java Spring의 구조를 차용한 노드(Node.js) 환경의 새로운 프레임워크이다.
-
이는 MVC 디자인 패턴(컨트롤러(Controller), 서비스(Service), 엔티티(Entity), 리포지토리(Repository) 등)을 기본 패턴으로 하므로 역할과 구현(또는 책임)이 명확하게 구분된다는 장점이 있다.
-
따라서, 협업 시 매우 효율적으로 작업할 수 있으며, 타입스크립트(TypeScript)를 기본으로 적용하므로 잠재적인 오류 발생 확률을 줄일 수 있다.
-
NestJS의 경우 타입스크립트(TypeScript)의 인터페이스(Interface)보다 클래스(class)를 더 많이 사용한다.
-
이유는 인터페이스(Interface)의 경우 런타임(runtime)에 자바스크립트로 존재하지 않고 타입스크립트(TypeScript)에서만 존재하기 때문에 때문에 런타임(runtime)에서도 존재하는 클래스(class)를 더 많이 사용한다.
-
또한, 별도의 Nest CLI를 제공하므로 새로운 기능을 추가할 때 직접 코드를 작성하지 않고도 해당 기능에 대한 모듈 구조가 생성된다.
Express의 문제점
-
노드(Node.js) 환경에서는 주로 Express를 사용하여 서버 애플리케이션을 개발한다.
-
Express는 서버 애플리케이션을 개발하기 위한 프레임워크이며, 자바스크립트의 특징을 그대로 살렸기 때문에 매우 유연하게 동작한다.
-
하지만, Express의 유연함은 때로는 단점으로 작용하기도 한다.
-
특히, 협업에 있어서는 매우 큰 단점이 되기도 하는데, 그 이유는 다음과 같다.
-
정해진 아키텍처 디자인 패턴이 없다.
-
특히, 협업하는 경우 서로의 코드를 쉽게 이해 가능한 구조로 작성하여야 하는데, 저마다의 코드 작성 스타일이 다를 수 있다는 점에서 매우 큰 단점으로 작용한다.
-
필요한 기능을 직접 구현하여야 한다. 가령, 데이터 유효성 검사 등의 기능은 직접 구현하여야 하며, 안정적인 서비스를 위해 테스트를 진행하여야 한다.
Class vs Interface
- 클래스(class)를 인터페이스(Interface)에 비해 훨씬 많이 사용한다.
- 이는 NestJS의 경우도 노드(Node.js)의 프레임워크이기 때문에 타입스크립트(TypeScript) 관점으로 생각해 보았을때, 일반 바닐라 자바스크립트의 경우 런타임(runtime)에 인터페이스(Interface)가 없으므르 클래스(class)로 선언하는 방법을 주로 많이 사용한다.
NestJS의 기본 구조 및 역할
- NestJS의 기본 구조는 App과 여러 개의 Module로 나눌 수 있으며, 이 둘은 또 다시 다음과 같은 구조로 구성된다.
NestJS 모듈(module)
- 특정 기능의 의존성 주입(Dependency Injection)을 위한 모듈이다.
컨트롤러(Controller)
- 라우터 경로 및 미들웨어 설정이다.
서비스(Service)
- 모든 비즈니스 로직 처리한다.
엔티티(Entity)
- 데이터베이스(DataBase)의 데이터 모델(Model)을 객체(Object)로 매핑한 엔티티이다.
리포지토리(Repository)
-
실제 데이터베이스(DataBase) 처리를 담당하는 부분이다.
-
NestJS의 컨트롤러(Controller)는 Express의 express.Router()와 같은 역할을 담당하고 있으며, 데이터 유효성 검사 등의 파이프(Pipe)를 배치시킬 수 있다.
-
또한, NestJS에서 모든 비즈니스 로직 처리는 서비스(Service)에서 담당하며, 이는 Express의 컨트롤러(Controller)와 비슷하다.
-
단, Express의 컨트롤러(Controller)에서는 비즈니스 로직 처리와 데이터베이스(DataBase) 처리를 모두 담당하지만, NestJS에서는 각각 서비스(Service)와 리포지토리(Repository)로 구분되어 있다.
장점
-
역할에 따른 기능이 명확해진다.
-
기능이 명확해짐에 따라 협업 시 효율적인 개발(역할 분담 등)이 가능하다.
-
기능별로 세분화되어 있으므로 디버깅 및 유지 보수, 신규 기능 개발 시 훨씬 효율적이다.
-
또한, 타입스크립트(TypeScript)와 DTO(Data Transfer Object)를 사용하며, 그와 관련된 라이브러리(@nestjs/mapped-types, class-validator, class-transformer 등)를 지원하므로 데이터 유효성 및 타입 검사 시 매우 효율적이다.
-
그리고, NestJS 프로젝트 설치 시 TDD 툴(Jest)도 함께 설치되고, 설정된다는 부분 또한 매우 큰 장점이다.
단점
- Express에 비해 정형화된 구조를 가진다.
- Java Spring의 구조를 토대로 한 프레임워크이다보니, DI, IoS 등의 OOP 개념 습득 필요하다.
- Typescript를 기본 언어로 제공하므로 정적 타입에 대한 이해 필요하다.