Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

참새의 이야기

[MVC2] Bean Validation 본문

Spring

[MVC2] Bean Validation

참새짹짹! 2023. 8. 8. 16:53

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