Programing/Java & Spring

Spring ConstraintValidator 활용하여 유효성 검증하기 : 세기무민의 코딩일기

세기루민 2024. 5. 21. 23:28
728x90

기본적으로 Spring에서 @Valid 어노테이션을 이용하여 DTO에 대해 기본적인 검증이 가능하다.

 

자세한 내용은 Spring Validation Docs를 참고하면 된다.

 

Getting Started | Validating Form Input

The application involves validating a user’s name and age, so you first need to create a class that backs the form used to create a person. The following listing (from src/main/java/com/example/validatingforminput/PersonForm.java) shows how to do so: pac

spring.io

 

다만, 회사에서 업무를 하다보면 @Valid를 이용하여 유효성 검증하는데에 한계가 있는 경우가 종종 있다.

이런 경우에는 ConstraintValidator를 이용하여 Validator를 직접 생성해주면 된다.

 

ConstraintValidator?

ConstraintValidator는 javax.validation.constraintvalidator 인터페이스 구현체이다.

해당 구현체에서는 initialize()와 isvalid() 매서드를 오버라이딩하여 사용한다.

매서드 명과 같이 initialize는 초기화, isValid는 검증을 처리하는 매서드이다.

 

 

ConstraintValidator  사용법

1. 인터페이스와 클래스 파일을 1개씩 생성해준다.

 

testAssert.interface

@Documentd
@Constraint(validatedBy = (클레스 네임))
@Target(ElementType.Field)
@Retention(RetentionPolicy.RUNTIME)

public @interface testAssert {

	String message() default "";
	Class<?> [] groups() default {};
	Class<? extends Payload>[] payload() default {};
}
  • message()를 통해 default Exception에 대한 메세지를 추가할 수 있다.

 

testValidator.class

@Component 
@RequiredArgsConstructor
public class testValidator implements ConstraintValidator<testAssert, Integer> {
	
    @Overrid
    public void initialize(testAssert testAssert) {
    }
    
    @Overrid
    public boolean isValid(Integer count, ConstraintValidatorContext context) {
        if(count > 0) {
            return false;
        }
        return true;
    }
}

 

  • ConstraintValidator 인터페이스를 상속 받으며 initialize와 isValid 매서드를 오버라이딩한다.
  • return false인 경우 Exception 처리 된다.

2. validator를 완성했다면 유효성 검증이 필요한 DTO에 어노테이션을 선언한다.

public class testRequestDto {
    private String name;
  
    @testAssert
    private Integer count;

}

 

3. Controller에서 RequestBody @Valid 어노테이션을 추가하면 끝

@PostMapping("/api/v1/test")
@RequestBody
public testResponseDto getTestDataByTotalCount(@RequestBody @Valid testRequestDto requestDto) {
	....
    return testResponseDto;
}

 

 

728x90