[TIL] custom pipe

김시원·2023년 6월 3일
1

TIL

목록 보기
37/50

Issue #1

주민번호 데이터가 들어오면 pipe로 바로 성별 판별해서 db에 전달하기

📌 What I tried

Issue #1

  1. import { Transform } from 'class-transformer';
    DTO에서 주민번호를 가지고 성별을 판단해서 지정해주기 위해 transform을 사용해보았다.
@IsNotEmpty()
@Transform(({ obj }) => {
  const patientRrn = String(obj.patient_rrn);
  return patientRrn[7] === '1' || patientRrn[7] === '3' ? 'M' : 'F';
})
gender: string;

근데 잘 안됐다. 알고보니 transform의 용도를 잘못 파악하고 있었다.

=> Transform #

You can perform additional data transformation using the @Transform() decorator.

@Transform(({ value }) => value.name)
role: RoleEntity;

For example, the following construct returns the name property of the RoleEntity instead of returning the whole object.

공식문서를 해석하자면, @Transform() 사용시 request로 들어온 role 변수에 할당된 RoleEntity 객체의 name 프로퍼티만을 추출하여 사용하는 것이다. 즉, 이 코드를 사용하면 role.name만 반환되는 것이다.

@Transform()은 내가 원했던 것과 달라서 다른 방식을 생각해보았다.

  1. custom pipe 사용
    공식문서에 아주 설명이 잘 적혀있다. 내가 원하는 건 controller에서 body data로 주민번호 데이터가 넘어오면 우선적으로 pipe를 통해 gender를 판별하고 gender를 data 객체에 추가해서 return 해주는 것이다.
// patients.controller.ts
@Post('/:report_id')
  createPatientInfo(
    @Param('report_id') report_id: number,
    @Body(new GenderFromRrnPipe()) createPatientInfo: CreatePatientDto, // 주민등록번호를 받으면 자동으로 gender 판정되어 넘겨짐
  ): Promise<Patients> {
    this.logger.verbose('환자 정보 입력 POST API');
    return this.patientsService.createPatientInfo(report_id, createPatientInfo);
  }
// custom pipe
import { PipeTransform, Injectable } from '@nestjs/common';

@Injectable()
export class GenderFromRrnPipe implements PipeTransform {
  transform(value: any): object {
    const rrn = value.patient_rrn;
    const gender =
      rrn[7] === '1' || rrn[7] === '3'
        ? 'M'
        : rrn[7] === '2' || rrn[7] === '4'
        ? 'W'
        : null;

    return {
      ...value,
      gender,
    };
  }
}

이렇게 pipe를 통과해서 data를 transform 해주었다.

2개의 댓글

comment-user-thumbnail
2023년 6월 3일

좋아요만 누르고 튈려다가 좋아요가 없어서 댓글 남기고 튑니다 꿀 정보 감사합니다👍

답글 달기
comment-user-thumbnail
2023년 6월 3일

헐 남자 주민번호에 3도 있었다니.... 틀니 빼고갑니다...👍

답글 달기