본문 바로가기
슬기로운 자바 개발자 생활/스프링 및 자바웹 서비스

Spring Validatir(스프링 밸리데이터)

by 슬기로운 동네 형 2016. 11. 27.
반응형

방금 오늘 적을 내용을 70% 까지 만들었었는데요. 실수로 그만 블로그 페이지를 닫아 버렸습니다. 너무 슬프네요.


회원가입 페이지에서 유저의 아이디와 비번을 입력 받을때 통상 자바스크립으로 검증을 하는데요. 서버에서 하지 않으면 자주 털린다네요.

저는 초 간단으로 유저아이디 필수값 체크, 그리고 15자수넘으면 안된다는 메세지를 보여주는 기능을 걸어 볼까합니다.


간단히 종합하자면 필요한것은

메이븐, 서블릿컨텍스트설정, 컨트롤러 클래스, JSP페이지, Validator Class, 메세지파일 입니다.


1.메이븐 설정 pom.xml에 아래 디펜던시 등록합니다.

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>

2. 서블릿컨텍스트에 메세지 파일 경로 설정해줍니다. ResourcesBun...클래스 DI

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="message/message_ko" />
</bean>

3.메제지 파일 작성이요. 저는 인텔리제이를 사용하니 이클립스 사용하시는 분들과 다를수 있을꺼 같습니다.


join.userid.length=아이디는 5자이상 15사 미만으로 정해주세요
join.userid.empty=유저아이디는 필수입니다.

4. 컨트롤러 만들어봅니다.

@org.springframework.stereotype.Controller
public class Controller {
private static final Logger logger = LoggerFactory.getLogger(Controller.class);
@RequestMapping("/")
public String index(){
return "index";
}
@RequestMapping("formwrite")
public String insert(){
return "/formwrite";
}
@RequestMapping(value="/dbinsert", method= RequestMethod.POST)
public String doJoin(Model model, UserVo userVo, BindingResult bindingResult){
new JoinValidator().validate(userVo, bindingResult);
if(bindingResult.hasErrors()){
model.addAttribute("tbUser", userVo);
logger.info("걸렸습니다. 밸리데이션에...");
return "/formwrite";
} else {
logger.info("걸린것은 없습니다.");
return "redirect:/";
}
}
}

처음 실행하면 인덱스 페이지가 열리고, 이후 회원가입 페이지 이동 순입니다.

5. Validator 클래스를 implements 한 joinValidator 클래스를 만듭니다. 실질적으로 여기서 검증을 합니다.

유저아이디가 15자 이상일때는 에러가 나고 join.user.lengh의 메세지 파일에 정의된 메세지를 디스플레이

유저아이디가 null일때 에러나고 join.userid.empty에 정의 된 메세지 디스플레이


public class JoinValidator  implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return UserVo.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
UserVo user = (UserVo) target;
if (user.getUserid().length() > 15) {
errors.rejectValue("userid", "join.userid.length");
}
if (user.getUserid().equals("")) {
errors.rejectValue("userid", "join.userid.empty");
}
}
}


6. JSP를 만들어 보겠습니다. 스프링 태그를 사용해야 하고요. commandName="userVo"는 컨트롤러의 dbjoin 메서드의 파라미터

UserVo userVo 인것 이해하시겠죠?


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<html>
<head>
<title>회원가입</title>
<style type="text/css">
.errorMsg { color: red; }
</style>
</head>
<body>
<div id="content">
<form:form id="" commandName="userVo" action="/dbinsert">
<label for="userid">유저아이디</label>
<input type="text" class="form-control" name="userid" id="userid" value="${userVo.userid}">
<form:errors cssStyle="margin: 5px" path="userid" cssClass="errorMsg" element="div"></form:errors>
<input type="submit" value="전송">
</div>
</form:form>
</div>
</body>
</html>

종합해보면 유저가 아이디 값을 입력하고 전송 버튼을 누릅니다.

이때 아이디가 15자 이상이라면 컨트롤러 메서드 dbjoin 안에 아래 바인딩 에러에 걸리게되고, 회원가입 페이지로 다시 되돌아가서 사용자는 아래 메세지를 만나게 됩니다. 동영상 첨부해 놓습니다.

if(bindingResult.hasErrors()){
model.addAttribute("tbUser", userVo);
logger.info("걸렸습니다. 밸리데이션에...");
return "/formwrite";
<form:errors cssStyle="margin: 5px" path="userid" cssClass="errorMsg" element="div"></form:errors>

필요한 검증 로직은 joinValidator에 넣으면 되겠네요. 패스워드 db 저장정보와 비교하는 것도요.



반응형

댓글