카테고리 없음

내일배움캠프 30일차 - Validation은 무엇일까!

본성 2024. 8. 27. 21:07
반응형

Spring 프레임워크는 천재만 알아들을 수 있는 언어일까???

 

흠 비전공자는 확실히 어렵다 ㅠㅠ

 

그래도 꾸준히 하면 좋은 성과가 있겠지???

 

가보자!


Validation은 무엇일까!

 

Validation이란?

 

1. Spring Validation 이란?

- 클라이언트에서 서버로 값을 전달하고자 할 때 (@RequestBody, @RequestParam, @PathVariable) 전달되는 데이터에 대해 유효성 검증을 수행하며 유효하지 않을 경우 에러(MethodArgumentNotValidException)를 발생하도록 처리하는 기능을 수행하는 라이브러리입니다.

 

2. Vaildation은

  • 검증할 값이 많을 경우 코드가 복잡
  • validation은 재사용성이 높아야 하고, Service Logic과의 분리가 필요
  • Logic이 변경되어야 할 때에 Validation이 같이 들어가면 매우 난잡해진다

3.  @Valid 와 @Validated를 이용한 유효성 검증의 동작 원리 및 사용법에 대해서 알아볼 것이다.

 

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

 

5. JSR 표준의 빈 검증 기술의 특징은 객체의 필드에 달린 어노테이션으로 편리하게 검증을 한다는 것이다.

 

6. Spring에서는 일종의 어댑터인 LocalValidatorFactoryBean가 제약 조건 검증을 처리한다. 

 

7. 이를 이용하려면 LocalValidatorFactoryBean을 빈으로 등록해야 하는데, SpringBoot에서는 아래의 의존성만 추가해 주면 해당 기능들이 자동 설정된다.

 

8. @Valid 동작원리로는 모든 요청은 프론트 컨트롤러인 디스패처 서블릿을 통해 컨트롤러로 전달된다.

 

9. 전달 과정에서는 컨트롤러 메소드의 객체를 만들어주는 ArgumentResolver가 동작하는데, @Valid 역시 ArgumentResolver에 의해 처리가 된다.

 

10. 대표적으로 @RequestBody는 Json 메세지를 객체로 변환해 주는 작업이 ArgumentResolver의 구현체인  RequestResponseBodyMethodProcessor가 처리하며, 이 내부에서 @Valid로 시작하는 어노테이션이 있을 경우에 유효성 검사를 진행한다. (이러한 이유로 @Valid가 아니라 커스톰 어노테이션인 @ValidMangKyu여도 동작한다.)

 

11. 만약 @ModelAttribute를 사용중이라면 ModelAttributeMethodProcessor에 의해 @Valid가 처리된다.

 

12. @Validated는 입력 파라미터의 유효성 검증은 컨트롤러에서 최대한 처리하고 넘겨주는 것이 좋다.

 

13. 하지만 개발을 하다보면 불가피하게 다른 곳에서 파라미터를 검증해야 할 수 있다.

 

14. Spring에서는 이를 위해 AOP 기반으로 메소드의 요청을 가로채서 유효성 검증을 진행해주는 @Validated를 제공하고 있다.

 

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

 

16. @Validated는 특정 ArgumnetResolver에 의해 유효성 검사가 진행되었던 @Valid와 달리, @Validated는 AOP 기반으로 메소드 요청을 인터셉터하여 처리된다.

 

17. @Validated를 클래스 레벨에 선언하면 해당 클래스에 유효성 검증을 위한 AOP의 어드바이스 또는 인터셉터(MethodValidationInterceptor)가 등록된다. 그리고 해당 클래스의 메소드들이 호출될 때 AOP의 포인트 컷으로써 요청을 가로채서 유효성 검증을 진행한다.

 

18. 이러한 이유로 @Validated를 사용하면 컨트롤러, 서비스, 레포지토리 등 계층에 무관하게 스프링 빈이라면 유효성 검증을 진행할 수 있다. 대신 클래스에는 유효성 검증 AOP가 적용되도록 @Validated를, 검증을 진행할 메소드에는 @Valid를 선언해주어야 한다.

 

19. @Valid에 의한 예외는 MethodArgumentNotValidException이며, @Validated에 의한 예외는  ConstraintViolationException이다. 이를 알고 있으면 나중에 예외 처리를 할 때 도움이 된다.

 

20. 이렇게 두가지의 상태를 알 수 있다. 그리고 두 상태의 차이점으로

 @Valid
  • JSR-303 자바 표준 스펙
  • 특정 ArgumentResolver를 통해 진행되어 컨트롤러 메소드의 유효성 검증만 가능하다.
  • 유효성 검증에 실패할 경우 MethodArgumentNotValidException이 발생한다
@Validated
  • 자바 표준 스펙이 아닌 스프링 프레임워크가 제공하는 기능
  • AOP를 기반으로 스프링 빈의 유효성 검증을 위해 사용되며 클래스에는 @Validated를, 메소드에는 @Valid를 붙여주어야 한다.
  • 유효성 검증에 실패할 경우 ConstraintViolationException이 발생한다.

 

 


https://adjh54.tistory.com/77

 

[Java/Library] Spring Boot Validation 이해하기 : 데이터 유효성 검증

해당 글에서는 Spring Validation 라이브러리를 이용하여 클라이언트에서 전송된 '데이터'를 유효성 검증을 처리하는 방법에 대해서 공유합니다. 1) 개발 환경 💡 Spring Validation 구성을 위한 사용된

adjh54.tistory.com

 

https://mangkyu.tistory.com/174

 

[Spring] @Valid와 @Validated를 이용한 유효성 검증의 동작 원리 및 사용법 예시 - (1/2)

Spring으로 개발을 하다 보면 DTO 또는 객체를 검증해야 하는 경우가 있습니다. 이를 별도의 검증 클래스로 만들어 사용할 수 있지만 간단한 검증의 경우에는 JSR 표준을 이용해 간결하게 처리할 수

mangkyu.tistory.com

 

<출처>


오늘의 느낀 점

 

1. 외계어의 등장

 

2. 등장으로 인한 심란함

 

3. 심란함의 두려움

 

just do it!

반응형