Nest JS Sign up

백선호·2021년 9월 5일
0
post-thumbnail

이번에는 새로운 기술 스택인 Nest JS를 사용해서 회원가입 API를 구현해 볼 것이다. 실제 데이터베이스와 연결하는 방법과 filter를 사용하여 에러 처리하는 방법과 요청 값에 대한 유효성 검사를 하는 방법까지 설명하겠다.

Nest JS 란?

Nestjs는 효율적이고 확장 가능한 Node.js Server side application이다. Typescript 을 완벽히 지원하고 OOP, FP, FRP를 지원한다. 내부적으로는 다른 HTTP Framework를 추상화해서 사용하고 있다. 등장하게 된 계기는, Front Level에서는 React, Vue, Angular 3대장과 같은 좋은 프레임워크가 등장했는데 Node.js 진영에서는 아키텍처를 효과적으로 해결해 주는 기술이 등장하지 않아 만들어졌다고 한다. 이제 본격적으로 Nest js를 이용하여 프로젝트를 시작하겠다.

Nest JS 시작하기

설치 & 서버 시작

기본적으로 node.js와 mysql이 설치되었다는 가정하에 진행하겠다.

$ npm i -g @nestjs/cli
$ nest new 프로젝트명

command line 설치 설치를 위해 cli를 설치한다. 설치 후 nest 명령어를 사용하여 프로젝트를 설치한다. cli를 설치하면 npm 명령어를 사용할 수 있다.

실행 후 해당 디렉터리로 이동하면 자동으로 package.json과 node.module 들이 만들어진 것을 볼 수 있으며 "start:dev": "nest start --watch" 가 적용되어 있기 때문에 $npm run start:dev를 통해서 서버를 시작하는 기능과 다시 파일을 저장했을 때 자동으로 서버를 다시 시작해 준다. $npm install --save 패키 지명을 이용해서 패키지를 istall을 하고 package.json에 저장한다. 만약 프로젝트 전 필요한 package가 있다면 install를 해주는 걸 추천한다.

controller & service & module

Nest js에는 요청과 응답을 하는 controller, 비즈니스 로직 즉 라우터가 해야 하는 동작으로 이루어진 service, 애플리케이션 구조를 구성하는 module로 분리를 해놓았다. 그렇다면 controller와 service는 이유는 기능의 재사용으로 중복되는 기능을 없앨 수 있고 서비스는 요청과 응답을 모르기 때문에 독립적으로 사용할 수 있다.

nest module 생성하기 $nest g mo 모듈명
nest service 생성하기 $nest g s 서비스명
nest controller 생성하기 $nest g s 컨트롤러명

상위 명령어를 하나하나 입력하여 작성할 수도 있지만 간단한 CRUD를 작성할 때는 &nest g resource app 명을 통해서 module, service, controller까지 한 번에 CRUD를 로직까지 만들어낸다.

Typeorm entity

service와 controller를 작성하기 전에 database를 생성해야 하는데 방법은 크게 두 가지 있다. entity를 원하는 데로 작성해서 database에 연결하여 스키마를 생성하는 법, 데이터베이스를 만들어 읽어오는 방법이 있다. 필자는 전자를 선택하여 진행하겠다.

$npm install --save @nestjs/typeorm typeorm maridb


main.ts가 있는 위치에 ormconfig.ts 파일을 만들어 준다. autoloadEntities를 true로 계속해 놓으면 재시작할 때마다 테이블이 초기화되니 한번 테이블을 생성했다면 false로 바꿔놓는 것이 좋다. 이렇게 작성했으면 이제 app.module에 장착하면 된다.

이렇게 장착했으면 entity를 작성하고 서버를 재시작 혹은 저장해 주면 database에 작성한 테이블이 생성된다.

join user





controller와 service를 작성하였다. controller에서 DI(Dependency Injection)를 통해서 service를 가져와서 사용하였고, service 또한 DI를 사용해 database와 entity를 연결하기 위해서 reposiory를 사용했다. 회원가입 전 요청 값을 JoinRequestDto을 통해서 전달받았다. DTO 에에 해당하는 내용은 뒤에 다시 언급하겠다. 서비스에 findByEmail을 통해서 이메일을 확인하여 해당하는 사용자를 가져오고 없을 경우 에러를 반환한다. join을 통해서 회원가입을 시켰다.

TIP: inject가 붙은 것은 provider라고 생각하면 쉽다! 꼭 해당 module에 이동하여 imports: [TypeOrmModule.forFeature([Users])] 해야 한다.

Exception filter

service 내에서 error가 났을 경우 error를 잡아내기 위해서 try catch를 사용하기도 하지만 nest에는 exception filter를 사용할 수 있다. 공식 문서에 따라 진행하면 된다.

상위 코드처럼 작성 후에 모든 기능에서 필터를 사용하기 위해서 main.ts에 app.useGlobalFilters(new HttpExceptionFilter);
를 사용하여 장착해 주었다.

DTO & Class-validator

DTO는 swagger를 사용할 때 데이터의 타입과 길이 필수 여부를 문서화하기 쉽게 만들기 위해서 작성하는 게 기본이지만 여기에 class validator를 더하면 데이터의 유효성 검사까지 진행할 수 있게 된다.

$npm i class-validator 설치


dto에 적용하고 entity를 참조하여 작성하고 main.ts에 app.useGlobalPipes(new ValidationPipe()); 을 사용하여 장착하면 알아서 유효성 검사를 해준다.

profile
baik9261@gmail.com

0개의 댓글