[노마드 코더] NestJS로 API 만들기 회고

MinWoo Park·2021년 4월 23일
1

Retrospect

목록 보기
8/11
post-thumbnail

노마드코더 NestJS로 API 만들기 강좌를 완료하였습니다.
회고를 통해 앞으로의 어떤 태도로 무엇을 학습할지 고민하는 시간을 갖도록 하겠습니다.


강의 목차

TIL - [노마드 코더] NestJS로 API 만들기(1)

TIL - [노마드 코더] NestJS로 API 만들기(2)

TIL - [노마드 코더] NestJS로 API 만들기(3)

TIL - [노마드 코더] NestJS로 API 만들기(4)

TIL - [노마드 코더] NestJS로 API 만들기(5)


해당 강좌를 선택한 이유❓

기존 express로만 작업하면서 자유로움이 주는 장점이 있지만 구조화되지 않은 단점이 있다고 느꼈고 이를 해결할 수 있는 것이 NestJS라고 생각하여 해당 강좌를 선택하게 되었습니다.


무엇을 배웠나 ✍️

  • Nest JS 셋업
  • Nest JS 아키텍쳐
  • 유닛 테스트
  • e2e 테스트

프로젝트 셋업

프레임워크의 편리한 점으로 nest를 설치하고 프로젝트를 만들면 구조화된 파일들이 생성이 됩니다.

$ npm i -g @nestjs/cli
$ nest new project-name

$ nest

처음 생성 시 파일 목록

해당 프로젝트 마무리 후 파일 목록


controllers

컨트롤러는 기본적으로 url을 가져오고 함수를 실행하는 일을 합니다.
express의 라우터같은 존재입니다.

controllers의 @Get이 express의 get 라우터의 역할을 합니다.

movies.controller.ts


Services

NestJS는 컨트롤러와 비지니스 로직을 구분짓고 싶어 합니다.
컨트롤러는 그저 url을 가져오고 함수를 실행하는 역할일 뿐입니다.
나머지는 비지니스 로직으로 갑니다.

서비스는 일반적으로 실제로 함수를 가지는 부분입니다.
서비스 파일에 들어가 보면 클래스와 함수가 보입니다.

movies.service.ts


Single-responsibility principle(단일 책임 원칙)

NestJS도 단일 책임 원칙을 따라 진행합니다.
단일 책임 원칙이란 위키백과에 따르면 다음과 같이 정의됩니다.

객체 지향 프로그래밍에서 단일 책임 원칙(single responsibility principle)이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다. 클래스가 제공하는 모든 기능은 이 책임과 주의 깊게 부합해야 한다.

즉, 하나의 module, class 혹은 fucntion이 하나의 기능은 꼭 책임져야 한다는 뜻입니다.


DTOs and Validation

Body를 검사하는데 NestJS에는 아주 편리한 기능이 있습니다.
바로 DTO(Data Transfer Object)입니다.

create-movie.dto.ts

이것만으로는 유효성 검사가 되지 않습니다.
아직 잘못된 Body를 받아도 그대로 받아들이기 떄문에 추가 작업들이 필요합니다.

main.ts에서 유효성 검사용 파이프 작업을 진행합니다.
파이프는 미들웨어라고 생각할 수 있습니다.
이를 위해 먼저 패키지를 설치합니다.

$ npm i class-validator class-transformer

ValidationPipe는 아주 멋있는 옵션들을 가지고 있습니다.

먼저 whitelist는 true 설정 시 아무 데코레이터가 없는 프로퍼티의 object는 걸러줍니다.
저희의 프로퍼티에는 title, year, genres만 데코레이터가 있으니 이 프로퍼티들 이외에는 다 걸러주기에 다른 프로퍼티를 가진 object는 걸러줍니다.

그리고 누군가 이상한 리퀘스트를 보내면 요청 자체를 막아 보안을 업그레이드 할 수 있습니다.
forbidNonWhitelisted속성을 true로 해주면 됩니다.

transform은 controller에서 타입을 원하는 걸로 바꿔줍니다.

이런 놀라운 기능은 express를 이용한다면 전혀 도움받을 수 없지만 NestJS라는 프레임워크를 이용하기 때문에 가능한 기능입니다.

main.ts


테스팅

package.json을 보면 test와 관련된 스크립트들이 있습니다.

package.json scripts 중 test 관련

가장 먼저 보이는 'test: jset'에서 jest는 자바스크립를 쉽게 테스팅하는 npm 패키지입니다.

NestJS가 다 셋팅해 준 겁니다.
여태까지 생성한 파일들을 보면 .spec.ts가 붙은 파일들이 있습니다.
.spec.ts는 테스트를 포함한 파일입니다.

movies.service.spec.ts 파일은 movies.service.ts을 테스트하는 파일입니다.
같은 파일명을 테스트 하는 것이 NestJS의 기본 원칙입니다

테스트에는 유닛 테스트, e2e(end-to-end) 테스트가 있습니다.
유닛 테스트란 모든 function을 따로 테스트 하는 것입니다.
e2e 테스트는 모든 시스템을 테스트하는 것입니다.

예를 들어 유닛 테스트는 getOne() 함수같은 하나만 테스트하고 싶을 때 사용합니다.
함수 하나 하나를 따로 테스팅하는 것이 유닛 테스트입니다.

e2e 테스트는 사용자가 취할 액션을 처음부터 끝까지 테스트하는 겁니다.

정리하자면 유닛 테스트는 시스템에서 function 같은 하나의 유닛만을 테스트하는 것이고,
e2e 테스트는 전체 시스템을 테스트하는 것입니다.


앞으로의 계획 🏃‍♂️

타입스크립트와 NestJS를 공부하여 기존 프로젝트를 리팩토링 할 계획이 있었습니다.
기본적인 사용법들을 익혔으니 실제 프로젝트에 적용을 하여 좀 더 세밀한 부분까지 공부하여 실무에 적용할 수 있도록 준비해 보아야 겠습니다.
프로젝트를 리팩토링하면서 GraphQL에 대한 관심이 있어서 새로운 공부도 시작할 예정입니다.


수료증

profile
물음표를 느낌표로 바꾸는 순간을 사랑하는 개발자입니다.

0개의 댓글