DTOに囲まれたDTO検証方法


@Valid検証の使用


スプリングを使用する場合は@Valid宣言を使用して検証し、プロジェクトを行う場合はimbeddyタイプのdtoオブジェクトを検証する必要がある場合があります.
例は次のとおりです.
コントローラからPOSTリクエストが発行されると、以下のように@Valid名が表示されます.
@PostMapping("/newProduct")
public void uploadNewProduct(@RequestBody @Valid ProductRequestDto productReqeustDto,
                         BindingResult bindingResult) {
ProductRequestDtoはDaumに等しい.
@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を有する埋め込みタイプである.
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にのみ関連しているため,2種類の検証は行われない.

解決策

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を貼り付けます.