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("memberPhone1") String memberPhone1,
@RequestParam("memberPhone2") String memberPhone2,
@RequestParam("memberPhone3") String memberPhone3,
HttpSession session, Model model, RedirectAttributes rAttr, HttpServletRequest request, HttpServletResponse response) throws Exception {
	
	//아이디와 휴대폰번호 확인 로직
MemberDomain memberDomain = new MemberDomain();
memberDomain.setMemberName(memberName);
memberDomain.setMemberId(memberId);
memberDomain.setMemberPhone1(memberPhone1);
memberDomain.setMemberPhone2(memberPhone2);
memberDomain.setMemberPhone3(memberPhone3);
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 memberPhone1 = #{memberPhone1}
	   and memberPhone2 = #{memberPhone2}
	   and memberPhone3 = #{memberPhone3}
	]]>
</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";
}