Develop/Spring

[Spring] Validator의 주요개념과 적용 방법

롱하 2024. 10. 2. 15:50

입력 데이터의 유효성 검증을 담당하는 기능 으로, 사용자로부터 입력된 값이 특정 조건을 만족하는지 확인하는 역할을 한다. Spring Framework에서 제공하는 Validator는 주로 폼 데이터 요청 데이터의 유효성을 검증할 때 사용된다.

 

 

Spring Validator의 주요 개념

- Spring에서는 Validator 인터페이스를 제공하여 사용자 정의 검증 로직을 구현할 수 있다.

- 이 인터페이스는 다음 두 가지 메서드를 포함한다.

  1. supports(Class<?> clazz): 해당 클래스가 이 Validator에서 검증 가능한지 여부를 결정
  2. validate(Object target, Errors errors): 검증 로직을 구현하는 메서드로, 실제 검증이 이 메서드에서 이루어진다. 검증이 실패하면 Errors 객체에 에러를 추가
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

public class UserValidator implements Validator {

    // 지원하는 클래스인지 확인
    @Override
    public boolean supports(Class<?> clazz) {
        return User.class.equals(clazz);
    }

    // 유효성 검증 로직
    @Override
    public void validate(Object target, Errors errors) {
        User user = (User) target;

        // 이름이 비어 있는지 확인
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required", "Name is required.");
        
        // 나이가 18 이상인지 확인
        if (user.getAge() < 18) {
            errors.rejectValue("age", "invalid.age", "Age must be 18 or older.");
        }
    }
}

 

 

  • 위 코드에서 UserValidator는 User 객체를 검증하고, 사용자가 입력한 이름이 비어 있거나 나이가 18세 미만일 때 오류를 발생시킨다.
  • ValidationUtils 클래스 : Spring에서 제공하는 ValidationUtils는 자주 쓰이는 유효성 검사를 더 간편하게 도와주는 유틸리티. rejectIfEmptyOrWhitespace() 메서드는 필드가 비어 있거나 공백일 경우 오류를 등록하는 역할.

 

 

Validator검증 적용 방법

 

1. Controller에서 직접사용 : 컨트롤러에서 명시적으로 Validator를 호출하여 유효성을 검증할 수 있다.

 

@Controller
public class UserController {

    private final UserValidator userValidator;

    @Autowired
    public UserController(UserValidator userValidator) {
        this.userValidator = userValidator;
    }

    @PostMapping("/submit")
    public String submitForm(@ModelAttribute User user, BindingResult result) {
        userValidator.validate(user, result);

        if (result.hasErrors()) {
            return "formPage"; // 에러가 있으면 다시 폼 페이지로 이동
        }

        // 정상 처리
        return "successPage";
    }
}

 

2. Spring의 @Valid 어노테이션 사용 : Spring은 @Valid 또는 @Validated 어노테이션을 사용하여 유효성 검사를 자동으로 수행할 수 있습니다. 이 경우 JSR-303/JSR-380 Bean Validation API를 사용하여 더욱 간결하게 처리할 수 있다.

 

import javax.validation.Valid;

@PostMapping("/submit")
public String submitForm(@Valid @ModelAttribute User user, BindingResult result) {
    if (result.hasErrors()) {
        return "formPage";
    }

    return "successPage";
}

 

 

JSR-303/JSR-380 Bean Validation

 

Spring에서는 JSR-303/JSR-380 Bean Validation을 사용하여 어노테이션 기반의 검증도 가능하다. 예를 들어, javax.validation.constraints 패키지에서 제공하는 어노테이션을 사용하여 유효성 검증을 설정할 수 있다.

 

import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;

public class User {

    @NotEmpty(message = "Name is required.")
    private String name;

    @Min(value = 18, message = "Age must be 18 or older.")
    private int age;

    // Getters and Setters
}

 

  • 이러한 방식으로 @NotEmpty, @Min, @Max, @Email 등 다양한 어노테이션을 사용하여 유효성 검사를 처리할 수 있다.

 

이러한 Validator를 통한 검증을 통해 입력 데이터의 무결성을 보장하고, 애플리케이션의 안정성을 높일 수 있다.