DTO (Data Transfer Object)
Client --Request Data--→ Server 형식Server --Response Data-→ Client 형식DTO 필요 이유
요청 데이터 개수가 증가함에 따라 @RequestParam의 개수 증가
→ DTO 클래스가 요청데이터를 하나의 객체로 전달받는 역할을 해줌
유효성 검증 필요시마다 핸들러 내 유효성 검증 로직들로 코드 복잡해짐
→ DTO 클래스를 사용하면 유효성 검증 로직을 DTO 클래스로 빼내어 핸들러 메서드의 간결함을 유지
유효성 검증 : 서버 쪽에서 유효한 데이터를 전달 받기 위해 데이터를 검증하는 것
DTO 적용 시
직렬화(Serialization) : Java의 객체를 JSON 형식으로 변환
역직렬화(Deserialization) : JSON 형식을 Java 객체로 변환
DTO 클래스의 대표적 단점
DTO 유효성 검증 필요 이유
DTO 유효성 검증 적용
dependencies 항목에 추가dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
...
...
}
@Getter
public class CoffeePostDto {
@Id
private long coffeeId;
@NotBlank(message = "커피명(한글)은 공백이 아니어야 합니다.")
private String korName;
@Pattern(regexp = "^\\w(\\s?\\w)*$",
message = "커피명(영문)은 영문이어야 합니다.")
private String engName;
private Optional<@Range(min = 100, max = 50000) Integer> price = Optional.empty();
}@RestController
@RequestMapping("/v1/coffees)
@Validated // 해당 컨트롤러 클래스 내에 메서드에 검증조건이 있는경우 데이터검증 실행
public class CoffeeController {
@PostMapping
public ResponseEntity postCoffee(
@Valid @RequestBody CoffeePostDto coffeePostDto) {
return new ResponseEntity<>(coffeePostDto, HttpStatus.CREATED);
}
...
...
}데이터 검증 애너테이션
| Annotation | 설명 |
|---|---|
| @NotNull | Null 불가 |
| @Null | Null만 허용 |
| @NotEmpty | Null, "" 불가 |
| @NotBlank | Null, "", " " 불가 |
| @Size(min=,max=) | 문자열 길이 제한 |
| @Pattern(regexp = ) | 정규 표현식 검사 |
| 이메일 형식 검사, ""허용 | |
| @Max(value = ) | value 이하만 허용 |
| @Min(value = ) | value 이상만 허용 |
| @Positive | 양수의 값만 허용 |
| @PositiveOrZero | 양수, 0 만 허용 |
| @Negative | 음수의 값만 허용 |
| @NegativeOrZero | 음수, 0 만 허용 |
| @DecimalMax(value = ) | value 이하의 실수만 허용 |
| @DecimalMin(value = ) | value 이상의 실수만 허용 |
| @Future | 현재보다 미래 |
| @FutureOrPresent | 현재이거나 미래 |
| @Past | 현재보다 과거 |
| @PastOrPresent | 현재이거나 과거 |
| @AssertFalse | false여부, Null은 체크X |
| @AssertTrue | true여부, Null은 체크X |
| @Valid | 객체의 확인조건 만족할 경우만 허용 |
| @Digits(integer=,fraction=) | 대상 수가 integer와 fraction 자리수보다 적을 경우 허용 |