본문 바로가기

Language/Java, Android

[Spring] Valid Annotation을 이용한 Validation 체크

출처: http://wiki.gurubee.net/pages/viewpage.action?pageId=12189867&


Valid Annotation을 이용한 Validation 체크

  • Spring에서는 사용자가 입력한 값에 대한 유효성을 체크하기 위해 Spring Validator 또는 JSR-303 Validator를 사용할 수 있도록 지원하고 있다.
  • Spring 3.0 에서 mvc:annotation-driven 을 통해 간단하게 Bean Validation 을 사용할 수 있다.

pom.xml 수정

  • JSR-303 Validator를 적용하기 위해서는 아래의 dependency를 pom.xml에 추가해야 한다.
  • dependency 추가 후 프로젝트를 clean 한다.
pom.xml
    <dependency>
        <groupId>javax.validation</groupId> 
        <artifactId>validation-api</artifactId> 
        <version>1.0.0.GA</version> 
    </dependency>
    
    <dependency>  
        <groupId>org.hibernate</groupId>  
        <artifactId>hibernate-validator</artifactId>  
        <version>4.2.0.Final</version>
    </dependency>

Article 모델 객체 수정

  • Article.java 객체에 Validation을 체크하도록 Annotation을 설정하자
  • JSR 303 Spec 기본제공 Constraint Annotation
    Annotation제약조건Annotation제약조건
    @AssertFalse거짓인가?@Max지정값이하인가?
    @AssertTrue참인가?@Min지정값이상인가?
    @DecimalMax지정값이하실수인가?@NotNullNull이아닌가?
    @DecimalMin지정값이상실수인가?@NullNull인가?
    @Digits(integer=, fraction=)대상수가지정된정수,소수자리수이내인가?@Pattern(regex=, flag=)정규식을만족하는가?
    @Future미래날짜인가?@Size(min=, max=)문자열, 배열등의크기가지정크기를만족하는가?
    @Past과거날짜인가?  
  • Hibernate 제공 Constraint Annotation
    Annotation제약조건Annotation제약조건
    @NotEmptyEmpty값이 아닌가?@EmailEmail 형식
    @URLURL 형식@Length(min=,max=)문자열 길이 min과 max 사이인지
    @Range(min=,max=)숫자범위 체크  
com.spring.mvc.article.model.Article.java
...
public class Article {

    private int articleId;
    private int communityId;
    private int empno;
    private int groupId;
    private int reLevel;
    private int reDepth;

    @NotEmpty
    private String title;

    @NotEmpty
    @Length(min = 2, max = 8)
    private String name;

    @NotEmpty
    private String content;
    private String useYn;
    private Date registYmdt;
    private Date updateYmdt;
...

ArticleWriteController 수정

  • write 메소드에 아래와 같이 @Valid 어노테이션을 적용하자
  • BindingResult의 result.hasErrors() 조건문을 추가하여 Validation 에러가 발생할 경우 게시글 등록화면으로 이동시킨다.
com.spring.mvc.article.controller.ArticleWriteController.java
...
    @RequestMapping(value = "/write", method = RequestMethod.POST)
    public ModelAndView write(@Valid Article article, BindingResult result) {

        ModelAndView mv = new ModelAndView();

        // Validation 오류 발생시 게시글 정보 등록화면으로 이동
        if (result.hasErrors()) {
            // 에러 출력
            List<ObjectError> list = result.getAllErrors();
            for (ObjectError e : list) {
                LOG.error(" ObjectError : " + e);
            }

            mv.setViewName("article/ArticleWriteForm");
            mv.addObject("article", article);

            return mv;
        }

        LOG.debug(" #### article : " + article);

        mv.setViewName("article/ArticleViewForm");
        mv.addObject("article", article);

        return mv;
    }
...

annotation-driven 설정

  • Spring3에서 Validation을 처리하기 위해 mvc-dispatcher-servlet.xml 파일에 annotation-driven 을 설정한다.
  • Validation 오류 발생시 메세지 출력을 위한 ResourceBundleMessageSource 빈도 등록한다.
/WEB-INF/mvc-dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context-3.0.xsd
                           http://www.springframework.org/schema/mvc
                           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
    
    <!-- Annotation Controller 설정-->
    <context:component-scan base-package="com.spring.mvc" >    
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    </context:component-scan>

    <!-- Spring3 Validator 처리 -->
    <mvc:annotation-driven />
    
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
        <property name="prefix">
            <value>/WEB-INF/pages/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
        <property name="order" value="0" />
    </bean>
 
    <!-- Register the Customer.properties -->
    <bean id="messageSource"
        class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="message/messages" />
    </bean>
    
</beans>
    

messages_ko.properties 파일 생성

  • /resources/message/messages_ko.properties 파일을 생성한다.
  • 아래와 같이 Validation 오류 발생시 메세지를 추가하자
  • CONSTRAINT_NAME.COMMAND_NAME.FIELD_NAME 으로 메세지 키를 작명한다.
/resources/message/messages_ko.properties
NotEmpty.article.title = 게시글 제목을 입력해 주세요! 
NotEmpty.article.name = 게시글 작성자명을 입력해 주세요!
Length.article.name = 게시글 작성자명을 정상적으로 입력해 주세요!
NotEmpty.article.content = 게시글 내용을 입력해 주세요!

ArticleWriteForm.jsp 수정

  • Validation 에러메세지를 출력하기 위해서 form 태그에 commandName을 추가한다.
  • commandName은 Validation을 적용한 모델객체 명과 동일하며, 첫 글자는 소문자로 한다.
/pages/article/ArticleWriteForm.jsp
 
...
<form:form name="form"  commandName="article" method="post" > 
...

테스트 진행

References