NestJS란?
NestJS(Nest)는 Node.js 서버 애플리케이션을 구축하기 위한 프레임워크이다.
- 내부적으로 HTTP 서버 프레임워크인 Express를 사용하며, 선택적으로 Fastify 프레임워크를 사용할 수도 있다.
- 데이터베이스, ORM, Configuration, 유효성 검사 등의 기능들을 기본적으로 내장하고 있다.
- IoC(Inversion of Control, 제어역전), DI(Dependency Injection, 의존성 주입), AOP(Aspect Oriented Programming, 관점지향 프로그래밍)과 같은 객체지향 개념 도입하였다.
- 필요에 따라 라이브러리를 설치할 수 있다.
- 모듈과 컴포넌트를 기반으로 프로그램을 만들어, 재사용성을 높여준다.
- 타입스크립트를 기본적으로 사용하고, 자바스크립트도 사용 가능하다.
NestJS의 철학, 등장 배경
NestJS의 공식 문서에서 소개하는 NestJS의 철학은 다음과 같다.
Node와 서버사이드 자바스크립트를 위한 많은 라이브러리와 도구들이 존재하지만, 아키텍쳐
라는 중요한 문제를 효과적으로 해결해준 것은 없다.
Nest는 테스트 가능하고 확장 가능하며 느슨하게 결합되고 쉽게 유지관리할 수 있는 애플리케이션을 만들 수 있도록 즉시 사용 가능한 애플리케이션 아키텍쳐를 제공한다.
Nest는 이런 문제점에 의문을 제기하고 등장했다고 한다. 즉, 아키텍쳐
라는 문제를 해결하기 위해 Nest가 등장했다고 볼 수 있다.
NestJS와 Express
많은 개발자들이 Express를 사용하고 있는데도, NestJS가 등장한 이유는 무엇일까?
NestJS와 비교되는 Express의 특징은 다음과 같다.
- 애플리케이션 개발 시 아키텍쳐의 자유도가 높다.
- 아키텍쳐의 자유도가 높기 때문에 다양한 라이브러리, 툴, 미들웨어 등을 마음껏 선택할 수 있다.
하지만 이런 Express의 특징 때문에 생기는 Express의 단점이 존재한다.
- 아키텍쳐의 자유도가 높지만 필요한 라이브러리를 검토하고 적용하기 위한 시간이 필요하다.
- 개발자들의 개성, 편의에 따라 수많은 종류의 아키텍쳐가 생길 수 있다.
- 이것은 애플리케이션 아키텍쳐의 통일성을 떨어뜨린다
- 이로 인해 프로젝트 규모가 커질수록 협업 과정에 드는 소통 비용이 증가한다.
- 이로 인해 생산성이 저하되고 유지 보수가 어려워진다.
NestJS의 특징은 다음과 같다.
- 백엔드 서버 애플리케이션이 필수적으로 갖춰야 할 기능을 기본적으로 내장하고 있다.
- 원하는 기능이 없다면 라이브러리를 추가 설치해서 적용할 수 있다.
- Controller, Service, Module 아키텍쳐로 구성된다.
- 기본적인 아키텍쳐를 제공하기 때문에 아키텍쳐의 통일성이 있어 생산성이 향상된다.
- 의존성 주입, 제어 역전, 모듈을 사용한 구조화 등을 통해 생산성이 향상된다.
- 타입스크립트를 기본적으로 지원하므로 오류를 사전에 방지할 수 있다.
- 여러 모듈들로 애플리케이션이 구성되기 때문에 모듈마다 독립적인 유닛 테스트를 쉽게 작성할 수 있다.
정리
NestJS는 즉시 사용 가능한 애플리케이션 아키텍쳐를 제공한다라는 NestJS의 철학에서 알 수 있듯이, NestJS를 사용하면 통일된 아키텍쳐에서 서버 애플리케이션을 개발할 수 있을 것 같다. 통일된 아키텍쳐에서 개발한다는 것은 개발의 생산성을 높여 준다는 의미라고 생각된다. 따라서 아키텍쳐의 자유도가 높은 Express 대신 NestJS를 사용한다고 볼 수 있겠다.
참고