참새의 이야기
[MVC2] Bean Validation 본문
Bean Validation
FieldError
검증을 위해 자바에서 제공하는 애노테이션이 있다.
- @NotBlank : 빈 값 혹은 공백만 있는 경우를 허용하지 않는다.
- @NotNull : null을 허용하지 않는다.
- @Range(min = 1, max = 100) : 값의 범위를 제한.
- @Max(100), @Min(1) : 최대 혹은 최소 값을 제한.
이는 적절한 라이브러리(spring-boot-starter-validation)만 넣어주면 스프링 부트가 자동으로 Bean Validator를 인지하고 스프링에 통합한다.
검증 순서
@ModelAttribute 애노테이션이 있다면 각각의 필드에 맞게 형 변환을 시도한다.
성공한 경우 validator를 적용하고, 실패한 경우에는 FieldError 추가한다.
예를 들어 숫자가 입력되어야 하는 age에 문자 “a”가 입력된다면 형 변환을 시도하고 실패 후 typeMismatch FieldError를 추가한다.
ObjectError
FieldError가 아닌 ObjectError는 @ScriptAssert() 를 사용할 수 있다.
@Data
@ScriptAssert(lang = "javascript", script = "_this.price * _this.quantity >=
10000")
public class Item {
//...
}
사용법은 위와 같지만 사용 시 제약이 많아 ObjectError는 직접 코드를 작성하는 것이 좋다.
한계
현재의 방법은 Item엔티티 자체에 제한 걸어버린다.
이 방법은 유연하지 못하다.
예를 들어, 등록 시에는 price 라는 field에 50000이라는 최대 값 제한을 두고 수정 시에는 제한을 해제한다고 하면 애노테이션으로 조건을 걸기 애매해진다.
Bean Validation의 group
등록할 때와 수정할 때의 검증 방법을 각각 그룹으로 만들어 적용할 수 있다.
SaveCheck 와 UpdateCheck interface를 각각 생성하고 아래와 같이 적용할 수 있다.
@Max(value = 50000, groups = SaveCheck.class)
private Integer price;
Form 전달 객체
개발을 하다보면 폼에서 전달하는 데이터가 Item 객체와 완전히 같지 않다.
이외에 다른 데이터가 같이 넘어오는 경우가 많다.
그렇기 때문에 Bean Validation에서 제공하는 group은 잘 사용하지 않는다.
위의 예시 같은 상황이라면 ItemSaveForm과 ItemUpdateForm 이라는 맞춤 모델을 만들어 사용한다.
Form을 통해 전달 받은 데이터를 사용해 컨트롤러에서 Item 객체를 만들어 이후 로직을 수행한다.
reference
이 글은 김영한님의 '스프링 MVC 2편'을 듣고 작성했습니다.
'Spring' 카테고리의 다른 글
[MVC2] 로그인 처리 - Filter, Interceptor (0) | 2023.08.10 |
---|---|
[MVC2] 로그인 처리 - Cookie, Session (0) | 2023.08.10 |
[MVC2] Validation (2) | 2023.08.08 |
[MVC2] 메시지와 국제화 (0) | 2023.08.06 |
[MVC2] Thymeleaf - 스프링 통합과 폼 (0) | 2023.08.05 |