-
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이다.
더보기공식 사이트
http://hibernate.org/validator/
The Bean Validation reference implementation. - Hibernate Validator
Express validation rules in a standardized way using annotation-based constraints and benefit from transparent integration with a wide variety of frameworks.
hibernate.org
공식 메뉴얼
https://docs.jboss.org/hibernate/validator/6.2/reference/en-US/html_single/
Hibernate Validator 6.2.1.Final - Jakarta Bean Validation Reference Implementation: Reference Guide
Validating data is a common task that occurs throughout all application layers, from the presentation to the persistence layer. Often the same validation logic is implemented in each layer which is time consuming and error-prone. To avoid duplication of th
docs.jboss.org
검증 애노테이션 모음
Hibernate Validator 6.2.1.Final - Jakarta Bean Validation Reference Implementation: Reference Guide
Validating data is a common task that occurs throughout all application layers, from the presentation to the persistence layer. Often the same validation logic is implemented in each layer which is time consuming and error-prone. To avoid duplication of th
docs.jboss.org
표준 인터페이스( 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