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 자리수보다 적을 경우 허용 |