웹 개발시 파라미터로 넘어온 값을 검증하기 위해 우리는 javascript로 viewer에서 값을 검증하기도 하고,
Server에서도 값이 올바른지 체크 하고 검증 한다.
서버에서 값을 검증 하기 위해서는 화면에서 처리해 주는 것 보다 좀 더? 불편함을 느낄 수 밖에 없다.
(그래서 생겨난게? JSR 303 beab validation )
Spring 에서도 validation 체크를 도와 주는게 3.x 부터 있으니 활용해보도록 하자.
(JS3 303 스펙은 https://jcp.org/en/jsr/detail?id=303 에서 확인 하자.)
Java Bean Validation (JSR 303) is a framework that has been approved by the JCP as of 16 November 2009 and is accepted as part of the Java EE 6 specification. Bean Validation defines a metadata model and API for JavaBean validation. The metadata source is annotations, with the ability to override and extend the meta-data through the use of XML validation descriptors. The Hibernate team provides with Hibernate Validator the reference implementation of Bean Validation and also created the Bean Validation TCK any implementation of JSR 303 needs to pass.
스프링에서 사용할 때 벨리데이트를 인젝션 해서 빈을 참조 해야 하는데 두가지 방법이 있다.
@Resource
Validator validator;
@InitBinder
protected void initBinder(WebDataBinder binder){
binder.setValidator(this.validator);
}
이렇게 InitBinder 로 타입 변환기를 셋팅하여 사용하거나. InitBinder , validator 를 설정하지 않고
*-servlet.xml에
<mvc:annotation-driven validator="validator" />
설정을 해주고 사용 하여도 된다. (validator="validator" 굳이 써주지 않아도 됨)
본격적으로 @Valid를 사용하여 보자.
1. @ModelAttribute 와 @Valid를 혼용하여 사용.
OOOController.java
@RequestMapping("/account/registUser")
public String registUser(HttpServletRequest request, HttpServletResponse response,
@RequestParam(defaultValue="") String type,
@ModelAttribute
@Valid UserDto userDto,BindingResult bidBindingResult, ModelMap modelMap ) throws Exception {
userDto 라는 모델에 자동으로 바인딩 하는 모습을 볼 수 있다.
InitBinder(WebdataBinder) 를 사용하여 사용하는경우 @ModelAttribute를 사용하지 않아도 @Valid만 사용하여 값들이 자동 binding되는 결과물들을 얻을 수 있다.
WebDataBinder는 web request parameter를 JavaBean 객체에 바인딩하는 특정한 DataBinder이다. WebDataBinder는 웹 환경이 필요하지만, Servlet API에 의존적이지 않다. Servlet API에 의존적인 ServletRequestDataBinder와 같이 특정한 DataBinder를 위한 더 많은 base classs를 제공한다. |
주의사항 : BindingResult가 ModelMap 뒤로 가지 않도록 한다. (리스판스 되는 내용의..???/)
2. Valid 하는 Model 설정
모델에는 별다른 설정없이 필요한 검증 설정만 어노테이션으로 셋팅 한다.
public class UserDto implements Serializable {
private static final long serialVersionUID = -2077674548205748507L;
private String userName;
@Size(min=5, max=12, message="사용자 아이디는 5자리 이상 12자 이하만 가능 합니다.")
@Pattern(regexp="^[0-9a-zA-Z]*$" , message="사용자 아이디는 영문자 숫자 조합만 가능 합니다.")
private String userId;
@Pattern(regexp="([a-zA-Z0-9].*[!,@,#,$,%,^,&,*,?,_,~])|([!,@,#,$,%,^,&,*,?,_,~].*[a-zA-Z0-9]){8,12}" ,message="숫자 영문자 특수 문자를 포함한 8 ~ 12 자를 입력하세요. ")
private String password;
@Pattern(regexp="^[_0-9a-zA-Z-]+@[0-9a-zA-Z]+(.[_0-9a-zA-Z-]+)*$" ,message="올바른 이메일을 입력하세요.")
...
}
생성된 모델의 Attribute 값에 설정만 해주면 된다.
검증 어노테이션 종류 14가지
@AssertFalse : false 값만 통과 가능
@AssertTrue : true 값만 통과 가능
@DecimalMax(value=) : 지정된 값 이하의 실수만 통과 가능
@DecimalMin(value=) : 지정된 값 이상의 실수만 통과 가능
@Digits(integer=,fraction=) : 대상 수가 지정된 정수와 소수 자리수보다 적을 경우 통과 가능
@Future : 대상 날짜가 현재보다 미래일 경우만 통과 가능
@Past : 대상 날짜가 현재보다 과거일 경우만 통과 가능
@Max(value) : 지정된 값보다 아래일 경우만 통과 가능
@Min(value) : 지정된 값보다 이상일 경우만 통과 가능
@NotNull : null 값이 아닐 경우만 통과 가능
@Null : null일 겨우만 통과 가능
@Pattern(regex=, flag=) : 해당 정규식을 만족할 경우만 통과 가능
@Size(min=, max=) : 문자열 또는 배열이 지정된 값 사이일 경우 통과 가능
@Valid : 대상 객체의 확인 조건을 만족할 경우 통과 가능
다음으로 에러 처리에 대해 알아보자
위와 같이 설정해둔 내역의 벨리데이션에서 통과되지 않고 실패 하였을경우도 처리를 해줘야 한다.
그때 사용 하는 녀석이 BindingResult이다.
앞서 Controller 코드에 삽입 하여 사용 할 것이다.
OOOController.java
@RequestMapping("/account/registUser")
public String registUser(HttpServletRequest request, HttpServletResponse response,
@RequestParam(defaultValue="") String type,
@ModelAttribute
@Valid UserDto userDto,BindingResult bidBindingResult, ModelMap modelMap ) throws Exception {
bidBindingResult.hasErrors() 의 역활은 벨리데이션을 체크 하여, 오류가 있는지를 판단한다.
userForm.jsp
1. tag lib 설정 http://www.springframework.org/tags/form
2. form tag를 사용하여 에러 메세지 확인
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
....
<div>
<form:errors path="userDto.userId" />
</div>
....
위 내용을 적용하기 위한 라이브러리를 등록
사용할 라이브러리 샘플
maven을 사용중이라면 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.0.0.GA</version>
</dependency>
스크립트에서만 검증값을 처리 하다가 서버에서도 이렇게 처리 하니 약간은 어색 하지만,
보안 및 검증을 위해서는 JSR 303을 이용하여 편리하게 할 수 있다.
'Spring' 카테고리의 다른 글
Spring RestTemplate Sample (0) | 2015.09.25 |
---|---|
대용량 페이징 기법 (0) | 2014.08.07 |
spring / twitter 연동 (twitter4j) (4) | 2013.12.18 |
spring 3.2 / tiles3 (2) | 2013.12.18 |
facebook platform login/ 정보 연동 (java/jsp) (0) | 2013.12.10 |