금융에 대한 모든 것

회원 가입을 할 때 아이디 입력창에 50자 이상의 긴 문자열을 넣고 제출하면 에러 메시지를 띄우면서 값이 전송되지 않는 것을 확인할 수 있습니다. 이런 기능은 Bean Validation이라는 유효성 검사 기능으로 구현합니다.

Bean Validation(JSR-303)  사용 설정하기

pom.xml

<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
        <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
        <version>5.2.1.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>5.2.1.Final</version>
</dependency>

위와 같이 라이브러리를 붙여 넣기 합니다.

 

servlet-context.xml

<beans:bean id="validator" 
            class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

servlet-context.xml에 validator 빈을 추가합니다.

 

유효성 검사 어노테이션

 해당 변수에 조건에 만족하는 값이 들어가 있는지 검사하기 위해서 아래와 같은 어노테이션을 사용합니다.

 

어노테이션

설명

@Size(min=m, max=n)

문자열이 m ~ n 자리인지 검사합니다.

@NotNull

변수 값이 null인지 아닌지 검사합니다.

@NotBlank

문자열이나 배열의 경우 null이 아니고 길이가 0이 아닌지 검사합니다.

@Pattern("regrx")

변수 값이 정규식을 만족하는지 검사합니다.

@Email

변수 값이 이메일 형식을 만족하는 검사합니다.

@Past

해당 시간이 과거의 시간인지 검사합니다.

@Future

해당 시간이 미래의 시간인지 검사합니다.

@AssertTrue

변수 값이 true 인지 검사합니다.

@AssertFalse

변수 값이 false 인지 검사합니다.

 

유효성 검사 어노테이션 사용하기

Validation 어노테이션을 적용하면 변수값이 해당 조건을 만족하는지 유효성 검사를 할 수 있습니다.

 

MemberVO.java

public class UserVO {
        
    @Size(min=1, max=10)
    private String userId; // 1~10자리의 문자열
    private String password;
    private String passwordConfirm;
          ...

 검사를 적용할 필드 값에 어노테이션을 붙입니다. 위와 같이 어노테이션을 붙이면 해당 변수에는 1~10자리의 문자열이 들어가야 합니다. 그렇지 않으면 에러를 일으킵니다.

 

member.jsp

<form:form modelAttribute="userVO" action="/test">
        <p>아이디</p>
        <form:input path="userId"/>
        <p>비밀번호</p>
        <form:input path="password"/>
        <p>비밀번호 확인</p>
        <form:input path="passwordConfirm"/>
        <input type="submit" />
</form:form>

userVO 객체에  값을 전송할 form 태그를 작성합니다.

 

MemberController.java

@RequestMapping("/test")
    public String signUpSubmit(@ModelAttribute @Valid UserVO userVO, BindingResult result) {
                
        // 유효성 검사를 통과하지 못했을 때
        if (result.hasErrors()) {
            return "/signUp";
        
        // 유효성 검사를 통과했을 때
        } else {
            ...
            return "/main";
        }
        
    }

@ModelAttribute에 의해 전송된 값이 userVO에 담기게 됩니다. 이 때, 유효성 검사를 실행할 객체에 @Vaild 어노테이션을 붙이고 에러 결과를 담을 BindingResult result를 매개변수로 설정합니다. 그러고 나서 유효성 검사를 통과하지 못했을 때는 form 태그가 있는 페이지로 돌아오고 유효성 검사를 통과하면 다음 페이지로 넘어가게 합니다.

 

화면에 에러 메시지 띄우기

화면에 에러 메시지를 띄우기 위해서는 따로 작업을 더 해주어야 합니다.

 

form:error 태그

<form:error path=userId cssClass="err"/>

 form:error 태그를 이용하면 userId 변수의 에러 메시지를 띄울 수 있습니다. 이 때 에러 메시지는 클래스 속성이 "err"인 태그로 생성이 되어 css로 에러 메시지의 색을 바꿀 수 있습니다.

 

messages_ko_KR.properties

Size.userVO.userId = 아이디는 1~10자리이어야 합니다

/resources/messages/messages_ko_KR.properties 파일을 만들어 에러 메시지를 작성합니다.  에러 메시지는 "어노테이션명.객체명.변수명 = 메시지"의 형태로 작성합니다.

 

servlet-context.xml

<!-- Register the Customer.properties -->
<beans:bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <beans:property name="basename" value="messages/messages" />
    <beans:property name="defaultEncoding" value="utf-8" />
</beans:bean>

 messages_ko_KR.properties의 내용을 메시지로 사용하기 위해 servlet-context.xml에 messageSource 빈을 등록합니다. 이 작업이 모두 끝내고 유효성 검사를 실행하면 에러 발생 시에 설정한 메시지가 화면에 띄워지게 됩니다.

반응형