20250403 비밀번호찾기 다이어그램.drawio.png

//전체적인 흐름
findPw.jsp에서 비밀번호 찾기 입력 후 findPwSearch.do로 요청
findPwSearch.do에서 memberId를 검증한 후, checkPw.jsp로 이동하며 memberId를 전달
checkPw.jsp에서 memberId를 유지한 채 비밀번호 변경 폼을 입력
checkPw.do에서 비밀번호를 변경

1.비밀번호 입력창으로 이동

@Controller("memberController")
@RequestMapping("/member")
public class MemberController {

// 비밀번호 찾기
@RequestMapping(value = "/findPw.do", method = {RequestMethod.GET, RequestMethod.POST})
public String findPw() {
	return "/member/findPw"; }

2.이름과 아이디, 이메일을 입력받아서 일치하는지 확인한다.

// 비밀번호 찾기(입력된 값 찾기)
@RequestMapping(value = "/findPwSearch.do", method = { RequestMethod.GET, RequestMethod.POST })
public String findPwSearch(
		@RequestParam("memberName") String memberName,
@RequestParam("memberId") String memberId,
@RequestParam("memberEmail1") String memberEmail1,
@RequestParam("memberEmail2") String memberEmail2, HttpSession session, Model model,
RedirectAttributes rAttr, HttpServletRequest request, HttpServletResponse response) throws Exception {

// 아이디와 휴대폰번호 확인 로직
MemberDomain memberDomain = new MemberDomain();
memberDomain.setMemberName(memberName);
memberDomain.setMemberId(memberId);
memberDomain.setMemberEmail1(memberEmail1);
memberDomain.setMemberEmail2(memberEmail2);
System.out.println("들어온 비밀번호찾기 값들== " + memberDomain);

3.회원조회를 하고 값이 없으면 얼럿띄우고, 다시 입력창으로

//회원 정보 확인
String userId = memberService.findPw(memberDomain);
System.out.println("찾은 아이디 = "+userId);

//값이 없으면
if (userId == null || userId.isEmpty()) { // userId가 없을 경우 예외처리
    rAttr.addFlashAttribute("error", "일치하는 회원정보가 없습니다.");
    return "redirect:/member/findPw.do";
}
<!-- 비밀번호 찾기 -->
<select id="findPw" resultType="String" parameterType="memberDomain">
<![CDATA[
  select memberId from member
  where memberName = #{memberName}
  and memberId = #{memberId}
  and memberEmail1 = #{memberEmail1}
  and memberEmail2 = #{memberEmail2}
]]>
</select>

4.값이 있다면 세션에 memberId 저장하고 비밀번호 변경페이지로 이동

// 세션에 memberId 저장
session.setAttribute("memberId", userId);
System.out.println("세션에 저장된 memberId = " + session.getAttribute("memberId"));

return "/member/checkPw"; //컨트롤러 호출할때 redirect
}

5.기존 비밀번호와 새로운 비밀번호를 입력하면

session에 저장한 memberId를 불러오고 ‘새 비밀번호’와 ‘새 비밀번호 재입력’ 맞는지를 확인후 맞다면 memberId와 비밀번호를 DB에 업데이트 보냄

// 비밀번호 수정
@RequestMapping(value = "/checkPw.do", method = {RequestMethod.GET, RequestMethod.POST})
public String checkPw(
    @RequestParam("memberPw") String memberPw,
    @RequestParam("newPwd") String newPwd,
    RedirectAttributes rAttr,
    HttpSession session, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {

    // 세션에서 memberId 가져오기
    String memberId = (String) session.getAttribute("memberId");
    if (memberId == null) {
        model.addAttribute("error", "세션이 만료되었습니다. 다시 시도해주세요.");
        return "/member/checkPw";  // 페이지 그대로 유지
    }

    // 빈값 체크
    if (newPwd == null || newPwd.isEmpty() || memberPw == null || memberPw.isEmpty()) {
        model.addAttribute("error", "새 비밀번호를 입력하세요.");
        return "/member/checkPw";  // 페이지 유지
    }

    // 비밀번호 확인 로직
    if (!newPwd.trim().equals(memberPw.trim())) {
        model.addAttribute("error", "새 비밀번호가 일치하지 않습니다.");
        return "/member/checkPw";  // 페이지 유지
    }

6.기존 아이디와 비밀번호가 맞다면 새로운 비밀번호로 변경 후, 세션에 저장된 memberId 삭제

    // 비밀번호 변경
    Map<String, String> updatePw = new HashMap<>();
    updatePw.put("memberId", memberId);
    updatePw.put("newPwd", newPwd);
    memberService.updatePwd(updatePw);
    
    // 비밀번호 변경 후 세션에서 memberId 제거
	  session.removeAttribute("memberId");

    // 비밀번호 변경 성공 메시지
    rAttr.addFlashAttribute("message", "비밀번호가 성공적으로 변경되었습니다.");
    return "redirect:/member/loginForm.do";
}