DTO가 감싼 DTO 유효성 검사 방법

스브코·2022년 3월 16일
0

@Valid를 이용한 유효성 검증

스프링을 사용하다보면 @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를 붙여주면 된다.

profile
익히는 속도가 까먹는 속도를 추월하는 그날까지...

0개의 댓글