자바 JAVA/스프링프레임워크

스프링 유효성 검사(validation)

땅콩아놀자 2023. 4. 23.

유효성 검사(validation)

입력 내용이 요건에 만족하는지 그 타당성을 확인하는 입력 체크를 말한다.

 

단일항목검사

입력 항목 하나에 대해 설정하는 입력체크 기능이다.

Form 클래스 등의 필드에 어노테이션을 부여해서 사용하면 된다.

 

입력 체크를 위한 어노테이션은 Java EE에서 제공하는 어노테이션(Bean Validation)이나 하이버네이트(Hibernate) 프레임워크에서 제공하는 어노테이션(Hibernate Validation)이 있다. 

 

수치 입력 항목에 알파벳 등의 문자열을 입력한 경우 등의 '형변환 체크'는 입력 체크를 설정하는 것만으로도 이용할 수 있기 때문에 '형변환 체크'용 어노테이션을 추가할 필요는 없다.

 

어노테이션 기능 설명 사용 에시
@Max 지정한 숫자 이하인 것을 검증한다. @Max(100)
Integer price;
@Min 지정한 숫자 이상인 것을 검증한다. @Min(10)
Integer age;
@Size 문자열이나 컬렉션(Collection)이 지정한
범위의 크기 내인 것을 검증한다.
@Size(min=0, max=10)
List<Integer> selected;
@AssertTrue 값이 true인 것을 검증한다. @AsserTrue
Boolean empty;
@AssertFalse 값이 false인 것을 검증한다. @AsserFale
Boolean empty;
@Pattern 지정한 정규 표현과 일치하는 것을 검증한다. @Pattern(regexp="[a-zA-Z0-9]*")
@Range 지정한 숫자 범위 안에 있는 것을 검증한다. @Range(min=1, max=10)
Integer point;
@DecimalMax 지정한 숫자 이하인 것을 검증한다. @DecimalMax("100.0")
BigDecimal val;
@DecimalMin 지정한 숫자 이상인 것을 검증한다. @DecimalMin("10.0")
BigDecimal val;
@Digits 정수부와 소수부의 자릿수를 검증한다. @Digits(integer=3, fraction=1)
BigDecimal val;
@Future 미래의 날짜인 것을 검증한다. @Future
Date date;
@Past 과거의 날짜인 것을 검증한다. @Past
Date date;
@Valid 중첩된 Form을 검증한다. @Vaild
SampleFrom sampleForm;
@Length 문자열 길이가 지정한 범위 안에 있는 것을 검증한다.
(문자열 전용 size)
@Length(min=0, max=10)
String name;
@Email 문자열이 이메일 주소 형식인지 검증한다. @Email
String email;
@CreditCardNumber 문자열이 신용카드 번호 형식인지 검증한다. @CreditCardNumber
String card;
@URL 문자열이 URL 형식인지 검증한다. @URL
String url;

 

null 체크 어노테이션

모두 미입력(null) 체크 기능을 제공하지만, 각각의 특징이 있다.

@NotEmpty, @NotBlank는 컬렉션, 문자열, 배열용이다. 정수(Integer 타입)에 사용하면 'javax.validation.UnexpectedTypeException'이 발생한다. Integer 타입에는 @NotNull을 사용한다.

어노테이션 null인경우 공백 문자("")인 경우 스페이스나 탭인 경우 사용예시
@NotNull null 값이 아닌 것을 검증한다. 체크 에러 허가 허가 @NotNull
Integer no;
@NotEmpty 문자열이 null 혹은 공백문자("")가 아닌 것을 검증한다. 체크 에러 체크 에러 허가 @NotEmpty
String name;
@NotBlank 문자열이 null 혹은 공백(스페이스나 택 등)이 아닌 것을 검증한다. 체크 에러 체크 에러 체크 에러 @NotBlank
String name;

 

 

상관항목검사(서로 관련이 있는 항목을 함께 체크) : 커스텀 유효성 검사

단일 항목 검사는 하나의 필드를 체크하고 여러 필드에 대해 혼합해서 체크하는 것이 상관 항목 검사이다.

Bean Validation을 사용하는 방법과 스프링 프레임워크에서 제공하는 Validator 인터페이스를 구현하면 된다.

 

message 관리하기

message 속성 : 에러 메시지 내용 - {속성명}을 사용하면 속성값이 들어간다.

 

일반적으로 애플리케이션에서 표시하는 메시지는 프로그램과 별도로 관리하게 된다.

메시지를 템플릿에서 분리해서 메시지만 프로퍼티 파일(resources의 .properties)로 관리하는 편이 유지 관리가 더 편하다.

#entry 화면용
title.entry=입력 화면
button.send=계산
#CalcForm용
calcFrom.leftNum=왼쪽
calcFrom.rightNum=오른쪽

message 프로퍼티는 '키=값'의 형태로 정의한다.

키는 필드명 혹은 객체.필드명으로 작성할 수 있다. 객체명은 소문자 카멜케이스로 표현된다.

<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title th:text="#{title.entry}">제목</title>
</head>
<body>

이렇게 적용한 프로퍼티는 뷰(.html)쪽에서  #{키} 형태로 값을 가져올 수 있다.

위에서는 title에 적용을 하였는데 th:text="#{title.entry}"로 불러왔고, title.entry가 키이다.

 

 

어노테이션과 메시지에 대응 : 어노테이션의 FQCN.message가 메시지를 취득하기 위한 '키'

@Data
public class CalcForm {
    @NotNull(message = "왼쪽: 숫자를 입력해주세요.")
    @Range(min = 1, max=10, message = "왼쪽: {min}~{max} 범위의 숫자를 입력해주세요.")
    private Integer leftNum;


    @NotNull(message = "오른쪽: 숫자를 입력해주세요.")
    @Range(min = 1, max=10, message = "오른쪽: {min}~{max} 범위의 숫자를 입력해주세요.")
    private Integer rightNum;

 프로퍼티를 별도로 지정한다면 위의 Form 클래스에서 사용된 어노테이션 처럼 message="내용" 처럼 작성된 부분을 클래스 안에서는 생략할 수 있다.

 

어노테이션에서의 메시지 프로퍼티의 경우에는 전용 프로퍼티 파일을 따로 만들어서 관리를하는게 좋고, 위의 코드와 대응하는 프로퍼티 파일은 아래와 같다.

#단일 항목 검사용 메시지
javax.validation.constraints.NotNull.message={0}: 숫자를 입력해주세요.
org.hibernate.validator.constraints.Range.message={0}: {min}~{max} 범위의 숫자를 입력해주세요.
# 형변환 체크용 메시지
typeMismatch.java.lang.Integer={0}은 정수를 입력해주세요.

 

여기서 FQCN(Fully Qualified Class Name)은 클래스가 속한 패키지명을 모두 포함한 이름이다.

메시지 중에서 {수치} 는 자리표시자이고, 0부터 시작하는 수치에는 화면상의 항목 이름이 설정된다. {min} 등의 영어에는 어노테이션의 속성에 지정된 값이 설정된다. 형 변환 검사의 메시지는 'type.Mismatch.클래스의FQCN'의 키로 설정한다.

 

 

 

반응형

댓글