[Spring] @Validated 활용

WOOK JONG KIM·2022년 11월 7일
0
post-thumbnail

@Validate는 자바에서 지원하는 어노테이션이며 스프링도 @Validated라는 별도의 어노테이션으로 유효성 검사 지원

유효성 검사를 그룹으로 묶어 대상을 특정할 수 있는 기능이 존재

그룹화 용도를 위한 마커 인터페이스 생성

public interface ValidationGroup1 {
}
public interface ValidationGroup2 {
}

DTO 생성

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
public class ValidatedRequestDto {
    @NotBlank
    String name;

    @Email
    String email;

    @Pattern(regexp = "01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$")
    String phoneNumber;

    @Min(value = 20, groups = ValidationGroup1.class) 
    @Max(value = 40, groups = ValidationGroup1.class)
    int age;

    @Size(min = 0, max = 40)
    String description;

    @Positive(groups = ValidationGroup2.class)
    int count;

    @AssertTrue
    boolean booleanCheck;
}

어느 그룹에 맞춰 유효성 검사를 실시할지 지정

@RestController
@RequestMapping("/validation")
public class ValidationController {

    private final Logger LOGGER = LoggerFactory.getLogger(ValidationController.class);

    @PostMapping("/validated")
    public ResponseEntity<String> checkValidation(
            @Validated @RequestBody ValidRequestDto validRequestDto){
        LOGGER.info(validRequestDto.toString());
        return ResponseEntity.status(HttpStatus.OK).body(validRequestDto.toString());
    }

    @PostMapping("/validated/group1")
    public ResponseEntity<String> checkValidation1(
            @Validated(ValidationGroup1.class) @RequestBody ValidatedRequestDto
            validatedRequestDto){
        LOGGER.info(validatedRequestDto.toString());
        return ResponseEntity.status(HttpStatus.OK).body(validatedRequestDto.toString());
    }

    @PostMapping("/validated/group2")
    public ResponseEntity<String> checkValidation2(
            @Validated(ValidationGroup2.class) @RequestBody ValidatedRequestDto
                    validatedRequestDto){
        LOGGER.info(validatedRequestDto.toString());
        return ResponseEntity.status(HttpStatus.OK).body(validatedRequestDto.toString());
    }

    @PostMapping("/validated/all-group")
    public ResponseEntity<String> checkValidation3(
            @Validated({ValidationGroup1.class, ValidationGroup2.class }) @RequestBody ValidatedRequestDto
            validatedRequestDto){
        LOGGER.info(validatedRequestDto.toString());
        return ResponseEntity.status(HttpStatus.OK).body(validatedRequestDto.toString());
    }
}

어노테이션에 그룹 속성을 각각 0,1,1,2개씩 적용 하였음

그룹을 0개 지정한 CheckValidation의 경우

age,count는 변수에 대한 유효성 검사를 통과하지 못하는 데이터 지만 정상적으로 통과함
-> @Validated 어노테이션에 특정 그룹 지정안할시 group 속성을 지정하지 않은 필드만 유효성을 검사

위 데이터를 통해 checkValidation1()을 호출하면 그룹으로 설정한 age에 대한 에러만 발생하고 checkValidation2()를 호출하면 그룹으로 설정한 count에 대한 오류만 발생하게 됨

checkValidation3() 메서드에 booleanCheck만 틀리게 한 경우 정상적으로 응답을 옴

즉 총 정리를 해보자면

  • @Validated 어노테이션에 특정 그룹을 설정하지 않은 경우에는 groups가 설정되지 않은 필드에 대해 유효성 검사 수행

  • @Validated 어노테이션에 특정 그룹을 설정하는 경우에는 지정된 그룹으로 설정된 필드에 대해서만 유효성 검사 수행

profile
Journey for Backend Developer

0개의 댓글