@Valid는 Bean Validation 스펙에 정의.[ Bean Validation를 이용해 커맨드 객체 값 검증 방법 ]
implementation("org.hibernate.validator:hibernate-validator:7.0.0.Final")
implementation("org.glassfish:jakarta.el:3.0.3")
public class RegisterRequest {
@NotBlank
@Email
private String email;
@Size(min=6)
private String password;
@NotEmpty
private String confirmPassword;
@NotEmpty
private String name;
...
Bean Validation 애노테이션이 적용된 커맨드 객체를 검증하기 위해 OptionalValidatorFactoryBean 클래스를 빈으로 등록
@EnableWebMvc 사용하면 OptionalValidatorFactoryBean 을 글로벌 범위 Validator로 등록함.
@Valid가 붙은 메서드를 이 글로벌 범위 Validator로 검증하자.
글로벌 범위 Validator를 따로 설정했을 경우, 삭제하지 않으면 글로벌 범위 Validator 로 사용하지 않음.
=> 스프링 MVC는 별도 설정한 글로벌 범위 Validator가 없을 경우에만, OptionalValidatorFactoryBean 을 글로벌 범위 Validator로 사용.

Bean Validation 프로바이더가 제공하는 기본 에러 메시지를 이용,
[ 기존 메시지 대신 새로 메시지만들고 싶을 때 ]
- 애노테이션이름.커맨드객체모델명.프로퍼티명
- 애노테이션이름.프로퍼티명
- 애노테이션 이름
위 규칙을 따르는 메시지 프로퍼티 파일을 추가하면 됨.
모든 애노테이션은 javax.validation.constraints 패키지에 정의됨.
@NotNull 제외한 나머지 애노테이션은 검사 대상이 null이면 유효한 것으로 판단.
따라서, 필수 입력을 원하면 @NotNull과 @Size를 같이 쓰면 됨.