반응형
***본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
Nest js DTO
필드가 늘어날때마다, 일일히 하나씩 바디 값을 추가로 넣어주는 거 굉장히 비 효율적이다.
이거를 DTO를 이용해서 해결할 수 있다.
src폴더 => movie api 폴더=> dto 폴더 생성=> create-movie.dto.ts 생성
그 다음에 컨트롤러에서 받을 값들을 그대로 클래스 형태로 넣어준다
export class CreateMovieDto {
title: string;
genre: string;
}
타이틀과 장르가 crete를 할때는 무조건 필수다. 새로운 걸 만드니까
하지만, Patch는 둘 다 옵셔널로 만들어야 한다.
그래서 update-movie.dto.ts 파일 생성
export class UpdateMovieDto {
title?: string;
genre?: string;
}
@Post()
postMovie(
@Body() body: CreateMovieDto,
){
this.movieService.createMovie(
body);
}
@Patch(':id')
patchMovie(
@Param('id') id: string,
@Body() body:UpdateMovieDto,
)
return this.movieService.updateMovie(
+id,
body);
}
createMovie(CreateMovieDto: CreateMovieDto){
const movie: Movie = {
id : this.idConunter++,
...CreateMovieDto,
};
this.movies.push(
movie,
);
return movie;
}
updateMovie(id:number,UpdateMovieDto: UpdateMovieDto,){
const movie=this.movies.find(m=>m.id===+id);
if(!movie){
throw new NotFoundException('존재하지 않는 ID의 영화입니다');
}
Object.assign(movie, UpdateMovieDto);
return movie;
}
컨트롤러,서비스 파일 수정
DTO를 이용하여 변경한 이유
변경 이유
- CreateMovieDto는 데이터 구조를 명확하게 정의한 객체입니다.
- ...dto로 확장하면 title, director, year 등 필요한 속성을 자동으로 할당할 수 있어 가독성과 확장성 향상.
- 새로운 필드가 추가되어도 서비스 코드는 변경이 거의 없음.
- 요청 바디 전체를 DTO(CreateMovieDto)로 받기 때문에 구조가 명확하고, 여러 필드를 한 번에 처리 가능.
- @Body() 하나로 요청을 통째로 받고, 타입을 지정하면 자동 타입 추론 및 IDE 자동완성 지원.
- 이후 **class-validator**를 추가하면 유효성 검사도 DTO에서 처리 가능 (예: @IsString(), @Length() 등).
정리
DTO 사용 이유
- 입력 데이터 구조를 명확하게 정의할 수 있음
- 확장성과 재사용성 높음 (필드 추가 시 유연함)
- NestJS의 유효성 검증 시스템(class-validator)과 자연스럽게 연동
- 컨트롤러가 깔끔해지고, 서비스와의 데이터 전달이 일관적
- IDE 자동완성 및 타입 안정성 확보
Body를 클래스 형태로 관리할 수 있다.
클래스 형태로 관리하면, 실제 서비스에다가 파라미터들을 전달하는데 훨씬 편하다. 재사용 할 수 있다.




#패스트캠퍼스 #직장인자기계발 #직장인공부 #환급챌린지 #패스트캠퍼스후기 #오공완
https://bit.ly/4hTSJNB
반응형