
@Valid는 Java Bean Validation을 이용해서 객체의 유효성을 검사하는 데에 사용하는 어노테이션이다.
Spring Framework에서 @Valid 어노테이션을 사용하면 Controller 메서드의 매개변수로 전달되는 객체의 유효성을 검사할 수 있다.

    @PostMapping("/user/signup")
    public String signup(@Valid SignupRequestDto requestDto, BindingResult bindingResult) {
        // Validation 예외처리
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        if(fieldErrors.size() > 0) {
            for (FieldError fieldError : bindingResult.getFieldErrors()) {
                log.error(fieldError.getField() + " 필드 : " + fieldError.getDefaultMessage());
            }
            return "redirect:/api/user/signup";
        }
        userService.signup(requestDto);
        return "redirect:/api/user/login-page";
    }

@Getter
@Setter
public class SignupRequestDto {
    @NotBlank
    private String username;
    @NotBlank
    private String password;
    @Email
    @NotBlank
    private String email;
    private boolean admin = false;
    private String adminToken = "";
}
@Valid SignupRequestDto requestDto는 SignupRequestDto 객체의 유효성 검사를 트리거한다. 유효성 검사는 SignupRequestDto 내에 정의된 어노테이션들 (@NotBlank, @Email 등)을 기반으로 진행된다. 만약 유효성 검사에서 오류가 발생한다면, 해당 오류들은 BindingResult 객체에 리스트 형태로 저장된다.
--
Controller Method에 @Valid 사용:
@Valid를 사용하여 객체의 유효성을 검사할 수 있다.public String register(@Valid User user, BindingResult bindingResult) { ... }
BindingResult 사용:
BindingResult 객체에 저장된다.BindingResult 객체는 @Valid 어노테이션을 사용한 객체 바로 뒤에 위치해야 한다.bindingResult.hasErrors() 메서드를 사용하여 오류가 있는지 확인할 수 있다.bindingResult.getFieldErrors()를 사용하면 발생한 모든 필드 오류를 가져올 수 있다.Error Handling:
BindingResult를 사용하여 오류가 발생한 경우, 해당 오류를 처리하거나 사용자에게 오류 메시지를 보여줄 수 있다.if (bindingResult.hasErrors()) {
    // Handle validation errors
}
Custom Error Messages:
public class User {
    @NotBlank(message = "Username cannot be empty!")
    private String username;
    ...
}
Global Error Handling:
@ControllerAdvice와 @ExceptionHandler를 사용하여 전역적으로 유효성 검사 오류를 처리할 수 있다. 이렇게 하면 각 컨트롤러 메서드에서 오류를 처리하는 대신 중앙 집중식으로 오류를 처리할 수 있다.Custom Validations: