Validation
- validation: 문제 발생을 방지하기 위해 미리 검증하는 과정
- Validation 구현은 서비스 로직과 분리 되어야 함
- AssertTrue/AssertFalse와 같은 method 지정 혹은 ConstraintValidator를 적용하여 재사용이 가능한 Validation 적용 가능
(Validation Annotation)
더보기
Annotation | Description |
@Size | 문자 길이 측정. Int Type 불가 |
@NotNull | Null 불가 |
@NotEmpty | Null, "" 불가 |
@NotBlank | Null, "", " "(공백) 불가 |
@Past | 과거 날짜 |
@PastOrPresent | 금일 또는 과거 날짜 |
@Future | 미래 날짜 |
@FutureOrPresent | 금일 또는 미래 날짜 |
@Pattern | 정규식 적용 |
@Max | 최댓값 제한 |
@Min | 최솟값 제한 |
@AssertTrue / @AssertFalse | 사용자 정의 검증 |
@Valid | 해당 object validation 실행 |
(Validation 구현 예시)
- build.gradle에 implementation("org.springframework.boot:spring-boot-starter-validation") 적용
- 정규표현 예시: "^\\d{2, 3}-\\d{3, 4}- \\d{4}$"
- 재활용을 위해서는 Custom Validation Annotation 작성하여 사용(Interface)
더보기
(Class: User)
public class User {
@NotBlank
private String name;
@Min(value = 0)
@Max(value = 100)
private int age;
@Email
private String email;
@Pattern(regexp = "^\\d{2, 3}-\\d{3, 4}- \\d{4}$", message="핸드폰 양식을 확인하세요")
private String phoneNumber;
//@Size(min = 6, max = 6)
@YearMonth(pattern = "yyyyMM")
private String reqYearMonth;
@AssertTrue(message = "yyyyMM의 형식을 맞춰주세요" // Boolean 반환 메서드는 is 접두어가 붙어야 동작
public boolean isReqYearMonthValidation() {
try {
LocalDate localDate = LocalDate.parse(getReqYearMonth() + "01", DataTimeFormatter.ofPattern("yyyyMMdd"));
} catch (Exception e) {
return false;
}
return true;
}
// getter
// setter
// toString
}
(Class: ApiController)
@RestController
@RequestMapping("/api")
public class ApiController {
@PostMapping("/user")
public ResponseEntity user(@Valid @RequestBody User user, BindingResult bidingResult) { // bindingResult는 에러값이 담김
System.out.println(user);
if(user.getAge() >= 90) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(user);
}
if(buindintReseult.hasErrors()) {
StringBuilder sb = new StringBuilder();
bindingResult.getAllErrors().forEach(objectError -> {
FieldError field = (FieldError) objectError;
String message = objectError.getDefaultMessage();
sb.append("field : " + field.getField());
sb.append("message : " + message);
});
return ResponseEntity.status(HttpStatus.BAD_REQUEST).bogy(sb.toString());
}
return ResponseEntity.ok(user);
}
}
(Interface: YearMonth)
@Conatraint(validateBy = {})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface YearMonth {
String message() default "{javax.validation.constraints.Email.message}" ;
Class<?>[] groups() default { } ;
Class<? extends Payload>[] payload() default { } ;
String pattern() default "yyyyMM" ;
}
(Class: YearMonthValidator)
public class YearMonthValidator implements ConstraintValidator<YearMonth, String> {
}
Exception
Filter Interceptor
비동기 처리
'백엔드 자료집 > Spring' 카테고리의 다른 글
[Spring] Spring 핵심 개념 (0) | 2025.03.04 |
---|---|
[Spring] 참고자료 (0) | 2025.03.03 |