DTO(Data Transfer Object)는 계층 간 데이터 전송에 사용되는 객체입니다. 주로 컨트롤러, 서비스, 리포지토리 계층 간 또는 클라이언트와 서버 간 데이터를 교환하기 위해 사용됩니다. DTO는 데이터를 담는 데 집중하며, 비즈니스 로직을 포함하지 않습니다.
@Getter
@Setter
public class CreateQuestionRequest {
@NotBlank(message = "제목은 필수 항목입니다.")
private String subject;
@NotBlank(message = "내용은 필수 항목입니다.")
private String content;
}
응답 데이터 처리(Response DTO)
@Getter
@Setter
public class QuestionResponse {
private Long id;
private String subject;
private String content;
private LocalDateTime createdDate;
}
양방향 변환(엔티티 <-> DTO)
public class QuestionMapper {
public static Question toEntity(CreateQuestionRequest dto) {
Question question = new Question();
question.setSubject(dto.getSubject());
question.setContent(dto.getContent());
return question;
}
public static QuestionResponse toDTO(Question entity) {
QuestionResponse response = new QuestionResponse();
response.setId(entity.getId());
response.setSubject(entity.getSubject());
response.setContent(entity.getContent());
response.setCreatedDate(entity.getCreatedDate());
return response;
}
}
클라이언트 요청 (Request DTO)
@PostMapping("/questions")
public ResponseEntity<Void> createQuestion(@RequestBody @Valid CreateQuestionRequest dto) {
questionService.createQuestion(dto);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
서비스 계층에서 엔티티와 DTO 변환
public void createQuestion(CreateQuestionRequest dto) {
Question question = QuestionMapper.toEntity(dto);
questionRepository.save(question);
}
클라이언트 응답 (Response DTO)
@GetMapping("/questions/{id}")
public ResponseEntity<QuestionResponse> getQuestion(@PathVariable Long id) {
Question question = questionService.findById(id);
return ResponseEntity.ok(QuestionMapper.toDTO(question));
}
Spring Boot에서 DTO는 데이터의 캡슐화, 보안 강화, 유지보수 용이성, 유연한 API 설계, 데이터 유효성 검증 등의 이점을 제공합니다. 따라서, 대부분의 실무 프로젝트에서 DTO는 필수적인 구성 요소로 사용됩니다.