(아직 작성중인 글입니다)
Node.js 기반으로 서버 구축을 공부해보고 싶었다.
이유는 몇 가지 가 있는데, 크게 (1) 백엔드 개발자들과의 협업을 더 잘하기 위해서, (2) 내가 개발에 참여하는 서비스들의 아키텍처를 더 잘 이해하기 위해서, (3) 그리고 프론트엔드에서 백엔드와 함께 구성되는 다양한 비즈니스 로직을 더 잘 이해하고 싶어서이다.
노마드코더 니꼴라스님의 Nest.js
무료 강의를 발견하여 수강해 보았다. 어렵진 않을까 걱정했지만, Nest는 생각보다 간단했다. Express 기반 Node.js 프레임워크. 그게 끝!
그런데 Node.js 기반이라는 점이 나에게는 가장 큰 매력으로 다가왔다. 나는 자바스크립트로 프론트엔드 개발을 하니까. Nest로 백엔드 개발을 학습한다면 프로그래밍 언어로 인한 러닝커브가 거의 없고(물론 Node.js가 제공하는 API는 공부해야 한다), 순수 백엔드 지식만 채우면 되는 것이며, 타입스크립트를 이미 사용하고 있기에, 순수하게 백엔드 서버 구축에만 집중할 수 있으이라 예상했다.
백엔드 개발자들과의 협업을 더 잘하기 위해서, 내가 개발에 참여하는 서비스들의 아키텍처를 더 잘 이해하기 위해서, 그리고 프론트엔드에서 백엔드와 함께 구성되는 다양한 비즈니스 로직을 더 잘 이해하고 싶어 시작한 Nest.js
프로젝트 설정에 앞서서 우리는 Node.js, TypeScript, Insomnia 라는 녀석을 사용하면 좋다고 한다. 예전에 Postman으로 API를 디버깅하면서 개발을 해 본 적이 있는데, Insomnia 또한 Rest API 클라이언트이다.
이 툴을 사용하면, 바로 서버 요청 결과를 오른쪽 창에서 확인할 수 있다. 실제로 사용해보니 크롬 브라우저의 주소창에 localhost:3000 페이지를 띄워놓은 채로 VSCode를 왔다갔다 하지 않아도 되고, 코드에 디버깅 코드를 적었다가 지웠다 하지 않아도 되어 편리했다. 개발은 개발대로, 개발 결과는 Insomnia로 확인하면서 확실히 분업이 된 느낌이었다.
Nest는 프레임워크이다. Next.js 를 학습하면서 깨달은 점은, 프레임워크를 관통하는 아키텍처를 살펴보고 기술을 사용하는 편이 이해도를 높이는 데 도움이 된다는 점이다(너무 당연한 이야기일지도 모르겠다). 그래서 Nest도 아키텍처를 살펴보면서 어떤 녀석인지 살펴 보도록 하자.
Module(모듈)
+ Controller(컨트롤러)
+ Service(서비스)
구조로 되어 있다.
Module은 하나의 역할을 담당하는 재사용가능한 로직의 덩어리이다. 가령 블로그 서비스같은 경우, 사용자 인증 모듈, 블로그 글 모듈이 있겠다.
Controller는 이런 모듈들로 전달되는 요청들을 정의하는 부분이다. express의 router를 생각하면 된다.
컨트롤러는 하나의 클래스를 export하고 있는데, @Controller
데코레이터가 붙어 이 클래스가 컨트롤러 클래스임을 나타낸다.
리소스 라우팅 설정 또한 데코레이터를 활용하여 정의되는데, 가령 id 번호를 받아 문자열을 리턴하는 Get요청에대한 정의는 아래와 같다.
@Controller('movies')
export class MoviesController {
@Get('/:id')
getOne(@Param('id') movieId: string) {
return `This will return one movie with the id: ${movieId}`;
}
}
이 경우 리소스의 위치는 /movies/:id 가 된다. 앞에 movies가 상위 계층으로 왔는데, 잘 보면 컨트롤러의 이름과 동일함을 알 수 있다.
https://docs.nestjs.com/exception-filters
Nest comes with a built-in exceptions layer which is responsible for processing all unhandled exceptions across an application. When an exception is not handled by your application code, it is caught by this layer, which then automatically sends an appropriate user-friendly response.
보통 에러는 코드로 검출하여 처리하지만, 미처 코드에서 처리하지 못한 예외들은 Nest의 내장 예외 레이어를 통해 걸러져 자동으로 사용자 친화적인 응답을 보내게 되어 있다.
https://crystallize.com/blog/frontend-end-to-end-testing
나는 아니요라고 답했다. 테스트코드에 대한 막연한 두려움이 있었다. 그런데 Nest에서 테스트코드를 작성하면서 그 두려움이 사라졌다.