출처: 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 지정값이하실수인가? @NotNull Null이아닌가? @DecimalMin 지정값이상실수인가? @Null Null인가? @Digits(integer=, fraction=) 대상수가지정된정수,소수자리수이내인가? @Pattern(regex=, flag=) 정규식을만족하는가? @Future 미래날짜인가? @Size(min=, max=) 문자열, 배열등의크기가지정크기를만족하는가? @Past 과거날짜인가?
- Hibernate 제공 Constraint Annotation
Annotation 제약조건 Annotation 제약조건 @NotEmpty Empty값이 아닌가? @Email Email 형식 @URL URL 형식 @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" > ...
테스트 진행
- http://test.spring3.com/article/form.ok
- Validation을 테스트 해보자
References
- http://dev.anyframejava.org/docs/anyframe/plugin/foundation/4.6.1/reference/html/ch13.html
- Custom Validator : http://starplatina.tistory.com/372
'Language > Java, Android' 카테고리의 다른 글
[스프링] 프로젝트명 완벽하게 바꾸기 (0) | 2018.05.11 |
---|---|
Spring form 유효성 검사 (Spring Validator) (0) | 2018.05.10 |
[JSP-Spring] ${sessionScope.id} 가 되지 않을 때 (0) | 2018.04.20 |
문자열(string) 비교 equals와 == 의 차이점 ( + equals의 반대) (0) | 2018.03.19 |
[스프링] 톰켓 (0) | 2018.02.20 |