NestJS를 사용하게 된 이유

그동안 웹프로젝트 및 API프로젝트 개발을 하면서 JAVA를 기반으로 하는 스프링 프레임워크를 이용 하였습니다.

 

스프링은 경량급 프레임워크 이면서  IoC 컨테이너, DI, AOP라는 핵심 기능을 가지고 있고 개발을 편리하게 해주고 있습니다.

그러나 이러한 스프링을 이용하기 위해서는 지옥같은 방대한 양의 XML 설정이나 특유의 라이브러리 의존 충돌 문제등 신경써야 될 것이 많았습니다. 

후에 JAVA 설정으로 변경되었고, 스프링 부트에서는 필수적인 설정이 기본으로 되어 있거나, 최소한의 구성으로만 쉽게 작동한도록 변화 되면서 복잡한 설정 정보를 간략화 할 수 있도록 하였습니다.

 

그러나 작은 규모의 서버를 스프링 부트로 개발하려면 최소한의 스프링의 지식과 설정 및 구현시간이 필요합니다.

 

그래서 몇년전부터 Node.js의 Express 프레임워크를 스프링 프레임워크와 혼합하여 사용하였고, 이로 인해 쉽게 서버를 구축하고 많은 개발시간을 단축할 수 있었습니다.

 

하지만 장점이 있으면 단점도 있듯이 Express를 이용한 프로젝트가 규모가 커지기 시작하면서 통일성을 유지하기가 매우 어렵게 되었고, 그로 인해 소스코드가 점점 난잡해 지게 되었습니다.

 

저희 테크팀에서는 이번에 스프링부트 프로젝트들을 2.0버전에서 3.0 버전으로 업그레이드 작업을 하면서 동시에 Express 프로젝트들 또한 NestJS 프레임워크로 변경하기로 내부 회의에서 결정 하였습니다.

 

그리고 저희팀은 대략3주의 기간을 통하여 모든 코드를 변경 작업하였고, 다음과 같은 장점들을 느끼게 되었습니다.

 

1. NestJS는 통일성 있는 대규모 프로젝트를 개발하기 좋다.

-> 기존 Express에서는 개발자의 코딩 스타일에 따라 구조가 다양하였지만 NestJS의 경우 스프링 프레임워크 구조와 유사하게 개발할 수 있어서 타입스크립트 기반의 스프링이라는 생각을 가지게 되며, 기존 스프링 프로젝트 하고의 통일성을 가지게 되었다. 또한 스프링 처럼 Controller, Service, Module등을 이용하여 기본 구조 자체가 통일화되어 있고 구조 파악이 명확하고 간편하다.

 

2. 기존에 스프링과 매우 유사하기 때문에 스프링을 한번 공부해봤다면, 유사한 구조를 빠른 시간안에 쉽게 파악하여 개발이 가능하다.

-> 위에서 설명한 Controller, Service 및 IoC 컨테이너, DI, AOP의 개념 또한 매우 유사하다.

 

3. 기존의 Express 프레임워크에 비하여 구조화되 있으면서도 오히려 더욱더 편리하다.

-> Express 프레임워크의 경우 처음부터 Micro 프레임워크를 지향했기 때문에 필요한 기능들을 추가할 경우에는 일일이 찾아서 설치 해야될 라이브러리가 너무 많았지만, NestJS의 경우 자체적으로 지원하는 기능들이 매우 많으며, 자체에 붙어있는 것이라 호환성 문제 또한 걱정할 것이 없다는 장점이 있습니다.

 

4. TypeScript를 기본 언어로 채택하였기 때문에 스프링과 같은 DTO를 정의 가능하다.

-> NestJS는 DTO의 사용을 적극 추천하고 있으며, DTO 사용 가능으로 interface를 구조화하는게 명확하며, 데이터의 유효성을 체크하는데 효율적인 장점이 있습니다.

 

5. NestJS의 Module을 이용하여 기능을 모듈 단위로 제공 가능하며, 캡슐화가 가능하다.

-> NestJS에서의 Module은 Controller, Service등을 등록하며, 이렇게 등록한 객체들의 기능을 모듈화하여 모듈 단위로 기능을 제공하여 재사용성을 높이도록 하고 있습니다.

또한 이렇게 등록된 객체들을 공급자(provider)라고 하는데 공급자들은 기본적으로 IoC 컨테이너에 등록되며, 스프링과 다르게 기 본적으로 캡슐화시키기 때문에 직접 원하는 공급자를 export 하지 않는다면, 다른 외부에서 접근이 불가능하다는 장점이 있다.

이러한 점은 Node.js가 추구하는 모듈을 통한 캡슐화의 사상과도 일치한다.

 

 

이상 NestJS를 사용하게 된 이유를 마치며, 다음글에서는 요청 생명 주기에 대하여 간단하게 설명하도록 하겠습니다.

 

 

 

 

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유