본문 바로가기

SPRING

비밀번호 변경하기

1. 비밀번호 변경을 위한 커맨드 객체 생성

 

package spring;

// 비밀번호 요청을 받아줄 커맨드 객체
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;
	}
	
}

 

2. 비밀번호 변경 유효성 검사를 위한 Validator 객체 생성

 

package spring;

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.rejectIfEmpty(errors, "currentPassword", "required");
		ValidationUtils.rejectIfEmpty(errors, "newPassword", "required");
	}

}

 

3. 비밀번호를 변경해주는 쿼리가 담긴 DAO 로직

 

package spring;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;

public class MemberDAO {
	
	private JdbcTemplate jdbcTemplate;
	
	public MemberDAO(DataSource dataSource) {
		System.out.println("MemberDAO 객체 생성");
		jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public void update(Member member) {
		jdbcTemplate.update(
				"update member set name = ?, password = ? where email = ?",
				member.getName(), member.getPassword(), member.getEmail());
	}
    
}

 

 

4. 비밀번호를 변경해주는 Service 로직

 

package spring;

import org.springframework.transaction.annotation.Transactional;

// 비밀번호를 변경해주는 기능이 담긴 로직
public class ChangePasswordService {
	
	private MemberDAO memberDao;
	
	public ChangePasswordService(MemberDAO memberDao) {
		this.memberDao = memberDao;
	}
	
	public void changePassword(String email, String oldPwd, String newPwd) {
		Member member = memberDao.selectByEmail(email);
		
		if(member == null) {
			throw new MemberNotFoundException();
		}
	
		member.changePassword(oldPwd, newPwd); // 가져온 회원의 비밀번호 변경
		memberDao.update(member); // 데이터베이스에 변경된 정보를 반영
	}

}

 

5. 비밀번호 변경 흐름을 잡아주는 Controller 작성

 

package controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import spring.AuthInfo;
import spring.ChangePasswordService;
import spring.ChangePwdCommand;
import spring.ChangePwdCommandValidator;
import spring.IdPasswordNotMatchingException;

@Controller
@RequestMapping("/edit/changePassword")
public class ChangePwdController {
   
   private ChangePasswordService changePasswordService;
   
   public void setChangePasswordService(ChangePasswordService service) {
      this.changePasswordService = service;
   }
   
   @RequestMapping(method=RequestMethod.GET)
   public String form(@ModelAttribute("command") ChangePwdCommand pwdCmd) {
      return "edit/changePwdForm";
   }

   @RequestMapping(method=RequestMethod.POST)
   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/changePwd";
      }catch(IdPasswordNotMatchingException e) {
         errors.rejectValue("currentPassword", "notMatching");         
         return "edit/changePwdForm";
      }
   }
}

 

6. edit/changePwdForm.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="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>
<meta charset="UTF-8">
<title><spring:message code="change.pwd.title"/></title>
</head>
<body>
<form:form>
<p>
   <label><spring:message code="currentPassword"/>
   <form:password path="currentPassword"/>
   <form:errors path="currentPassword"/>
   </label>
</p>
<p>
   <label><spring:message code="newPassword"/>
   <form:password path="newPassword"/>
   <form:errors path="newPassword"/>
   </label>
</p>
   <input type="submit" value="<spring:message code="change.btn"/>">
</form:form>
</body>
</html>

 

 

7. edit/changePwd.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<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>

 

8. label.properties 메세지 작성

 

change.pwd.title=비밀번호 변경
currentPassword=현재 비밀번호
newPassword=새 비밀번호
change.btn=변경하기
notMatching.currentPassword=비밀번호를 잘못 입력하였습니다.
change.pwd.done=비밀번호를 변경하였습니다.

 

9. xml에 controller 의존 추가

 

<bean class="controller.ChangePwdController">
	<property name="changePasswordService" ref="changePwdSvc"/>
</bean>

'SPRING' 카테고리의 다른 글

HandlerInterceptor : 세션을 미리 확인하자  (0) 2020.10.12
로그인 / 로그아웃 / 세션  (0) 2020.10.12
404 NOT_FOUND 처리하기  (0) 2020.10.11
파일 업로드 처리 : MultipartResolver  (0) 2020.10.11
Model 객체 / @ModelAttribute  (0) 2020.10.11