체인의정석

리팩토링) nest.js 기본 구조 체계화 하기 본문

개발/backend

리팩토링) nest.js 기본 구조 체계화 하기

체인의정석 2021. 10. 26. 14:22
728x90
반응형

이번에는 controller 부분과 dto 부분을 수정하여 구조를 더 체계적으로 만들었다. 주위 선임개발자 분들의 코드를 보고 질문을 하여 받은 피드백을 바탕으로 코드를 체계화 시켜 보았다.

수정전 코드

다음과 같이 이더리움 주소값을 계산하는 조건식을 넣었다.

하지만 이러한 값은 @Param에 객체 클래스를 만들어서 class-validator에 적용시키는것이 더 일반적이다.

 

참고로 이더리움 주소값은 

1. 0x 포함 길이 42

2. 들어오는값은 16진수 

이 2가지 조건이고

 

web3에서의 주소값 검사는 체크썸 검사가 나온 결과갑이라고 볼 수 있다.

  async findOne(
    @Param('address') address: string,
  ): Promise<GetContractResponse> {
    if (address.substr(0, 2) !== '0x' || address.length !== 42) {
      const code = RESPONSE_CODE.INVALID_ADDRESS;
      const message = RESPONSE_MESSAGE.INVALID_CONTRACT_ADDRESS;
      return {
        code: code,
        message: message,
        data: {
          address: address,
        },
      };
    }
    const command = {
      address,
    };
    const response = this.addressesService.getAddressType(command);
    return response;
  }

따라서 아래와 같이 수정하였다.

 

수정 후 코드

@Controller('address')
export class AddressesController {
  constructor(private readonly addressesService: AddressesService) {}
  @Get('contracts/:address')
  async findOne(
    @Param('address') request: GetContractRequest,
  ): Promise<GetContractResponse> {
    const command = transformAndValidateSync(GetContractCommand, {
      address: request,
    });

    const response = this.addressesService.getAddressType(command);
    return response;
  }
}

 

이렇게 만들 수 있다. 

일단 2가지 포인트가 있다.

 

1. dto 에서 3가지를 설정해 준다.

 

- request : raw 데이터로 json 형태가 들어온다.

- command : request와 header 값등을 합한 요청이 들어온다. 이때 transfromAndValidateSync를 사용하여 json 형태로 들어온 response를 class로 다른 정보와 함께 넣어준다. 일단 헤더 값이 없더라도 추후 추가될 기능을 대비하여 넣어둔다.

- response : 결과값으로 줄 데이터를 넣어준다.

 

p.s) common 레벨로 공통된 클래스는 상위에 생성하고 하위 루트에서는 이를 상속  받아 설계하는 것이 더 좋은 구조이다. 다만 지금은 시간이 없어 이부분은 나중에 적용해 보기로 하였다.

 

2. 유효성 검사의 경우 request, command, response 에서 클래스를 따로 생성해 주면서 , class-validator로 체크를 한번씩 더 해준다.

 

 

728x90
반응형
Comments