말 그대로 데이터 전송 용도의 객체
를 의미한다.
DTO는 보통 여러 필드로 구성되어 있고 비즈니스 로직을 포함하지 않으며, 오직 데이터만을 저장하고 전달하는 객체이다.
따라서 서로 다른 객체 간의 데이터 교환을 용이하게 해 준다는 특징이 있다.
// 레거시 코드
@PostMapping
public ResponseEntity postMember(@RequestParam("email") String email,
@RequestParam("name") String name,
@RequestParam("phone") String phone) {
// 유효성 검증
// 데이터 객체 생성
...
}
// DTO 적용
@PostMapping
public ResponseEntity postMember(@Valid MemberDto memberDto) {
}
@RequestParam
등의 파라미터를 줄일 수 있음@Getter
@Setter
public class MemberPostDto {
private String email;
private String name;
private String phone;
}
@PostMapping
public ResponseEntity postMember(@RequestBody MemberPostDto memberPostDto) {
return new ResponseEntity<>(memberPostDto, HttpStatus.CREATED);
}
@RequestBody
@ResponseBody
ResponseEntity
클래서의 객체이므로 @ResponseBody
를 사용하지 않음build.gradle
라이브러리 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
...
...
}
DTO 클래스에 유효성 검증 코드 추가
@Getter
@Setter
public class MemberPostDto {
@NotBlank // null, 공백, 스페이스 등의 값을 하용하지 않음
@Email // 유효한 이메일 주소인지 검증
private String email;
// 유효성 검증에 실패하면 message가 콘솔에 출력됨
@NotBlank(message = "이름은 공백이 아니어야 합니다.")
private String name;
// 정규표현식에 매치되는 유효한 번호인지 검증
@Pattern(regexp = "^010-\\d{3,4}-\\d{4}$",
message = "휴대폰 번호는 010으로 시작하는 11자리 숫자와 하이픈으로 구성되어야 합니다."))
private String phone;
}
💡 정규표현식 테스트 사이트 👉🏻 https://regexr.com/
Controller에 @Valid
애너테이션 추가
@PostMapping
public ResponseEntity postMember(@Valid @RequestBody MemberPostDto memberPostDto) {
return new ResponseEntity<>(memberPostDto, HttpStatus.CREATED);
}
직렬화(Serialization)
역직렬화(Deserialization)
JSON 포맷 ↔ Java 클래스 변경 온라인 툴
https://jsonformatter.org/json-to-java