아래 글은 아래 글에서 이어집니다.
[Server/NestJS] - [nestjs] validation
nestjs에서는 다른 클래스의 타입을 사용해 또 다른 타입을 간단하게 생성할 수 있습니다.
예를 들어 특정 student의 정보를 변경하는 부분을 추가하기 위해 model디렉터리의 student.ts에서 업데이트를 위한 별도의 클래스를 아래와 같이 생성하였습니다.
export class studentUpdator {
@IsString()
readonly name?: string;
@IsString()
readonly group?: string;
@Type(() => Number)
@IsNumber()
readonly age?: number;
};
기존 클래스 대신 위와 같은 별개의 클래스가 필요한 이유는 업데이트에 필요한 모든 타입을 '?:'문자를 사용해 지정했기 때문입니다. 각 필드는 있을 수도 있고 필요에 따라서는 생략될 수도 있다는 가정하에 모두 optional 처리된 것입니다.
하지만 위와 같이 클래스를 수동적으로 생성하는 것보다는 기존 타입에서 모두 optional로 처리한 새로운 클래스를 자동적으로 생성할 수도 있습니다.
이 방법을 알아보기 위해 다음과 같이 필요한 패키지를 설치합니다.
npm i @nestjs/mapped-types |
다시 model디렉터리의 student.ts파일로 가서 아래와 같이 studentUpdator클래스를 작성합니다.
import { PartialType } from "@nestjs/mapped-types";
...
...
export class studentUpdator extends PartialType(studentValidator) {};
PartialType()을 사용해 기존의 studentValidator클래스를 기본으로 모든 필드를 optinal로 만든 studentUpdator클래스를 생성하였습니다. 참고로 PickType()은 필요한 필드만 const로 가져오고 Omit()은 지정한 필드를 제외하고 모든 필드를 가져오는 함수입니다.
이제 school.service.ts에서 student변경을 위한 함수를 만들고
modifyStudent(id: number, std: studentUpdator) {
const nowStd = this.getStudent(id);
this.students = this.students.filter(x => x.id !== id);
this.students.push({
...nowStd,
...std
});
return this.getStudent(id);
}
school.controller.ts에서도 Patch API함수를 구현하여 변경 요청에 응답할 수 있도록 합니다. 참고로 Put은 전체를, Patch는 일부분만을 변경하는 데 사용되는 API입니다.
@Patch(':id')
async modifyStudent(@Param('id') id: number, @Body() std: studentUpdator) {
return this.schoolService.modifyStudent(id, std);
}
이제 API를 요청해 보면
값이 성공적으로 변경되었습니다.
'Web > NestJS' 카테고리의 다른 글
[nestjs] spec과 unit testing (2) | 2021.03.17 |
---|---|
[nestjs] module과 의존성주입(dependency injection) (0) | 2021.03.16 |
[nestjs] validation (0) | 2021.03.16 |
[nestjs] Service (0) | 2021.03.16 |
[nestjs] controller (0) | 2021.03.15 |