
BindingResult는 @Valid나 @Validated로 검증을 실행한 후, 데이터 바인딩이나 검증 과정에서 발생한 오류들을 저장하고 관리하는 객체이다.
예를 들어, 폼 데이터를 객체에 바인딩하고 나서 해당 객체의 필드 값이 유효성 제약 (예: @NotNull, @Size 등)에 어긋나면, 그 오류 정보가 BindingResult에 기록된다. 이때, hasErrors()나 hasFieldErrors() 같은 메서드를 통해 오류가 있는지 확인하고, getFieldError()나 getAllErrors()를 통해 구체적인 오류 메시지를 조회할 수 있다.
| 메소드 | 설명 |
|---|---|
| hasErrors() | 전체 오류가 존재하는지 여부를 Boolean 값으로 반환 |
| hasFieldErrors() | 특정 필드 또는 전체 필드 중에서 오류가 있는지 여부를 확인 hasFieldErrors() : 모든 필드에 대해 오류가 있는지 확인. hasFieldErrors(String field) : 특정 필드에 오류가 있는지 확인. |
| getFieldError() | 특정 필드에 대해 발생한 첫 번째 오류 (FieldError 객체)를 반환 getFieldError() : 전체 필드 중 첫 번째 오류를 반환. getFieldError(String field) : 지정한 필드의 첫 번째 오류를 반환. |
| getAllErrors() | 전체 오류(ObjectError 리스트)를 반환. 이 리스트에는 전역 오류 (global errors)와 필드 오류 (field errors)가 모두 포함 |
JSR-303 / JSR-380 표준에 따른 유효성 검증을 실행한다.
주로 DTO나 폼 객체에 붙여서, 해당 객체의 필드에 정의한 제약 조건 (@NotNull, @Size, @Email 등)을 검사하게 한다. 스프링 MVC에서는 컨트롤러 메소드의 파라미터에 붙이면, 요청 데이터가 자동으로 검증되고, 오류가 있으면 BindingResult에 담아서 처리할 수 있다.
✍️ 예시 코드 작성
@PostMapping("/signup")
public ResponseEntity<String> signUp(@Valid @RequestBody SignUpForm form, BindingResult result) {
if (result.hasErrors()) {
// 검증 실패 시 처리 로직
return ResponseEntity.badRequest().body("입력 값이 올바르지 않아.");
}
// 정상 처리
return ResponseEntity.ok("회원가입 성공!");
}
@Valid를 사용해서 SignUpForm 객체에 적용된 제약조건 (@NotBlank, @Email, @Size 등)을 검사한다.
@Valid와 비슷하게 유효성 검증을 수행하지만, 그룹 (Group) 단위로 검증할 수 있는 추가 기능을 제공한다.
클래스나 메소드 레벨에 붙여서, 특정 조건 (예: 등록할 때와 수정할 때 다르게 검증)을 설정할 수 있어.
스프링 프레임워크에서 제공하는 어노테이션이라서, AOP와 결합해서 메소드 호출 전에 검증할 때도 사용된다.
✍️ 예시 코드 작성
@PostMapping("/update")
public ResponseEntity<String> updateUser(@Validated(UpdateGroup.class) @RequestBody UserForm form, BindingResult result) {
// 그룹 UpdateGroup에 해당하는 제약조건 검증
...
}
만약 그룹을 지정해서 조건마다 다른 검증을 하고 싶다면, @Validated를 사용한다.
제약 조건 어노테이션은 Bean Validation API의 일부로 제공되는 제약 조건 어노테이션이다. Bean Validation은 Java 표준인 JSR-380에 따라 데이터 검증을 위한 어노테이션을 제공한다. 이 어노테이션들은 필드, 메소드 파라미터, 메소드 반환값 등에 적용할 수 있어 객체의 유효성을 검사하는 데 널리 사용 된다.
필드가 null이 아니고, 비어있는 문자열이나 컬렉션이 아님을 보장
✍️ 예시 코드 작성
@NotEmpty(message = "The field must not be empty")
private String username;
message : 조건을 만족하지 않을 경우 출력할 오류 메시지.
문자열, 배열, 컬렉션 등의 크기 (길이 또는 요소 수)가 지정한 최소값과 최대값 사이에 있어야 함.
✍️ 예시 코드 작성
@Size(min = 2, max = 14, message = "The size must be between 2 and 14")
private String nickname;
min : 허용되는 최소 길이나 크기.
max : 허용되는 최대 길이나 크기.
message : 조건을 만족하지 않을 경우 출력할 오류 메시지.
필드가 null이 아님을 보장
✍️ 예시 코드 작성
@NotNull(message = "The field cannot be null")
private String email;
message : 조건을 만족하지 않을 경우 출력할 오류 메시지.
문자열이 올바른 이메일 형식을 따르는지 검증
✍️ 예시 코드 작성
@Email(message = "Invalid email format")
private String email;
message : 조건을 만족하지 않을 경우 출력할 오류 메시지.
숫자 필드가 지정한 최소값 (@Min) 이상, 최대값 (@Max) 이하임을 보장
✍️ 예시 코드 작성
@Min(value = 18, message = "Age must be at least 18")
@Max(value = 65, message = "Age must be no more than 65")
private int age;
@Min의 value : 숫자가 가져야 할 최소값. 예시에서는 나이가 18세 이상이어야 함.
@Max의 value : 숫자가 가져야 할 최대값. 예시에서는 나이가 65세 이하이어야 함.
message : 조건을 만족하지 않을 경우 출력할 오류 메시지.
숫자 필드가 양수인지 (0 미포함 또는 포함) 검증
✍️ 예시 코드 작성
@Positive(message = "The value must be positive")
private int quantity;
@PositiveOrZero(message = "The value must be positive or zero")
private int balance;
message : 조건을 만족하지 않을 경우 출력할 오류 메시지.
숫자 필드가 음수인지 (0 미포함 또는 포함) 검증
✍️ 예시 코드 작성
@Negative(message = "The value must be negative")
private int debt;
@NegativeOrZero(message = "The value must be negative or zero")
private int temperature;
message : 조건을 만족하지 않을 경우 출력할 오류 메시지.
멋쟁이사자처럼 강의자료