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

 

DTO란 무엇이고 왜 사용해야 할까?

밑의 예제 코드는 전부 NestJS + TypeOrm 환경에서 작성되었습니다. 트리스티가 Nest Js를 공부하며 남긴 기록입니다. 틀린 내용은 언제든지 말씀해주세요 ~! 📢 DTO란 무엇인가요? DTO(Data Transfer Object,

tristy.tistory.com

 

DTO의 개념과 사용범위

DTO는 우테코 과정 중 정말 많이 들어봤고, 나름 사용도 많이 했지만 이상하게 바람직하게 사용하고 있다는 확신이 들지 않는 개념이다. DTO에 대한 내용은 항상 새롭게 알아가는데, 이러다간 DTO

hudi.blog

 

300x250
728x90