BindingResult와 제약 조건 어노테이션

CJI0524·2025년 3월 10일

Spring Boot

목록 보기
17/21

1. BindingResult 클래스란?

BindingResult@Valid@Validated로 검증을 실행한 후, 데이터 바인딩이나 검증 과정에서 발생한 오류들을 저장하고 관리하는 객체이다.

예를 들어, 폼 데이터를 객체에 바인딩하고 나서 해당 객체의 필드 값이 유효성 제약 (예: @NotNull, @Size 등)에 어긋나면, 그 오류 정보가 BindingResult에 기록된다. 이때, hasErrors()hasFieldErrors() 같은 메서드를 통해 오류가 있는지 확인하고, getFieldError()getAllErrors()를 통해 구체적인 오류 메시지를 조회할 수 있다.

1.1. BindingResult의 메소드

메소드설명
hasErrors()전체 오류가 존재하는지 여부를 Boolean 값으로 반환
hasFieldErrors()특정 필드 또는 전체 필드 중에서 오류가 있는지 여부를 확인
hasFieldErrors() : 모든 필드에 대해 오류가 있는지 확인.
hasFieldErrors(String field) : 특정 필드에 오류가 있는지 확인.
getFieldError()특정 필드에 대해 발생한 첫 번째 오류 (FieldError 객체)를 반환
getFieldError() : 전체 필드 중 첫 번째 오류를 반환.
getFieldError(String field) : 지정한 필드의 첫 번째 오류를 반환.
getAllErrors()전체 오류(ObjectError 리스트)를 반환.
이 리스트에는 전역 오류 (global errors)와 필드 오류 (field errors)가 모두 포함

1.2. @Valid

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 등)을 검사한다.


1.3. @Validated

@Valid와 비슷하게 유효성 검증을 수행하지만, 그룹 (Group) 단위로 검증할 수 있는 추가 기능을 제공한다.
클래스나 메소드 레벨에 붙여서, 특정 조건 (예: 등록할 때와 수정할 때 다르게 검증)을 설정할 수 있어.
스프링 프레임워크에서 제공하는 어노테이션이라서, AOP와 결합해서 메소드 호출 전에 검증할 때도 사용된다.

✍️ 예시 코드 작성

@PostMapping("/update")
public ResponseEntity<String> updateUser(@Validated(UpdateGroup.class) @RequestBody UserForm form, BindingResult result) {
    // 그룹 UpdateGroup에 해당하는 제약조건 검증
    ...
}

만약 그룹을 지정해서 조건마다 다른 검증을 하고 싶다면, @Validated를 사용한다.

2. 제약 조건 어노테이션

제약 조건 어노테이션은 Bean Validation API의 일부로 제공되는 제약 조건 어노테이션이다. Bean ValidationJava 표준인 JSR-380에 따라 데이터 검증을 위한 어노테이션을 제공한다. 이 어노테이션들은 필드, 메소드 파라미터, 메소드 반환값 등에 적용할 수 있어 객체의 유효성을 검사하는 데 널리 사용 된다.

2.1. @NotEmpty

필드가 null이 아니고, 비어있는 문자열이나 컬렉션이 아님을 보장

✍️ 예시 코드 작성

@NotEmpty(message = "The field must not be empty")
private String username;

message : 조건을 만족하지 않을 경우 출력할 오류 메시지.


2.2. @Size

문자열, 배열, 컬렉션 등의 크기 (길이 또는 요소 수)가 지정한 최소값과 최대값 사이에 있어야 함.

✍️ 예시 코드 작성

@Size(min = 2, max = 14, message = "The size must be between 2 and 14")
private String nickname;

min : 허용되는 최소 길이나 크기.
max : 허용되는 최대 길이나 크기.
message : 조건을 만족하지 않을 경우 출력할 오류 메시지.


2.3. @NotNull

필드가 null이 아님을 보장

✍️ 예시 코드 작성

@NotNull(message = "The field cannot be null")
private String email;

message : 조건을 만족하지 않을 경우 출력할 오류 메시지.


2.4. @Email

문자열이 올바른 이메일 형식을 따르는지 검증

✍️ 예시 코드 작성

@Email(message = "Invalid email format")
private String email;

message : 조건을 만족하지 않을 경우 출력할 오류 메시지.


2.5. @Min 및 @Max

숫자 필드가 지정한 최소값 (@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;

@Minvalue : 숫자가 가져야 할 최소값. 예시에서는 나이가 18세 이상이어야 함.
@Maxvalue : 숫자가 가져야 할 최대값. 예시에서는 나이가 65세 이하이어야 함.
message : 조건을 만족하지 않을 경우 출력할 오류 메시지.


2.6. @Positive 및 @PositiveOrZero

숫자 필드가 양수인지 (0 미포함 또는 포함) 검증

✍️ 예시 코드 작성

@Positive(message = "The value must be positive")
private int quantity;

@PositiveOrZero(message = "The value must be positive or zero")
private int balance;

message : 조건을 만족하지 않을 경우 출력할 오류 메시지.


2.7. @Negative 및 @NegativeOrZero

숫자 필드가 음수인지 (0 미포함 또는 포함) 검증

✍️ 예시 코드 작성

@Negative(message = "The value must be negative")
private int debt;

@NegativeOrZero(message = "The value must be negative or zero")
private int temperature;

message : 조건을 만족하지 않을 경우 출력할 오류 메시지.


3. 해당 게시글 작성에 참고한 글 목록

멋쟁이사자처럼 강의자료

profile
개발돌이

0개의 댓글