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 프로그래밍 입문 (최범균 저)