본문 바로가기

Language/Java, Android

Spring form 유효성 검사 (Spring Validator)

출처 : http://bbiyakbbiyak.tistory.com/3 (삐약이개발자님의 블로그)

 # Validator : org.springframework.validation.Validator 인터페이스

 ** 구현 메소드

  - boolean supports(Class<?> arg0) 

      : Validator가 해당클래스에 대한 값 검증을 지원하는지에 대한 여부 리턴한다.

 

  - void validate(Object target(해당클래스, 커맨드객체), Errors errors) 

: target 객체에 대한 검증을 실행하는 메소드, 검증결과에 문제가 있을 경우에는 errors 객체에 에러 정보를 저장


## @Valid 와 @InitBinder

 : validate() 메소드를 직접 호출하지 않고 스프링프레임워크에서 호출하는 방법.

 

 pom.xml에서 라이브러리를 추가 시켜야 한다.(의존 추가)

 <dependency>

  <groupId>org.hibernate</groupId>

  <artifactId>hibernate-validator</artifactId>

  <version>4.2.0.Final</version>

 </dependency>

 

 @Valid 아래와 같이 어노테이션 지정

 public String memberSave(@ModelAttribute("member") Member member, BindingResult bindingResult)

 ------> 

 public String memberSave(@ModelAttribute("member") @Valid Member member, BindingResult bindingResult)


 @InitBind 추가

 @InitBind

 protected void initBinder(WebDataBinder binder) {

  binder.setValidator(new MemberValidator());

 }

 

## Errors인터페이스와 BindingResult인터페이스

Error - org.sprigFramework.validation.Errors 

: 유효성 검증 결과를 저장할 떄 사용

BindingResult - org.springFramework.validation.BindingResult 

: Errors의 하위 인터페이스로서 폼 값을 커맨드 객체에 바인딩한 결과를 저장하고 에러코드로 메세지를 가져온다.

# Errors 인터페이스가 제공하는 메소드(반환 타입 void)

. reject(String errorCode)

: 전 객체에 대한 글로벌 에러 코드를 추가

. reject(String errorCode, String defaultMessage) 

: 전 객체에 대한 글로벌 에러코드를 추가하고, 에러코드에 대한 메세지가 존재하지 않을 경우 defaultMessage를 사용

. reject(String errorCode, Object[] errorArgs, String defaultMessage) 

: 전 객체에 대한 글로벌 에러코드를 추가, 메세지 인자로 errorArgs를 전달, 에러코드에 대한 메세지가 존재하지 않을 경우 defaultMessage를 사용  

. rejectValue(String field, String errorCode)

 : 필드에 대한 에러코드를 추가

. rejectValue(String field, String errorCode, String defaultMessage) 

: 필드에 대한 에러코드를 추가 에러코드에 대한 메세지가 존재하지 않을 경우 defaultMessage를 사용

. rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage)

 : 필드에 대한 에러코드를 추가, 메세지 인자로 errorArgs를 전달, 에러코드에 대한 메세지가 존재하지 않을 경우 defaultMessage사용

 

# Errors 인터페이스의 에러 발생 여부를 확인하기 위한 메소드

. boolean hasErrors() 

: 에러가 존재하는 경우 true 리턴

. int getErrorCount() 

: 에러의 갯수를 리턴

. boolean hasGlobalErrors()

 : reject() 메소드를 이용해서 추가된 글로벌 에러가 존재할 경우 true 리턴

. int getGlobalErrorCount() 

: reject() 메소드를 이용해서 추가된 글로벌 에러 갯수를 리턴

. boolean hasFieldErrors()

 : rejectValue() 메소드를 이용해서 추가된 에러가 존재할 경우 true 리턴

. int getFieldErrorCount()

 : rejectValue() 메소드를 이용해서 추가된 에러 갯수를 리턴

. boolean hasFieldErrors(String field)

 : rejectValue() 메소드를 이용해서 추가한 특정핑드의 에러가 존재할 경우 true 리턴

. int getFieldErrorCoutn(String field)

 : rejectValue() 메소드를 이용해서 추가한 특정필드의 에러 갯수 리턴




( 사용 예제 ) 


1) Member.java (command 객체)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Member {
    private String name;
    private String id;
    private int identifyNo;
    
    // getter & setter
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public int getIdentifyNo() {
        return identifyNo;
    }
    public void setIdentifyNo(int identifyNo) {
        this.identifyNo = identifyNo;
    }
}
 
cs


2. MemberController.java (Controller)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import javax.validation.Valid;
 
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
@Controller
public class MemberController {
    
    @RequestMapping("/memberForm")
    public String memberForm() {
        return "member/memberInput";
    }
    
    /** 폼 유효성 검사 1 */
    @RequestMapping(value="/memberSave1", method=RequestMethod.POST)
    public String memberSave1(@ModelAttribute("member") Member member, BindingResult bindingResult) {
        String resultPage = "member/memberOk";
        
        // Validator 생성
        MemberValidator mValidator = new MemberValidator();
        mValidator.validate(member, bindingResult);
        
        // 오류여부 확인
        if(bindingResult.hasErrors()) {
            resultPage = "member/memberInput";
        }
        
        return resultPage;
    }
    
    /** 폼 유효성 검사 2 */
    @RequestMapping(value="/memberSave2", method=RequestMethod.POST)
    public String memberSave2(@ModelAttribute("member") @Valid Member member, BindingResult bindingResult) {
        String resultPage = "member/memberOk";
        
        // 오류여부 확인
        if(bindingResult.hasErrors()) {
            resultPage = "member/memberInput";
        }
        return resultPage;
    }
    
    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new MemberValidator());
    }
}
 
cs


3. MemberValidator.java - Validator 클래스(유효성 체크)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import org.springframework.validation.Errors;
// import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
 
public class MemberValidator implements Validator {
 
    @Override
    public boolean supports(Class<?> arg0) {
        return Member.class.isAssignableFrom(arg0);
    }
 
    @Override
    public void validate(Object obj, Errors errors) {
        Member member = (Member) obj;
//        이름 유효성 체크)
        String mName = member.getName();
        if(mName == null || mName.trim().isEmpty()) {
            System.out.println("회원 이름을 입력하세요.");
            errors.rejectValue("name""공백오류");
        }
//        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "공백오류");
        
//        아이디 유효성 체크)        
        String mId = member.getId();
        if(mId == null || mId.trim().isEmpty()) {
            System.out.println("회원 아이디를 입력하세요.");
            errors.rejectValue("id""공백오류");
        }
//        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "id", "공백오류");
        
        
//        주민번호 오류체크 )        
        String mIdentifyNo = member.getId();
        if(mIdentifyNo == null || mIdentifyNo.trim().isEmpty()) {
            System.out.println("주민번호를 입력하세요.");
            errors.rejectValue("identifyNo""공백오류");
        }
    }
}
cs



4) memberInput.jsp - View(회원정보 입력페이지)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align="center">
    <h2> 회원가입 </h2>
    <hr/>
    <form method="post" action="memberSave">
        <table border="1" cellpadding="10" cellspacing="0">
            <tr>
                <td>이름</td>
                <td><input type="text" name="name"/></td>
            </tr>
            <tr>
                <td>아이디</td>
                <td><input type="text" name="id"/></td>
            </tr>
            <tr>
                <td>주민번호</td>
                <td><input type="text" name="identifyNo"/></td>
            </tr>
        </table>
        <br/>
        <input type="submit" value="전송"/>
    </form>
</div>
</body>
</html>
cs



5) memberOk.jsp - View(회원정보받는 페이지)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <div align="center">
        <h1>회원정보페이지 입니다.</h1>
        <hr/>
        이름 : ${ member.name }<br/>
        아이디 : ${ member.id }<br/>
        주민번호 : ${ member.identifyNo }<br/>
    </div>
</body>
</html>
cs