자바 표준 검증 어노테이션이다. 컨트롤러의 메소드에 작성한다. 컨트롤러에서만 동작
다른 계층에서의 검증이 필요할 때는 @Validated와 결합해야 한다.
@Valid에 의한 예외 클래스는 MethodArgumentNotValidException이다.
스프링에서 제공하는 검증 어노테이션이다.
@Validated를 클래스명 위에 작성하고, 유효성을 검증할 메소드에 @Valid를 작성해야 한다.
@Validated에 의한 예외 클래스는 ConstraintViolationException이다.
###t Dto의 유효성검사
@Getter
public class SignupRequestDto {
@Pattern(regexp ="^[a-z0-9]{4,10}$", message = "아이디는 4자 이상 10자리 미만의 영소문자, 숫자만 사용이 가능합니다.")
private String username;
@Pattern(regexp ="^[a-zA-Z\\d`~!@#$%^&*()-_=+]{8,15}$", message = "비밀번호는 8자 이상 15자리 미만의 영대소문자, 숫자만 사용이 가능합니다.")
private String password;
private Boolean admin = false;
}
유효성 검사를 다음과 같이 진행한다면 Controller에서는 다음과 같이 @Valid를 사용할 수 있다.
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
@PostMapping("/signup")
public ResponseEntity<Object> signup(@Valid @RequestBody SignupRequestDto userRequestDto, BindingResult bindingResult) {
return userService.signup(userRequestDto,bindingResult);
}
여기서 BindingResult
스프링이 제공하는 검증 오류 보관 객체이다
데이터에 유효하지 않은 속성이 있다면, 그에 대한 오류 정보가 담긴다.
해당 정보를 컨트롤러에 전달해 오류 페이지를 별도로 처리해 줄 수 있다.
단! Controller에 사용시 반드시 @Valid 뒤에 위치해야 한다.
if (bindingResult.hasErrors()) {
return ResponseEntity.badRequest() //status : BAD request
.body(MessageResponseDto.builder()
.message(bindingResult.getAllErrors().get(0).getDefaultMessage()));//vaild에서 예외 발생시 해당 메시지를 출력한다.
}
이해하기 쉽지 않은 부분이나 다음과 같이 순서대로 분리해서 생각해 볼 수 있다.
BindingResult는
public interface BindingResult extends Errors
다음곽 같이 Errors 를 상속받는다
Errors 인터페이스는 다음과 같은 메소드를 가진다
public interface Errors {
/**
주어진 Errors 인스턴스의 모든 오류를 이 Errors 인스턴스에 추가합니다.
이것은 Errors 인스턴스를 다른 Errors 인스턴스로 병합하기 위한 반복된 reject(..) 호출을 피하기 위한 편리한 방법입니다.
전달된 Errors 인스턴스는 동일한 대상 개체를 참조하거나 최소한 이 Errors 인스턴스의 대상 개체에 적용되는 호환 가능한 오류를 포함해야 합니다.
매개변수:errors – 병합할 Errors 인스턴스
*/
void addAllErrors(Errors errors);
}
그리고 getDefaultMessage()는 다음곽 같다.
public class DefaultMessageSourceResolvable implements MessageSourceResolvable, Serializable {
public DefaultMessageSourceResolvable(
@Nullable String[] codes, @Nullable Object[] arguments, @Nullable String defaultMessage) {
this.codes = codes;
this.arguments = arguments;
this.defaultMessage = defaultMessage;
}
@Override
@Nullable
public String getDefaultMessage() {
return this.defaultMessage;
}
여기서