[Spring] Annotation을 이용한 validation 구현

Annotiaion으로 validation을 구현하기 위해서 pom.xml에 추가해줘야 함 

http://mvnrepository.com/artifact/org.hibernate/hibernate-validator/5.4.1.Final



pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>spring_mvc_param</groupId>

  <artifactId>spring_mvc_param</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>war</packaging>

  <build>

    <sourceDirectory>src</sourceDirectory>

    <plugins>

      <plugin>

        <artifactId>maven-compiler-plugin</artifactId>

        <version>3.5.1</version>

        <configuration>

          <source>1.8</source>

          <target>1.8</target>

        </configuration>

      </plugin>

      <plugin>

        <artifactId>maven-war-plugin</artifactId>

        <version>3.0.0</version>

        <configuration>

          <warSourceDirectory>WebContent</warSourceDirectory>

        </configuration>

      </plugin>

    </plugins>

  </build>

  <!-- spring webmvc, jstl -->

  <dependencies>

  <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-webmvc</artifactId>

    <version>4.3.9.RELEASE</version>

</dependency>

  <dependency>

    <groupId>jstl</groupId>

    <artifactId>jstl</artifactId>

    <version>1.2</version>

</dependency>

  <dependency>

    <groupId>org.hibernate</groupId>

    <artifactId>hibernate-validator</artifactId>

    <version>5.4.1.Final</version>

</dependency>

  

  </dependencies>

</project>




MemberForm.java


package domain.validation.annotation;


import java.util.Date;


import javax.validation.constraints.Size;


import org.hibernate.validator.constraints.Email;

import org.hibernate.validator.constraints.Length;

import org.hibernate.validator.constraints.NotEmpty;

import org.hibernate.validator.constraints.Range;

import org.springframework.format.annotation.DateTimeFormat;


/*

 * @ModelAttribute 로 사용할 클래스

 * -> Annotation을 이용한 요청파라미터 검증을 처리

 * Annotation을 이용해 각 property에 요청파라미터가 들어갈때 어떤걸 검사해야 하는지 지정(선언)

 *  - 선언 위치는 instance변수나 setter 메소드에 한다.(어디에 해도 상관없다.)

 *  

 *  Annotation 공통 속성 : message - 에러메세지를 등록

 *  

 *  properties 파일의 에러메세지를 사용할 경우는 message속성 생략

 *  1. Annotation명.@ModelAttribute속성명.property명

 *  2. Annotation명.property명

 *  3. Annotation명

 *  

 *  ex) NotEmpty.memberForm.id

 *   NotEmpty.id

 * NotEmpty

 */

public class MemberForm {

@NotEmpty

@Length(min=8, max=10)//글자수 체크

private String id;

@NotEmpty

private String password;

@NotEmpty

private String name;

@NotEmpty

@Email(message="이메일 형식이 아닙니다.")

private String email;

//@Min(value=0) @Max(value=200)

@Range(min=0,max=200,message="나이는 0~200사이 정수만 가능")

private int age;

@DateTimeFormat(pattern="yyyy-MM-dd")

private Date birthday;

private String blogUrl;

@Size(max=2)  //속성으로 max, min으로 줄수 있다.

private String[] interest;

//setter,getter만 생성 

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

public String getBlogUrl() {

return blogUrl;

}

public void setBlogUrl(String blogUrl) {

this.blogUrl = blogUrl;

}

public String[] getInterest() {

return interest;

}

public void setInterest(String[] interest) {

this.interest = interest;

}

}



package domain.controller;


import javax.validation.Valid;


import org.springframework.beans.BeanUtils;

import org.springframework.stereotype.Controller;

import org.springframework.validation.BindingResult;

import org.springframework.web.bind.annotation.ModelAttribute;

import org.springframework.web.bind.annotation.RequestMapping;


import domain.validation.MemberRegisterValidator;

import domain.validation.annotation.MemberForm;

import domain.vo.Member;


@Controller

@RequestMapping("/member/")

public class MemberController {


@RequestMapping("register")

//@ModelAttribute 변수에 @Valid를 선언해서 어노테이션을 이용해 검증 하라고 알려준다.

public String register(@ModelAttribute("member")@Valid MemberForm memberForm, BindingResult errors){

if(errors.hasErrors()){

return "member/register_form";

}

//비지니스 로직처리 - memberService.join(Member member)

//MemberForm(요청파라미터 조회+검증용) -카피-> Member(회원 데이터 타입)

Member member = new Member();

BeanUtils.copyProperties(memberForm, member); //소스 , 타겟    ->    MemberForm -> Member

System.out.println(member);

//응답

return "member/register_sucess";

}

}



error_message.properties   (#=주석)


# 코드를 등록

# 코드명 = 메세지

# 코드명.property명 = 메세지

# 코드명.@ModelAttribute속성명.property명 = 메세지


# rejectValue("프라퍼티명", "코드명")


# rejectValue("name", "required", "메세지") -> member

# required.member.name

# required.name

# required

required=필수입력사항입니다.

required.id=ID를 꼭 입력하세요.

required.member.id=회원 ID는 꼭 넣어야 합니다.


size=선택 개수가 틀립니다.

size.interest=2개까지만 선택하세요.

# Spring container가 요청파라미터를 property에 넣을때

# 형변환 문제로 발생한 오류에 사용하는 메세지코드명

typeMismatch=입력한 값의 형태를 다시 확인하세요.


#Annotation 검증에서 사용할 메세지

NotEmpty=반드시 넣어야합니다.

Size=개수가 맞지 않습니다.

Size.interest=관심사항은 최대 2개까지 선택하세요



register_form.jsp


<%@ page contentType="text/html;charset=utf-8" %>

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

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

<style type="text/css">


span, td, th{

padding: 5px; 

}

span.error{

font-size:small;

color: red;

}


</style>

</head>

<body>

<h2>가입폼</h2>

<%--

<form:errors> : Errors/BindingResult 에 담긴 에러 메세지를 출력해주는 태그

출력 메세지 : rejectValue() 에 등록된 에러 메세지

태그 속성

- path : 에러메세지와 관련된 property 명 - @ModelAttribute객체의 속성명.property명

- delimiter : path의 property와 관련된 에러메세지가 여러개일 경우 사용할 구분자 지정(생략시 <br>)

 --%>

<form action="/spring_mvc_modelAttribute/member/register.do" method="post">

<table>

<tr>

<th>ID</th>

<td><input type="text" name="id" value="${param.id}"><span class="error"><form:errors path="member.id" delimiter="&nbsp;&nbsp;"/></span></td>

</tr>

<tr>

<th>패스워드</th>

<td><input type="password" name="password" value="${param.password }"><span class="error"><form:errors path="member.password" delimiter="&nbsp;&nbsp;"/></span></td>

</tr>

<tr>

<th>이름</th>

<td><input type="text" name="name" value="${param.name }"><span class="error"><form:errors path="member.name" delimiter="&nbsp;&nbsp;"/></span></td>

</tr>

<tr>

<th>이메일주소</th>

<td><input type="text" name="email" value="${param.email }"><span class="error"><form:errors path="member.email" delimiter="&nbsp;&nbsp;"/></span></td>

</tr>

<tr>

<th>나이</th>

<td><input type="text" name="age" value="${param.age }"><span class="error"><form:errors path="member.age" delimiter="&nbsp;&nbsp;"/></span></td>

</tr>

<tr>

<th>생일</th>

<td><input type="date" name="birthday" ><span class="error"></span></td>

</tr>

<tr>

<th>블러그 주소</th>

<td><input type="text" name="blogUrl" "><span class="error"></span></td>

</tr>

<tr>

<th>관심사항</th>

<td>


<label>게임 : <input type="checkbox" name="interest" value="game" ></label>

<label>영화 : <input type="checkbox" name="interest" value="movie" ></label>

<label>음악 : <input type="checkbox" name="interest" value="music" ></label>

<label>스포츠 : <input type="checkbox" name="interest" value="sports"></label>

<span class="error"><form:errors path="member.interest" delimiter="&nbsp;&nbsp;"/></span></td>

</tr>

<tr>

<td colspan="2">

<input type="submit" value="가입">

</td>

</tr>

</table>

</form>

</body>

</html>



register_sucess.jsp


<%@ page contentType="text/html;charset=UTF-8"%>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

<h2>가입 성공</h2>

<h3>가입한 내용</h3>

ID : ${requestScope.member.id }<br>

이름 : ${requestScope.member.name }<br>

이메일 : ${requestScope.member.email }<br>

나이 : ${requestScope.member.age }<br>

생일 : <fmt:formatDate value="${requestScope.member.birthday }" pattern="yyyy-MM-dd"/><br>

블로그 URL : ${requestScope.member.blogUrl }<br>

관심사항 

<ul>

<c:forEach items="${requestScope.member.interest }" var="item">

<li>${item}</li>

</c:forEach>

</ul>

</body>

</html>



예제 파일

spring_mvc_modelAttribute.zip



댓글

Designed by JB FACTORY