[Spring] @Valid와 @Validated

밀크야살빼자·2023년 5월 21일
0
post-thumbnail

@Valid

  • JSR-303 표준 스펙으로써 빈 검증기를 이용해 객체의 제약 조건을 검증하도록 지시하는 어노테이션이다.
  • 객체 안에서 들어오는 값에 대해 검증이 가능하다.
  • 그룹 유효성 검사를 지원하지 않는다.
  • 검증 로직을 통합하고, Layer에서 분리하여 관리할 수 있게 된다.
  • 컨트롤러 밖에서 사용 할 수 없다.
  • Dispatcher Servlet 사용한다.

@Valid를 사용하는 방법

@Getter
@Setter
public class MemberForm {

    @NotEmpty(message = "회원 이름은 필수 입니다.")
    private String name;
	
    @NotNull
    private String city;
    @NotNull
    private String street;
    @NotNull
    private String zipcode;
}

@PostMapping("/members/new")
    public String create(@Valid MemberForm form, BindingResult result){
    		...
        return "redirect:/";
    }
  • MemberForm 앞에 @Valid를 작성하면, MemberForm에 대한 검증을 수행한다.
  • 검증에 대한 세부적인 사항은 객체 안에 정의를 해두어야 한다.
  • @NotNull : 인자로 들어온 필드 값에 null 값을 허용하지 않는다.
  • 값이 올바르게 들어오지 않았다면 MethodArgumentNotValidException 예외와 400 Bad Request 상태코드를 반환하게 된다.

@Validated

  • 입력 파라미터의 유효성 검증은 컨트롤러에서 최대한 처리하고 넘겨주는 것이 좋다.
  • AOP기반으로 메소드의 요청을 가로채서 유효성 검증을 진행해준다.
  • spring 프레임워크에서 제공해주는 기능이다.
  • @Valid 확장 기능이다.
  • 그룹핑 목적에 사용한다.

@Validated를 사용하는 방법

@Service
@Validated
public class Service {

    public void add(@Valid Request request) {
        ...
    }
}

동작 원리
1. 클라이언트에서 컨트롤러 호출
2. Dispatcher Servlet에서 요청에 맞는 컨트롤러 탐색
3. RequestResponseBodyMethodProcessor 클래스의 resolverArgument 메소드 호출
4. AbstractMessageConverterMethodArgumentResolver 클래스의 validatIfApplicable 메소드 호출
5. ValidationAnnotationUtils 클래스의 determineValidationHints 메소드 호출
5-1. 어노테이션이 java.validation.Valid인지, Validated인지, Valid 로 시작하는지 확인 후 Object Array 리턴
6. DataBinder -> ValidatorAdapter -> SpringValidatorAdapter 를 통해 hibernate.validator의 ValidatorImpl 클래스 호출
6-1. ValidatorImpl 에서 검증 후 결과 리턴
7. 검증 결과 Errors 에 값이 있을 시 @Valid -> MethodArgumentNotValidException, @Validated -> ConstraintViolationException 발생

📜참고

https://kdhyo98.tistory.com/80

profile
기록기록기록기록기록

0개의 댓글