[NestJS] 여러가지 모듈사용

김택수·2022년 5월 9일
0

회원가입 api를 적용하던 중 사용하게 된 모듈 두개를 소개한다.

1. bcrypt


먼저 bcrypt는 클라이언트 및 프론트엔드단에 유포되면 안되는 password 등 같은 정보를 hash(암호화)처리 해준다.

$ npm i bcrypt
$ npm i -D @types/bcrypt

먼저 npm을 통해 install 해주고 사용법은,

const hashPassword = bcrypt.hash(패스워드, salt)
// 첫번째 인자로는 생성된 객체의 숨기고 싶은(ex. 패스워드) 등을 주고
// 두번째 인자로는 salt라고 하여 값이 높을수록 암호화 연산을 많이 하여 안전하게 값을 암호화 할 수 있다.
// 다만, salt값이 높아지면 연산을 많이 하기 때문에 속도저하를 일으킬 수 있다.

이렇게 받아온 hashPassword(암호화 된 password)를 받아오고, 이것 또한 유출되면 안되기에, 스키마에 virtual 메소드를 이용해서 return값에 프론트단에 보여주고 싶은 정보만 보여줄 수 있다.

schema.virtual('데이터명').get(this :schema => {
 return {
 id: this.id,
 email: this.email,
};                          
}) 

후에 스키마 안에서 readonly로 해당 데이터를 만들어주고, controller에서 readonly된 virtual 스키마를 사용해 password를 프론트단에 보이지않게 할 수 있다.

2. Swagger


프론트엔드와 소통할 때 사용할 수 있는 api docs를 만들어 주는 모듈.
엔드포인트, http 메소드, 테스트까지 가능한 기능이기 때문에 프로젝트를 할 때 수월하게 사용할 수 있을 것 같다.

npm install --save @nestjs/swagger swagger-ui-express

설치를 먼저 진행해주고, 사용법은

const config = new DocumentBuilder() // 협업을 위한 api문서는 Swagger로 만들 수 있다.
    .setTitle('C.I.C') // api 제목
    .setDescription('cat') // api 설명
    .setVersion('1.0') // api 버전
    .addTag('cats')
    .build();
  const document = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup('api', app, document); // 1번째 인자는 api docs의 엔드포인트.
  1. @ApiOperation
    Controller에서 사용하고, 해당 엔드포인트에서 쓰이는 http 메소드와 어떤 기능인지 적어줄 수 있다.
@ApiOperation({summery: '설명'}) // http 메소드 위에 사용해준다.
@Get()
  1. @ApiResponse
    마찬가지로 Controller에서 사용해주고, Swagger에서 테스트했을 때 백엔드에서 에러와 성공에 대한 status code와 설명, response타입을 정해주어 프론트엔드 개발자가 테스트할 수 있게 할 수 있다.
@ApiResponse({
	status: 200,
  	description: '성공',
  	type: responsedto // 프론트엔드에서 내용을 body에 싣고 보내주면, 백엔드단에서의 response를 dto패턴으로 미리 만들어서 response를 보내준다.
})
  1. @ApiProperty
    Schema에서 사용하고, 프론트엔드가 어떤 body를 보내면 되는지 설명을 달아줄 수 있다. 백엔드에서는 dto나 스키마를 통해 body 타입 및 항목을 정해두기 때문에 미리 해당 데코레이터를 사용해 swagger에 표시해두면 프론트와 백엔드간의 의사소통이 편해질 수 있다. (1~3번 데코레이터 모두 해당됨)
@ApiProperty({
	example: 'eeee@gmail.com', // 보내야하는 항목
    description: 'email', // 어떤 항목인지
  	required: true, // 필수항목인지
})

// 다양한 옵션을 활용할 수 있다.
profile
개발자 키우기 Lv1

0개의 댓글