[Spring] Annotation을 이용한 validation 구현
- BACKEND/Spring
- 2017. 6. 21. 15:44
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=" "/></span></td>
</tr>
<tr>
<th>패스워드</th>
<td><input type="password" name="password" value="${param.password }"><span class="error"><form:errors path="member.password" delimiter=" "/></span></td>
</tr>
<tr>
<th>이름</th>
<td><input type="text" name="name" value="${param.name }"><span class="error"><form:errors path="member.name" delimiter=" "/></span></td>
</tr>
<tr>
<th>이메일주소</th>
<td><input type="text" name="email" value="${param.email }"><span class="error"><form:errors path="member.email" delimiter=" "/></span></td>
</tr>
<tr>
<th>나이</th>
<td><input type="text" name="age" value="${param.age }"><span class="error"><form:errors path="member.age" delimiter=" "/></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=" "/></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>
예제 파일
'BACKEND > Spring' 카테고리의 다른 글
[Spring] jackson <java객체를 javascript객체로 변환해줌> (0) | 2017.06.22 |
---|---|
[Spring] ValidationClass파일 만들어서 Validation 처리하기 (0) | 2017.06.21 |
[Spring] Filter 등록해서 쓰기 (0) | 2017.06.19 |
[Spring] Handler(Controller 로직 처리자) 개념 (0) | 2017.06.16 |
[Spring] Spring MVC 개념 (0) | 2017.06.16 |