Q1:
@Validated
애너테이션을 작성 안해도 @Valid @RequestBody~~
가 정상작동 하는 이유는?
A1:
질문부터 잘못 됐다. @Valid
가 붙어있으니 당연히 @RequestBody~~
가 정상작동 하는 것이다.
@Valid @Validated 동작 원리참고
@Validated와 @Valid는 패키지 소속이 다르다. 즉, 유효성 검증에 사용할 수 있는 애너테이션의 종류에 차이가 있다.
(cf. @Validated는 @Valid를 포함함)
Q2:
@Validated와 @Valid에 대해 찾아보니 @Validated는 @Valid의 기능을 포함하고 있으며, 유효성을 검증할 옵션에 대한 그룹을 지정할 수 있는 기능도 추가로 갖고 있다는데 그럼 그냥 @Validated를 사용하는게 편한게 아닐까? 포함관계라는데 @Valid를 써야하는 이유가 있을지 조사해보자.
(일단, 실습과제에서 @Valid를 @Validated로 바꿔도 정상작동한다.)
A2:
우선 결론부터 말하자면, 꼭 @Valid만 써야한다 @Validated만 써야한다 이런 정해진 법칙은 없다.
다만, @Valid는 Java 진영에서 정해놓은 표준 스펙이고, @Validated는 Spring Framework에서 만든(표준 스펙도 준수함) 확장 애너테이션인데 그룹 기능은 @Validated 애너테이션만 가지고 있는 기능이 아니고 둘 다 가지고 있다.
(사용하는 방법이나 표현되는 부분이 조금 다를뿐..)
개발자로 일하다보면 표준 이라는걸 준수하는 방향으로 일을 하는 경우가 굉장히 많다.
@Valid 는 MethodArgumentResolver가 Controller의 핸들러 메서드에 argument를 전달하기 전에 유효성 검증을 진행하고, @Validated는 AOP를 이용해서 핸들러 메서드의 호출 전에 유효성 검증을 진행한다는 차이점이 있다.