기본적으로 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;
}
'Programing > Java & Spring' 카테고리의 다른 글
[Spring] Utility Class에 대해서는 Static Method로 구성하는 것이 좋을까? (1) | 2024.09.11 |
---|---|
[Spring] TimeZone에 대해 활용해보자 (0) | 2024.08.21 |
세무민의 코딩일기 : 맥북에서 Java 11 -> 17 Version으로 변경하기 (0) | 2024.04.07 |
세무민의 코딩일기 : Junit > Port was already in use 해결 방법 (2) | 2024.02.27 |
세무의 코딩일기 : JobRegistry @Autowird Bean이 없다고 오류 날 때 처리 방안 (0) | 2024.02.02 |