이번에 새로운 프로젝트를 진행하게되면서 NestJS로 서버를 구축하기로 팀원과 얘기되었다.
NestJS는 처음 접했고 새로운 기술을 배우고 적용해본다는 생각에 마음이 들뜬다.
그렇다면 시작 전 nest가 무엇이고 왜 사용하는지에 대해 간략하게 알아보고자 한다.
NestJS는 Node.js 기반의 프레임워크다.
Node.js는 손쉬운 사용, 유연한 확장성을 장점으로 많은 개발자들에게 사랑받고 있다.
하지만, 로직 구성이 자유롭고 정해진 아키텍처가 없어 개발자마다 각자의 구조가 있어 다른 사람이 코드를 분석하려면 아키텍처부터 파악해야하므로 코드 가독성, 유지보수성 등이 떨어져 생산성의 저하로 이어질 수 있다.
이러한 단점을 보완하기 위해 나온 것이 NestJS다.
NestJS는 Node.js의 Express를 기반으로 만들어졌으며, 보다 체계적이고 모듈화된 구조를 제공한다.
또한, TypeScript(이하 TS)를 기반으로 작성되어 타입 검사 등 여러 기능을 통해 효율적인 코드 작성, 오류 방지, 코드 재사용성 및 유지보수성을 높여준다.
Node.js의 단점이었던 아키텍처가 정의되어 있기에 개발자간의 협업에 효과적이며 프로그램 확장도 손쉬운 장점이 있다.
거기다가 의존성 주입 기능을 통해 의존 관계 관리로 모듈 간의 결합도를 낮출 수 있다.
기존에는 외부 라이브러리 설치를 통해 사용해야 했던 로깅, 웹소켓 등도 제공한다.
이외에도 DTO 적용 등의 많은 장점들이 존재한다. (사자(고양이)마크도 간지..)
NestJS는 기존 express와는 달리 미리 정의된 아키텍처를 알아야 개발을 할 수 있기 때문에 사전 학습이 필요하다.
또한, TS가 기반이므로 TS에 대한 이해도 필수적으로 필요하다.
express에 비해 구조가 정형화된다는 것도 단점이 될 수가 있다.
이외에도 단점들이 존재하겠지만 이러한 자잘한 단점(사전 학습 필요가 단점일까..? 하는 생각도..)들이 존재하더라도 NestJS를 사용했을 때 얻는 이점들이 워낙 많기에 인기가 많지 않은가 하는 생각이 든다.
처음 프로젝트를 생성하면 위와 같이 기본 구조로 생성된다.
우리가 주로 사용하는 src(source)폴더에 대해 좀더 알아보자
서버의 진입점이라고 보면되며 app.listen() 안에 사용할 port 번호를 적용시킬 수 있다.(기본은 3000)
NestFactory는 NestJS의 핵심기능을 담당하며, 앱을 생성/구동시키는 역할
이름 변경 금지
프로젝트의 최상위(루트) 모듈이며, 아래 그림과 같이 컨트롤러, 서비스가 묶인 새로운 모듈(기능)을 루트모듈에 주입
모듈을 어떻게 나눌 것인지는 개발자의 자유지만 응집도를 잘 생각해서 기준을 정하는 것이 좋음
@Module() 데코레이터(@으로 작성된 것들을 말함)는 앱 구조를 구성하는 메타데이터를 제공하며 4가지 속성을 가짐
라우터의 역할 즉, 서버로 들어오는 요청을 처리하고 사용자에게 응답을 반환하는 역할을 한다.
@Controller("/경로") 를 통해 경로 설정 가능
@Get, @Post, @Put 등을 통해 REST API 적용
app.controller.ts의 getHello()를 구현하는 역할
즉, 비즈니스 로직을 담당
여기서는 간단하게 'Hello World'를 출력
controller의 단위 테스트 시 사용
NestJS에서는 jest라는 테스트 프레임워크 사용 가능
테스트 코드를 작성하지 않겠다면 삭제해도 지장 없지만 작성하는 것이 좋음
간단하게 NestJS에 대해 알아보았다.
여기저기 블로그들과 공식문서들을 보면서 글로만 읽어서는 잘 모르겠고 몸에 와닿지 않는다
프로젝트를 하면서 직접 머리로 헤딩하면서 배워나가고 싶은 생각이 마구마구 솟구치는 중이다.
하지만.. 막상 이슈가 생기면 머리가 아프겠지..? 그래도 100마디 말보다 1번의 경험이 나에게 뼈가되고 살이될 것이라 믿는다.