<TIL> 53. @Valid, @Validated

YUJIN LEE·2023년 3월 10일
0

개발log

목록 보기
48/149

@Valid

@Valid는 JSR-303 표준 스펙(자바 진영 스펙)으로써 빈 검증기(Bean Validator)를 이용해 객체의 제약 조건을 검증하도록 지시하는 어노테이션

JSR 표준의 빈 검증 기술의 특징 - 필드에 달린 어노테이션으로 편리하게 검증 가능

동작원리

모든 요청은 프론트 컨트롤러인 디스패쳐 서블릿을 통해 컨트롤러로 전달.
전달 과정에서 컨트롤러 메소드의 객체를 만들어주는 ArgumentResolver 동작.
@Valid 역시 ArgumentResolver에 의해 처리.

대표적으로 @RequestBody - Json 메세지를 객체로 변환해주는 작업이 ArgumentResolver의 구현체인 RequestResponseBodyMethodProcessor가 처리하며,
내부에서 @Valid로 시작하는 어노테이션이 있을 경우 유효성 검사 진행.
만약 @ModelAttribute를 사용중이라면 ModelAttributeMethodProcessor에 의해 @Valid가 처리.

@Valid는 기본적으로 컨트롤러에서만 동작.
다른 계층에서 파라미터를 검증하기 위해서는 @Validated와 결합되어야 함.

@Valid를 이용한 검증

  1. 의존성 추가
  2. 검증할 객체 및 제약사항 추가
  3. 테스트 코드 작성 및 실행
  4. 테스트 코드 실행 및 결과 확인

@Validated

입력 파라미터의 유효성 검증은 컨트롤러에서 최대한 처리하고 넘겨주는게 좋다.
하지만, 개발을 하다보면 불가피한 상황이 벌어지기 때문에
Spring에서는 이를 위해 AOP 기반으로 메소드의 요청을 가로채 유효성 검증을 진행해주는
@Validated를 제공.

@Validated는 JSR 표준 기술이 아니고, Spring 프레임워크에서 제공하는 어노테이션 및 기능.

동작원리

@Validated는 AOP 기반으로 메소드 요청을 인터셉터하여 처리.
@Validated를 클래스 레벨에 선언하면 해당 클래스에 유효성 검증을 위한 AOP의 어드바이스 또는 인터셉터(MethodValidationInterceptor)가 등록.
해당 클래스의 메소드들이 호출될 때 AOP의 포인트 컷으로써 요청을 가로채 유효성 검증 진행.
@Validated를 사용시 컨트롤러, 서비스, 레포지토리 등 계층에 무관하게 스프링 빈이라면 유효성 검증을 진행할 수 있다.
대신 클래스에는 유효성 검증 AOP가 적용되도록 @Validated를,
검증을 진행할 메소드에는 @Valid를 선언해주어야 한다.

이러한 이유로
@Valid에 대한 예외 - MethodArgumentNotValidException.
@Validated에 의한 예외 - ConstrainViolationException.

Validated의 또 다른 기능(유효성 검증 그룹의 지정)

@Valid, @Validated 유효성 검증 차이

@Valid

  • JSR-303 자바 표준 스펙
  • 특정 ArgumentResolver를 통해 진행되어 컨트롤러 메소드의 유효성 검증만 가능
  • 유효성 검증에 실패할 경우 MethodArgumentNotValidException이 발생

@Validated

  • 자바 표준 스펙이 아닌 스프링 프레임워크가 제공하는 기능
  • AOP를 기반으로 스프링 빈의 유효성 검증을 위해 사용,
    클래스에는 @Validated를, 메소드에는 @Valid를 붙여주어야한다.
  • 유효성 검증에 실패할 시 ConstrainViolationException 발생
profile
인정받는 개발자가 되고싶습니다.

0개의 댓글