개발/backend(js,ts)
리팩토링) 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
반응형