JSR-303, JSR-380 어노테이션
Bean Validation
Bean Validation은 JavaBean 유효성 검증을 위한 메타데이터 모델과 API에 대한 정의이며 여기서 언급하고 있는 JavaBean은 직렬화 가능하고 매개변수가 없는 생성자를 가지며, Getter 와 Setter Method를 사용하여 프로퍼티에 접근이 가능한 객체이다.
Bean Validation 1.0 은 JSR-303이고 Bean Validation 2.0 은 JSR-380이다.
JSR-303과 JSR-380에는 어떠한 어노테이션을 이용하여 빈의 유효성을 정의할 수 있는지 알아보도록 하자.
https://beanvalidation.org/1.0/spec/ - JSR-303 명세서
https://beanvalidation.org/2.0-jsr380/spec/ - JSR-380 명세서
JSR-303
많이 사용되는 JSR-303 어노테이션들이다.
@Size(min=?, max=?)
min와 max의 값을 포함한 문자열의 최소길이와과 최대길이를 지정할 수 있다. 예를 들어, min이 2, max가 10이라면 data1에 들어갈 수 있는 문자열의 길이는 2~10글자수이다.
@Max(?), @Min(?)
정수의 최대값과 최소값을 지정할 수 있다. 지정한 값을 포함한다. 즉, 이상과 이하를 설정할 수 있다. @Max, @Min은 하나씩 사용할 수도 있지만 data5처럼 한번에 사용하여 범위를 지정할 수도 있다.
@AssertTrue, @AssertFalse
Assert : (강력히)주장하다. - 구글번역기..
참이라고 주장하는 아이와 거짓이라고 주장하는 아이?
@AssertTrue는 값이 false이면 유효성 검사를 만족하지 못하고, @AssertFalse는 값이 true이면 유효성 검사를 만족하지 못한다.
@DecimalMax, @DecimalMin
@Max, @Min과 거의 비슷한데 속성에 inclusive를 써줌으로써 value의 값을 포함시키느냐 마느냐를 결정해줄 수 있다.
즉, inclusive가 ture이면 이상, 이하로서 사용이 가능하고 inclusive가 false이면 초과, 미만으로서 사용이 가능하다.
@Null, @NotNull
@Null은 값이 들어오면 오류가 발생(항상 널이어야하는 값에 사용)
@NotNull은 값이 들어오지 않으면 오류가 발생(반드시 입력을 받아야 하는 값에 사용)
@Digits(integer=?, fraction=?)
자릿수를 결정할 수 있다. integer속성은 자연수의 자릿수를 결정하고 fraction속성은 소숫점의 자릿수를 결정한다.
예를 들어, @Digits(integer=3, fraction=3)인데 data10이 100.1111이면 오류가 발생하겠다. 근데 100이 들어갔다면 소숫점(fraction)은 0이라고 판단되어 오류가 발생하지는 않는다.
@Parttern(regexp=정규식)
regexp속성에 들어있는 정규식에 위배되면 오류가 발생한다. 예를들어 regexp="[a-zA-Z]*" 라고 선언되어 있으면 소문자 a~z 대문자 A~Z까지만 유효하다.
각 어노테이션에서 발생할 수 있는 에러메세지를 properties파일에 담아서 이 파일을 메세지로 등록하였다.
Controller에서 @Valid를 써줌으로써 Hibernate Validator를 사용한다. DataBean1이라는 빈 클래스에 대한 유효성 검사를 실행하겠다는 선언이다. (@ModelAttribute는 생략되어있기 때문에 DataBean은 Request영역에 자동으로 담긴다.)
properties파일을 message로 등록한 후, jsp에서 위와 같이 form커스텀 태그를 활용하여 사용할 수 있겠다.
유효성 검사를 통과하지 못하면 properties파일에 등록해주었던 에러메세지들이 출력될 것이다.
JSR-380
많이 사용되는 JSR-380 어노테이션들이다.
@NotEmpty
주입된 문자열의 길이가 0이면 오류가 발생한다. 공백도 글자로 인식한다. (스페이스바 3번누르면 길이가 3이라고 인식한다.)
@NotBlank
주입된 값이 공백을 제거하고 길이가 0이면 오류가 발생한다. (스페이스바 3번누르면 공백이라고 인식한다.)
@Positive
양수가 아니라면 오류가 발생한다. (0을 포함하지 않고 1이상의 값.)
@PositiveOrZero
0또는 양수가 아니라면 오류가 발생한다.
@Negative
음수가 아니라면 오류발생 (0을 포함하지 않고 -1이하의 값.)
@NegativeOrZero
0또는 음수가 아니라면 오류가 발생한다.
@Email
이메일 형식이 아니라면 오류가 발생한다. 중간에 @가 있는지 정도만 확인해준다.