2013년 4월 14일 일요일

[Spring] validator

프로그램을 제작하다보면 유효성검사를 할 경우가 굉장히 많다. 특히 웹 어플리케이션에서 사용자의 입력을 받는 경우에 유효성검사를 많이 필요로한다.

생각해보자. 항상 사용자가 개발자가 원하는 데이터값을 입력할까????? 그건 전혀 예측할 수 없는 일이다. 개발자가 무엇을 생각하고 무엇을 요구하는지 사용자는 알고 싶어하지 않는다. 이럴경우 유효성검사가 참 유용하다. 그리고 웹에서 국제화를 위해서도 사용된다. 영어, 일어, 중국어 등 다양한 언어로 서비스를 제공하고 싶다면 유효성 검사방법을 잘 알아두도록 하자.

스프링에는 유효성 검사를 위한 기능을 제공하고 있다. 우선 validator 인터페이스를 implements 한 자바 클래스가 필요하다. 이 클래스를 활용하여 form에서 넘어온 데이터의 유효성을 검사할 것이다. 코드는 다음과 같다.
예)
public class BoardValidator implements Validator {

@Override
public boolean supports(Class<?> arg0) {
// TODO Auto-generated method stub
if(Board.class.isAssignableFrom(arg0)){
return true;
}
return false;
}

@Override
public void validate(Object arg0, Errors errors) {
// TODO Auto-generated method stub
Board board = (Board)arg0;

if(board.getTitle() == null || board.getTitle().length() < 6){
errors.rejectValue("title", "required");
}
if(board.getWriter() == null || board.getWriter().length() < 6){
errors.rejectValue("writer", "required");
}
}
}


 우선 폼으로부터 넘어온 객체가 맞는지 확인한다. 여기서 ture를 반환하면 아래 validate함수를 수행하여 휴효성을 검사하게 된다. 여기서 만약 에러를 반환한다면 미리 지정해둔 메세지를 가지고 폼으로 돌아가도록 설정할 것이다. 일단 메세지 등록에 대해 살펴보자.
예)
required.title = bad title
required.writer = bad writer


properties파일에 등록한 간단한 메세지이다. 이 메세지를 얻기 위해 앞서 설명한 코드에서 rejectValue()의 인자로 해당하는 메세지의 문자열을 넘겨준 것이다.

여기까지는 단순한 로직처리일 뿐이다. 스프링에서 이 로직들을 처리하기 위해서는 항상 DispatcherServlet에 bean으로 객체를 등록해 주어야한다는 것을 잊지말자.
예)
<!-- VALIDATOR -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="message.validation"></property>
</bean>

<bean id="boardValidator" class="kosta.validator.BoardValidator"></bean>


ResourceBundleMessageSource클래스의 객체를 이용해 메세지를 읽도록 하고 유효성검사를 하는 validator도 객체로 만들어 둔다. 이 객체를 사용할 DispatcherServlet에다가 넣어주고 있다.

마지막으로 에러가 발생했을 때 해당하는 메세지를 가지고 화면에 뿌려주도록하기 위해서 spring에서 제공하는 태그를 이용한다.
예)
<spring:hasBindErrors name="commend"></spring:hasBindErrors>
<center>
<h1>글쓰기폼</h1>
<form action="board_insert.do" method="post">
작성자:<input type="text" name="writer"/><form:errors path="commend.writer"></form:errors><br>
&nbsp;제목:&nbsp;&nbsp;<input type="text" name="title"/><form:errors path="commend.title"></form:errors><br>
내용<br><textarea name="contents" rows="6" cols="30"></textarea><br>
<input type="submit" value="등록"/><br>
</form>
</center>


댓글 없음:

댓글 쓰기