Web
Ch13. MVC 3 : 비밀번호 변경 기능 구현
tose33
2022. 7. 23. 21:25
비밀번호 변경 기능을 위한 클래스들
- ChangePwdCommand
- ChangePwdCommandValiator
- ChangePwdController
- changePwdForm.jsp
- changedPwd.jsp
- label.properties 에 메시지 추가
- ControllerConfig 설정 클래스에 빈 설정 추가
ChangePwdCommand.java
더보기
package controller;
public class ChangePwdCommand
{
private String currentPassword;
private String newPassword;
public String getCurrentPassword() {
return currentPassword;
}
public void setCurrentPassword(String currentPassword) {
this.currentPassword = currentPassword;
}
public String getNewPassword() {
return newPassword;
}
public void setNewPassword(String newPassword) {
this.newPassword = newPassword;
}
}
커맨드 객체
ChangePwdCommandValidator.java
더보기
package controller;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
public class ChangePwdCommandValidator implements Validator
{
@Override
public boolean supports(Class<?> clazz)
{
return ChangePwdCommand.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors)
{
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "currentPassword", "required");
ValidationUtils.rejectIfEmpty(errors, "newPassword", "required");
}
}
커맨드 객체를 검증할 Validator
ChangePwdController.java
더보기
package controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import spring.AuthInfo;
import spring.ChangePasswordService;
import spring.WrongIdPasswordException;
@Controller
@RequestMapping("/edit/changePassword")
public class ChangePwdController
{
private ChangePasswordService changePasswordService;
public void setChangePasswordService(ChangePasswordService changePasswordService)
{
this.changePasswordService = changePasswordService;
}
@GetMapping
public String form(@ModelAttribute("command") ChangePwdCommand pwdCmd)
{
return "edit/changePwdForm";
}
@PostMapping
public String submit(
@ModelAttribute("command") ChangePwdCommand pwdCmd,
Errors errors, HttpSession session)
{
new ChangePwdCommandValidator().validate(pwdCmd, errors);
if(errors.hasErrors())
{
return "edit/changePwdForm";
}
// 로그인 정보 갖고옴
AuthInfo authInfo = (AuthInfo)session.getAttribute("authInfo");
try
{
changePasswordService.changePassword(
authInfo.getEmail(),
pwdCmd.getCurrentPassword(),
pwdCmd.getNewPassword()
);
return "edit/changedPwd";
} catch(WrongIdPasswordException e)
{
errors.rejectValue("currentPassword", "notMatching");
return "edit/changePwdForm";
}
}
}
비밀번호 변경 요청을 처리하는 컨트롤러 클래스.
submit() 메서드에서는 HttpSession.getAttribute()로 로그인 정보를 가져와 비밀번호 변경을 시도한다.
익셉셥이 발생하면 에러를 추가하고 "edit/changePwdForm"으로 되돌아간다.
컨트롤러 처리 결과 보여줄 뷰들
changePwdForm.jsp
더보기
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<title><spring:message code="change.pwd.title" /></title>
</head>
<body>
<form:form>
<p>
<label><spring:message code="currentPassword" />:<br>
<form:input path="currentPassword" />
<form:errors path="currentPassword" />
</label>
</p>
<p>
<label><spring:message code="newPassword" />:<br>
<form:input path="newPassword" />
<form:errors path="newPassword" />
</label>
</p>
<input type="submit" value="<spring:message code="change.btn" />" >
</form:form>
</body>
</html>
changedForm.jsp
더보기
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<title><spring:message code="change.pwd.title" /></title>
</head>
<body>
<p>
<spring:message code="change.pwd.done" />
</p>
<p>
<a href="<c:url value='/main'/>">
[<spring:message code="go.main" />]
</a>
</p>
</body>
</html>
label.properties
더보기
// ...
change.pwd.title=비밀번호 변경
currentPassword=현재 비밀번호
newPassword=새 비밀번호
change.btn=변경하기
notMatching.currentPassword=비밀번호를 잘못 입력했습니다.
change.pwd.done=비밀번호를 변경했습니다.
메시지 추가
마지막으로 ControllerConfig 설정 파일에 ChangePwdController를 빈으로 등록한다.
ControllerConfig.java
더보기
package config;
// ...
@Configuration
public class ControllerConfig
{
// MemberConfig.java에서 빈 객체로 추가됨
// ...
@Autowired
private ChangePasswordService changePasswordService;
// ...
@Bean
public ChangePwdController changePwdController()
{
ChangePwdController controller = new ChangePwdController();
controller.setChangePasswordService(changePasswordService);
return controller;
}
}
@Autowired를 이용해 MemberConfig.java에 빈으로 등록한 ChangePasswordService 를 가져온다.
출처 : 스프링5 프로그래밍 입문 (최범균 저)