DTO(Data Transfer Object)
- 데이터 유효성 검사 : class-validator/transformer을 사용해서 손쉽게 유효성 검사를 할 수 있다.
그로 인해 백엔드 개발자가 허용한 값만 DB에 들어올수 있게 한다.(SQL Injection으로 부터 보호)
- NestJs와 typeorm으로 엔티티와 dto들을 상속과 같은 OOP 테크닉들을 사용해 중복 코드를 줄일 수 있다.
유효성 검사를 손쉽게 처리하기 위한 라이브러리
npm i class-validator class-transformer
게시물 생성
게시물 생성을 위한 dto
export class CreatePostDto extends PickType(PostModel, [
"postTitle",
"postContent",
]) {}
picktype을 사용해 이미 존재하는 post엔티티에서 상속을 받아 생성.
typeScript의 pick 유틸리티를 사용하면 '타입'을 참조 할수 있지만 dto에서는 '값'을 사용하기 때문에 상속이 안된다.
post엔티티
@Entity()
export class PostModel extends BaseModel {
@IsString()
@Column()
postTitle: string;
@IsString()
@Column()
postContent: string;
@Column("int", { default: 0 })
postLike: number;
@ManyToOne(() => UsersModel, (user) => user.posts, {
nullable: false,
})
author: UsersModel;
}
게시글의 제목과 내용에 @IsString 데코레이터를 사용해서
main.ts
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const configService = app.get(ConfigService);
app.useGlobalPipes(new ValidationPipe());
await app.listen(configService.getOrThrow("SERVER_PORT"));
}
bootstrap();
유효성 검사를 위한 어노테이션들을 각각의 모듈과 컨트롤러 각각에 추가하지 않아도 앱 전체,전반적으로 적요을 시켰다.


오른쪽과 같이 게시글의 제목을 입력값으로 보내지 않으면 internal에러가 떠서 서버가 터지던게 이제 에러 처리로 걸러진다
게시물 수정
export class UpdatePostDto extends PartialType(CreatePostDto) {
@IsString()
@IsOptional()
title?: string;
@IsString()
@IsOptional()
content?: string;
}
게시물 수정은 제목 혹은 내용 둘중 하나만 수정할수 있어 patialType과 ? 연산자를 사용.
물론 extneds하지 않고 작성해도 되지만 oop를 사용해서 createPostDto에 새로운 추가해야하는 속성이 생길 때 상속을 이용해 쉽게 유지보수할 수 있다. 또한 "아 ~ create생성 dto에서 작성된걸 수정하는구나~"라는 개발시 context가 생길 수 있다.
updatePost 컨트롤러
@Patch(":id")
updatePost(
@Param("id", ParseIntPipe) id: number,
@Body() updatePostDto: UpdatePostDto
) {
return this.postsService.updatePost(id, updatePostDto);
}
updatePost 서비스단 로직
async updatePost(postId: number, postDto: UpdatePostDto) {
const { postTitle, postContent } = postDto;
const post = await this.postsRepository.findOne({
where: {
id: postId,
},
});
if (!post) {
throw new NotFoundException();
}
if (postTitle) {
post.postTitle = postTitle;
}
if (postContent) {
post.postContent = postContent;
}
const newPost = await this.postsRepository.save(post);
return newPost;
}



위와 같이 @IsOptional()과 ?를사용해서 postConent가 없이 postTitle만 선택적으로 수정을 할수 있다.
사용자의 password안보이게 하기.
serialization (직렬화)
- 현재 시스템에서 사용되는 (NESTJS) 데이터의 구조를 다른 시스템에서도 쉽게 사용할 수 있는 포맷으로 변환
즉, class의 object에서 JSON 포맷으로 변환
deserialization (역직렬화)
Request(요청)
프론트 --> 백엔드
plain object (JSON) -> class instance(dto)
Response(응답)
백엔드 --> 프론트
class instance(dto) ->plain object (JSON)
toClassOnly --> class instance로 변환될때만
toPlainOnly --> plain object로 변환될 때만
user.entity.ts
@Column()
@Exclude({
toPlainOnly: true,
})
password: string;
app.module.ts
providers: [AppService,{
provide: APP_INTERCEPTOR,
useClass: ClassSerializerInterceptor,
},
백엔드 애플리케이션 전체에 자동으로 class-transformer 어노테이션(@)이 달려있으면 기본적으로 적용되게한다.
사용자 조회
@Get()
async getUsers() {
return this.userService.getUserByEmail("moca@naver.com");
}

위와 같이 이제 응답값에서 비밀번호는 보이지 않는다 !
'캡스톤 설계 [건물별 소통 플랫폼 BBC]' 카테고리의 다른 글
페이지네이션 일반화 하기 (2) | 2024.03.24 |
---|---|
게시물 페이지 네이션 (0) | 2024.03.24 |
포스트맨 기능활용[환경변수,토큰 삽입 자동화] (0) | 2024.03.07 |
[백엔드] 회원가입,로그인(JWT토큰&리프레시 토큰&가드&커스텀데코레이터) [2] (0) | 2024.03.07 |
게시판 엔티티 생성 및 게시물 작성 API (0) | 2024.03.07 |