-
Spring MVC - Bean Validation(애노테이션을 이용한 검증)Spring/Spring MVC 2022. 2. 7. 01:48728x90반응형
Spring MVC - Bean Validation(애노테이션을 이용한 검증)
Bean Validation은 특정 구현체가 아니라 Bean Validation 2.0(JSR-380)이라는 기술 표준인 검증 애노테이션과 여러 인터페이스의 모음이다. Bean Validation을 구현한 기술 중에 일반적으로 사용하는 구현체는 하이버네이트 Validator이다.
표준 인터페이스( JSR-303, JSR-380 )
JSR-303
어노테이션(Annotation) 설명 @AssertTrue 변수 값이 true가 아니면 오류 @AssertFalse 변수 값이 false가 아니면 오류 @Max(값) 최대 값보다 높으면 오류 @Min(값) 최소 값보다 높으면 오류 @DecimalMax(value=값, inclusive=true/false) inclusive=true면 값 포함, false 이면 값 미포함,
inclusive default값은 true@DecimalMin(value=값, inclusive=true/false) inclusive=true면 값 포함, false 이면 값 미포함,
inclusive default값은 true@Null 값이 들어오면 오류 @NotNull 값이 들어오지 않으면 오류 @Digits(integer=자릿수,fraction=자리수) 해당 자료형의 자릿수가 아니면 오류,
integer=정수 자리수, fraction=실수 자리수@Size(min=글자수,max=글자수) 지정된 글자수 보다 짧거나 길면 오류 @Patterm(regexp=정규식) 주어진 정규식에 위배되면 오류 JSR-380
어노테이션(Annotation) 내용 @NotEmpty 주입된 값의 길이가 0이면 오류, 공백도 글자로 인식한다. @NotBlank 주입된 값이 길이가 0이면 오류, 공백은 글자로 인식안한다. @Positive 양수가 아니면 오류 - 값을 주입할때 String으로 주입하면 오류난다 @PositiveOrZero 0 또는 양수가 아니면 오류 - 값을 주입할때 String으로 주입하면 오류난다 @Negative 음수가 아니면 오류 - 값을 주입할때 String으로 주입하면 오류난다 @NegativeOrZero 0 또는 음수가 아니면 오류 - 값을 주입할때 String으로 주입하면 오류난다 @Email 이메일 형식이 아니라면 오류, 중간에 @가 있는지 확인
Bean Validation
우선 Bean Validation을 사용하기 위해서는 의존관계를 추가해야 한다. spring-boot-starter-validation 의존관계를 추가하면 Bean Validation을 사용할 수 있는 라이브러리들이 추가된다.
dependencies { ... implementation 'org.springframework.boot:spring-boot-starter-validation' ... }
- jakarta.validation-api : Bean Validation 인터페이스
- hibernate-validator : 구현체
Bean Validation 사용
- spring-boot-starter-validation 의존관계를 추가하고 검증 객체에 @Validated가 있으면
자동으로 Bean Validator를 인지하고 검증을 한다. - 스프링 부트는 LocalValidatorFactoryBean을 글로벌 Validator로 등록한다.
- JSR-303, JSR-380, hibernate validator의 검증 애노테이션을 검증기에 등록
- @NotNull 등과 같은 애노테이션을 보고 검증을 수행시켜 준다.
- 글로벌 Validator가 적용되어 있기 때문에 @Valid, @Validated만 적용하면 된다.
- 검증 오류가 발생하면 FieldError, ObjectError를 생성해서 BindingResult에 담아준다. - 검증 순서 : Bean Validator은 바인딩에 실패한 필드는 Bean Validation을 적용하지 않는다.
1. 검증 객체에 각 필드에 바인딩되는 필드 타입 검증
- 실패 시 검증 에러 발생( typeMismatch로 FieldError 생성 ), 필드 겁증을 하지 않는다.
2. 필드 타입 검증에 성공하는 경우에만 Bean Validation을 적용
@Data public class Item { private Long id; @NotBlank private String itemName; @NotNull @Range(min = 1000, max = 1000000) private Integer price; @NotNull @Max(value = 9999) private Integer quantity; ... }
참고
@Valid : 자바 표준 검증 애노테이션
@Validated : 스프링 전용 검증 애노테이션
둘 다 동일하게 작동하므로 둘 중 아무거나 써도 무방하다
단, @Validated만 내부에 groups라는 기능을 포함하므로 주의하자
Bean Validation - 에러 메시지 변경
- Bean Validation이 기본으로 제공하는 오류 메시지를 개발자가 변경할 수 있다.
- 검증 오류가 발생 시 MessageCodesResolver가 errorCode를 이용하여 메시지 코드를 생성
- 에러 메시지 파일에 해당 메시지 코드에 메시지를 등록
생성된 메시지 코드 메시지 등록(errors.properties) 전달 인자 NotBlank.item.itemName
NotBlank.itemName
NotBlank.java.lang.String
NotBlankNotBlank={0}, 공백 X {0} : 필드명 Range.item.price
Range.price
Range.java.lang.Integer
RangeRange={0}, {2} ~ {1} 허용 {0} : 필드명, {1}, {2} : max, min 값
(참고 : 필드명을 제외한 index 순서는
알파벳순이므로 Min이 {2}, Max가 {1} 이 된다Max.item.quantity
Max.quantity
Max.java.lang.Integer
MaxMax={0}, {1} 이하 값 허용 {0} : 필드명, {1} : value 값
Bean Validation - ObjectError
- 필드 검증은 필드 단위로 검증 애노테이션을 넣어서 할 수 있었지만 오브젝트 검증은 불가능
- 따라서 오브젝트 검증은 @ScriptAssert 애노테이션을 사용
- 제약이 많고 복잡하므로 오브젝트 오류 관련 부분은 직접 자바 코드로 구현하는 것을 권장한다.
방법 1 - @ScriptAssert 사용
@Data @ScriptAssert(lang = "javascript", script = "_this.price * _this.quantity >= 10000") public class Item { //... }
방법 2 - 자바 코드로 구현
@PostMapping("/add") public String addItem(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes) { //오브젝트 검증 구현 if (item.getPrice() != null && item.getQuantity() != null) { int resultPrice = item.getPrice() * item.getQuantity(); if (resultPrice < 10000) { bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice}, null); } } .... }
728x90반응형'Spring > Spring MVC' 카테고리의 다른 글
Spring MVC - HTTP API 메시지(JSON)의 Bean Validation (0) 2022.02.07 Spring MVC - Bean Validation을 위한 Form 전송 객체 분리 (DTO) (0) 2022.02.07 Spring MVC - Validator 분리와 구현 (0) 2022.02.06 Spring MVC - 검증(Validation)에 errors MessageSource 사용 (0) 2022.02.06 Spring MVC - 스프링에서 제공하는 검증(Validation) 방법 (FieldError, ObjectError) (0) 2022.02.05