@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 어노테이션에 특정 그룹을 설정하는 경우에는 지정된 그룹으로 설정된 필드에 대해서만 유효성 검사 수행