320x100
320x100
DTO (Data Transfer Object, 데이터 전송 객체)
프로세스 간에 데이터를 전달하는 객체를 의미
말 그대로 데이터를 전송하기 위해 사용하는 객체이기 때문에 순수하게 전달하고 싶은 데이터만 담겨있다
DTO는 순수하게 데이터를 저장하고 데이터에 대한 getter와 setter만을 가져야한다고 한다
즉, 어떠한 비즈니스 로직을 가져서는 안된다
저장, 검색, 직렬화 (DTO > Byte, JSON, XML), 역직렬화 로직만을 가져야한다
예시
// main
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
bootstrap();
// 컨트롤러
@Controller("user")
export class UserController {
constructor(private readonly userService: UserService) {}
@Get("")
async getUser(@Query() findUserDto: FindUserDto) {
return this.userService.getUser(findUserDto);
}
}
// 서비스
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private readonly userRepository: Repository<User>
) {}
async getUser({ id, name }: FindUserDto) {
const user = await this.userRepository.findOneBy({ id, name });
return plainToInstance(FindUserReturnDTO, user);
}
}
// Request DTO
@Exclude()
export class FindUserDto {
@Expose()
@IsString()
@MinLength(5)
@MaxLength(10)
@IsNotEmpty()
id: string;
@Expose()
@IsString()
@IsNotEmpty()
name: string;
}
// Response DTO
@Exclude()
export class FindUserReturnDTO {
@Expose()
id: string;
@Expose()
name: string;
}
DTO 활용
- DTO를 사용하여 엔티티의 내부 구현을 캡슐화 할 수 있다
- 클라이언트로 넘겨줘야 할 데이터는 API마다 다를 수 있기 때문에 엔티티를 반환 값으로 사용하면 유지보수가 힘들어진다
- DTO 대신 엔티티를 사용하면 클라이언트 요구사항에 엔티티가 영향을 받을 수 있다
- 요청 & 응답 시마다 DTO를 생성하는 것은 더 많은 코드를 관리해야하지만 엔티티만 썼을때 발생하는 버그들과 유지보수의 난이도를 생각하면 훨씬 저렴한 노동이다
- DTO를 사용하면 클라이언트에 전달할 데이터의 크기를 조절할 수 있다
- validation, swagger 등의 코드들과 엔티티 코드를 분리할 수 있다
Reference
300x250
728x90
'Programming > NestJS' 카테고리의 다른 글
nestJS provider TypeError: Cannot read properties of undefined (reading 'get') (0) | 2024.08.17 |
---|---|
DTO와 Type의 차이 (0) | 2024.07.19 |
NestJS 모듈 순환 참조 (0) | 2024.07.19 |
NestJS에 대해 알아보자 (0) | 2024.07.19 |
NestJS ApiProperty 및 ApiQuery 데코레이터 (0) | 2024.07.19 |