Validation(검증)
Bean Validation은 특정한 구현체가 아니라 Bean Validation 2.0(JSR-380) 기술 표준
검증 로직을 모든 프로젝트에 적용할 수 있게 공통화 및 표준화 한 것으로, 이를 잘 활용하면, 애노테이션 하나(@Valid
/ @Validated
)로 검증 로직을 매우 편리하게 적용할 수 있다.
@Valid
JSR-303(자바) 표준 스펙으로, 빈 검증기(Bean Validator
)를 이용해 제약 조건을 검증한다.
동작 원리
서버로 오는 요청은 아래의 프로세스를 거치게 된다.
프론트 컨트롤러(디스패처 서블릿)을 통해 컨트롤러로 전달
컨트롤러 메서드의 객체를 만들어주는 Argument Resolver 동작
ArgumentResolver에서 @Valid 어노테이션이 있는 경우 해당 객체에 대한 검증을 수행
검증에 실패하면
MethodArgumentNotValidException
예외 발생
Argument Resolver에서 검증을 수행하기 때문에 컨트롤러에서만 동작하게 되며, 컨트롤러가 아닌 곳에서는 동작하지 않는다.
@Validated
Spring 프레임워크에서 제공하는 애노테이션으로, 컨트롤러가 아닌 곳에서도 검증을 수행할 수 있다.
컨트롤러가 아닌 곳에서 검증을 수행하려면 @Validated
를 클래스 레벨에 선언한 뒤, 검증을 수행하고자 하는 메서드에 파라미터에 @Valid
를 선언해야 한다.
동작 원리(클래스 레벨에 선언한 경우)
Validated는 AOP 기반으로 메서드 요청을 인터셉터하여 처리하게 된다.
해당 클래스에 유효성 검증을 위한 인터셉터(MethodValidationInterceptor) 등록
해당 클래스의 메서드들이 호출될 때 요청을 가로채서 유효성 검증 수행
검증에 실패하면
ConstraintViolationException
예외 발생
@Valid vs @Validated
JSR-303 표준 스펙
Spring 프레임워크에서 제공
ArgumentResolver에서 검증을 수행
AOP 기반으로 검증을 수행
컨트롤러에서만 동작
컨트롤러가 아닌 모든 곳에서 동작
MethodArgumentNotValidException
예외 발생
ConstraintViolationException
예외 발생
참고자료
Last updated
Was this helpful?