본문 바로가기

Spring/Spring MVC

스프링 폼태그, 스프링 벨리데이터 를 통한 회원가입 01

스프링 폼태그, 스프링 벨리데이터 를 통한 회원가입 01

@Validated, Spring Form Tag 를 이용한 기본적인. VO Vaildation Check

예제 코드는 Github에 있습니다. (브랜치별로 분할 하엿습니다.)

  • Jstl의 taglib를 통해 스프링 폼태그를 사용할수 있도록 jsp 파일에 아래의 코드를 작성한다.

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

  • 기존의 form태그는 <form:form> 태그를 이용하여 스프링 폼태그를 적용한다.

    • commandName 객체의 이름을 적어준다.

<form:form commandName="yourVO">

  • 기존의 input 태그 또한 <form:input>태그로 대체한다.

    • <form:input>태그를 사용하려면 path 속성을 지정해주어야 한다.

    • 바인딩하기 위해서 form 내부태그에 바인딩 경로 'path'를 지정한다.

    • path에 해당되는 값은 도메인 모델의 Bean 객체를 의미한다.

    • Spring은 validatior에서 얻어진 메시지를 JSP페이지에서 쉽게 출력할 수 있도록 spring form 태그의 form:errors태그를 제공한다. 이는 생성한 validator를 통해 입력값의 유효성 체크 후 에러 메시지를 출력한다.


<form:input path="mberId" type="text" title="아이디" placeholder="아이디"/>
<form:errors path="mberId" />

  • 컨트롤러에서는 ModelAttribute 에노테이션을 사용하여 JSP 에 객체를 주입한다.

@Controller
public class yourController {

@RequestMapping(value = "yourJsp")
public String serverSide(@ModelAttribute YourVO yourVO) throws Exception {
return "yourJsp";
}
}


  • 버튼 클릭에 사용되는 JSP의 script 구문

':'는 기본적으로 키 값 쌍의 구분 기호입니다.


<script>
var commonCl = {

validInit : function(){
this.$yourVO = $("#yourVO");
},

vaildFn : function() {
this.$yourVO.attr("action", "yourJsp");
this.$yourVO.submit();
}
}
</script>

  • validation Annotations를 사용하기 위해 pom.xml에 해당 코드 추가

  • hibernate 에는 메세지 문자집합 properties파일이 있어 VO에 validation Annoation을 적용하기위해 추가.

  • validation 에는 @Valid Annotation을 사용하기 위해 추가


<!-- Form Validation using Annotations -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.1.0.Final</version>
</dependency>
<!-- Form Validation using Annotations -->


  • VO 객체에 @NotEmpty 에노테이션 추가

import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;

public class YourVO {

@NotEmpty(message = "필수 입력 값입니다.")
private String Id;

@NotEmpty
@Size(min = 8, max = 20, message = "8자 이상 20자 이하로 입력해주세요.")
private String password;

}

http://appsnuri.tistory.com/115 참고

  • org.hibernate.validator 패키지의 ValidationMessages.properties 파일의 일부


javax.validation.constraints.Null.message=must be null
javax.validation.constraints.Size.message=size must be between {min} and {max}
org.hibernate.validator.constraints.Email.message=not a well-formed email address
org.hibernate.validator.constraints.NotEmpty.message=may not be empty
org.hibernate.validator.constraints.URL.message=must be a valid URL

http://zero-gravity.tistory.com/298 참고

  • 컨트롤러에서는 @Validated 에노테이션을 BindingResult 객체 사용


@Controller
public class yourController {

@RequestMapping(value = "yourJsp")
public String serverSide(@ModelAttribute @Validated YourVO yourVO,BindingResult result) throws Exception {
logger.info("에러 여부 : " + bindingResult.hasErrors());
return "yourJsp";
}
}

@Validated에노테이션을 통하여 VO에 설정한 valid check한 결과는 BindingResult객체에 담겨진다.

다음은

1. Message properties을 이용한 custom Error message

2. Custom Vaildation Annotation 만들기

- VO에 Custom Vaildation Annotation 적용

3. Validator interface를 implements 한 Validator.java만들기

- VO에 Annotation없이 .java로 validator분리

  • 설정파일 분할하기 !! web.xml

    • 설정 위치를 classpath로 바꾼다. root context 파일을 분할하기 위해서


<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/spring/context-*.xml</param-value>
</context-param>

Ex) /src/main/resources/config/spring/*.xml