스프링을 사용하다보면 @Valid 어노테이션을 활용하여 유효성 검증을 하는데 프로젝트를 진행하다보니 중첩 dto 객체를 유효성 검사 해주어야 하는 상황이 나타났다.
예시를 보면 다음과 같다.
컨트롤러에서 다음과 같이 post 요청이 들어올때 @Valid 어노테이션을 붙여준다.
@PostMapping("/newProduct")
public void uploadNewProduct(@RequestBody @Valid ProductRequestDto productReqeustDto,
BindingResult bindingResult) {
ProductRequestDto는 다옴과 같다.
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Getter
public class ProductRequestDto {
@NotBlank(message = "상품 이름은 공백일 수 없습니다.", groups = PostValidationGroup.class)
private String name;
@NotBlank(message = "상품 설명은 공백일 수 없습니다.", groups = PostValidationGroup.class)
private String description;
private DeliveryRequestDto delivery;
private List<OptionRequestDto> options;
위와 같이 ProductRequestDto는 DeliveryRequestDto와 OptionRequestDto를 가지고 지니고 있는 embedded타입인데,
public class DeliveryRequestDto {
@NotBlank(message = "배송 타입은 공백일 수 없습니다.", groups = PostValidationGroup.class)
private String type;
@NotBlank(message = "마감 시간은 공백일 수 없습니다.", groups = PostValidationGroup.class)
private String closing;
private int price;
}
public class OptionRequestDto {
@NotBlank(message = "옵션 이름은 공백일 수 없습니다.", groups = PostValidationGroup.class)
private String name;
private int price;
private int stock;
}
두 클래스 모두 유효성 검사가 필요하다.
하지만, @Valid 어노테이션은 ProductRequest에만 붙어있어서 두 클래스의 유효성 검사는 이루어 지지 않는다.
public class ProductRequestDto {
@NotBlank(message = "상품 이름은 공백일 수 없습니다.", groups = PostValidationGroup.class)
private String name;
@NotBlank(message = "상품 설명은 공백일 수 없습니다.", groups = PostValidationGroup.class)
private String description;
@Valid
private DeliveryRequestDto delivery;
@Valid
private List<OptionRequestDto> options;
ProductRequestDto안의 Dto객체에 @Valid를 붙여주면 된다.