빈 검증 - 비밀번호 변경
비밀번호 검증에 '빈 검증'을 사용하려면 비밀번호를 위한 클래스를 만들어야 한다.
Password.java
package net.java_school.user;
import javax.validation.constraints.Size;
public class Password {
@Size(min=4, message="패스워드는 4자 이상이어야 합니다.")
private String currentPasswd;
@Size(min=4, message="패스워드는 4자 이상이어야 합니다.")
private String newPasswd;
public String getCurrentPasswd() {
return currentPasswd;
}
public void setCurrentPasswd(String currentPasswd) {
this.currentPasswd = currentPasswd;
}
public String getNewPasswd() {
return newPasswd;
}
public void setNewPasswd(String newPasswd) {
this.newPasswd = newPasswd;
}
}
비밀번호 페이지로 포워딩하는 요청 핸들러 메소드(아래 첫 번째 changePasswd() 메소드)에 내용이 없는 빈 객체(Password 객체)를 생성해 뷰에 전달해야 한다. 이건 스펙이니 따라야 한다. 비밀번호 변경을 처리하는 요청 핸들러 메소드(아래 두 번재 changePasswd() 메소드)에 빈 검증 로직을 추가한다. 두 번째 changePasswd() 메소드의 매개 변수 리스트에서 @Valid 어노테이션이 적용된 매개 변수 다음에는 반드시 BindingResult 타입의 매개 변수를 선언해야 한다. 그렇지 않으면 HTTP 400 에러가 발생한다.
UsersController.java
@RequestMapping(value="/changePasswd", method=RequestMethod.GET)
public String changePasswd(Principal principal, Model model) {
User user = userService.getUser(principal.getName());
model.addAttribute("user", user);//아래 테스트 화면처럼 홍길동 11111111을 출력하기 위해 필요
model.addAttribute("password", new Password());
return "users/changePasswd";
}
@RequestMapping(value="/changePasswd", method=RequestMethod.POST)
public String changePasswd(@Valid Password password,
BindingResult bindingResult,
Model model,
Principal principal) {
if (bindingResult.hasErrors()) {
User user = userService.getUser(principal.getName());
model.addAttribute("user", user);//아래 테스트 화면처럼 홍길동 11111111을 출력하기 위해 필요
return "users/changePasswd";
}
int check = userService.changePasswd(password.getCurrentPasswd(),
password.getNewPasswd(), principal.getName());
if (check < 1) {
throw new RuntimeException(WebContants.CHANGE_PASSWORD_FAIL);
}
return "redirect:/users/changePasswd_confirm";
}
아래를 참고하여 JSP를 수정한다. <sf:errors> 태그는 사용자에게 검증 에러를 표시하는 스프링 폼 태그이다.
changePasswd.jsp
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
<sf:form id="changePasswordForm" action="changePasswd" method="post"
modelAttribute="password" onsubmit="return check();">
<table>
<tr>
<td>현재 비밀번호</td>
<td>
<sf:password path="currentPasswd" /><br />
<sf:errors path="currentPasswd" cssClass="error" />
</td>
</tr>
<tr>
<td>변경 비밀번호</td>
<td>
<sf:password path="newPasswd" /><br />
<sf:errors path="newPasswd" cssClass="error" />
</td>
</tr>
<tr>
<td>변경 비밀번호 확인</td>
<td>
<input type="password" name="confirm" />
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="전송" /></td>
</tr>
</table>
</sf:form>
아래는 비밀번호 변경 화면에서 아무것도 입력하지 않고 전송 버튼을 눌렀을 때의 화면이다. (스타일시트에 .error { color: red; }가 추가되어 있어야 한다.)
- Getting started with Hibernate Validator
- Validation - Empty int field
- http://stackoverflow.com/questions/14715248/simple-springmvc-3-login-doesnt-work
- http://stackoverflow.com/questions/6227547/spring-3-validation-not-working
- http://stackoverflow.com/questions/8909482/spring-mvc-3-ambiguous-mapping-found
- 예제로 쉽게 배우는 스프링 프레임워크 3.0(한빛미디어) - 사카타 코이치
- Spring in Action(Jpub) - 크레이그 월즈
- spring-framework-reference.pdf
- MyBatis Getting started
