전체 흐름 요약


[비밀번호 변경 페이지 요청(GET)]  /find/changePassword.do
   ↓
[ChangePasswordController#doGet]
   ↓
[세션에서 인증된 UserDTO 조회 후 JSP 전달]
   ↓
[changePassword.jsp] → 사용자에게 비밀번호 입력 폼 표시
   ↓
[사용자 입력 후 폼 제출(POST)]  /find/changePassword.do
   ↓
[ChangePasswordController#doPost]
   ↓ (비밀번호 일치 여부 검사)
   ↓ (userservice.modifyPassword 호출)
[UserService.modifyPassword]
   ↓
[UserDAO.updatePassword]
   ↓ (DB update 쿼리 실행)
   ↑
[성공 여부 반환]
   ↑
[doPost] 성공/실패 결과에 따라 알림 후 페이지 이동 및 세션 종료

1) 프론트엔드 — next 버튼 클릭 스크립트

next.onclick = function(event) {
    event.preventDefault();
    if(nextBtnClick == true) {
        location.href = "./changePassword.do";
    } else {
        alert("인증하세요");
        return;
    }
}


2) ChangePasswordController.java

package kr.co.pamStory.controller.user.find;

import java.io.IOException;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import kr.co.pamStory.dto.UserDTO;
import kr.co.pamStory.service.UserService;

@WebServlet("/find/changePassword.do")
public class ChangePasswordController extends HttpServlet {
    private static final long serialVersionUID = 1271233365653325736L;
    private UserService userservice = UserService.INSTANCE;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        UserDTO userdto = (UserDTO) session.getAttribute("sessUser");

        req.setAttribute("dto", userdto);

        // View forward
        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/view/find/changePassword.jsp");
        dispatcher.forward(req, resp);
    }


3) JSP (changePassword.jsp) 일부

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>비밀번호 변경</title>
<link rel="stylesheet" href="/farmStory/css/layout_bg.css"/>
<link rel="stylesheet" href="/farmStory/css/find/changePassword.css" />
</head>
<%@ include file="../layout/_header.jsp" %>
<script>
    document.addEventListener('DOMContentLoaded', function() {

    let pass1 = document.getElementsByName("pass1")[0];
    let pass2 = document.getElementsByName("pass2")[0];
    let next = document.getElementById("next");
    let formRegister = document.getElementsByName("formRegister")[0];

    next.onclick = function() {
        if (pass1.value !== pass2.value) {
            alert("비밀번호가 일치하지 않습니다.");
            return false;
        } else if (pass1.value === "" || pass2.value === "") {
            alert("비밀번호를 입력해 주세요.");
            return false;
        }

        formRegister.submit();

    }
    });
</script>

<main>
    <section>
        <form action="/farmStory/find/changePassword.do" method="post" name="formRegister">
            <h2>비밀번호 변경</h2>
            <table>
                <tbody>
                    <tr>
                        <td>아이디</td>
                        <td>${dto.uid}</td>
                    </tr>
                    <!-- uid를 서버로 전송하기 위한 hidden 필드 추가 -->
                    <input type="hidden" name="uid" value="${dto.uid}" />
                    <tr>
                        <td>새 비밀번호</td>
                        <td><input type="password" name="pass1" placeholder="새 비밀번호 입력">
                        <span class="passResult"></span>
                        </td>
                    </tr>
                    <tr>
                        <td>새 비밀번호 확인</td>
                        <td><input type="password" name="pass2" placeholder="새 비밀번호 입력">
                        </td>
                    </tr>
                </tbody>
            </table>
        </form>
        <p>
            비밀번호를 변경해 주세요. <br> 영문, 숫자, 특수문자를 사용하여 8자 이상 입력해 주세요.
        </p>
        <div>
            <a href="/farmStory/find/password.do">취소</a>
            <a href="javascript:void(0);" id="next">다음</a>
        </div>
    </section>
</main>
<%@ include file="../layout/_footer.jsp" %>


4) ChangePasswordController.java - doPost 메서드

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    // 요청 인코딩을 UTF-8로 설정
    req.setCharacterEncoding("UTF-8");

    // 응답 인코딩을 UTF-8로 설정
    resp.setCharacterEncoding("UTF-8");
    resp.setContentType("text/html; charset=UTF-8");

    String uid = req.getParameter("uid");
    String pass1 = req.getParameter("pass1");
    String pass2 = req.getParameter("pass2");

    // 비밀번호 불일치 시 경고창 후 이전 페이지로 이동
    if (!pass1.equals(pass2)) {
        resp.getWriter().write("<script>alert('비밀번호가 일치하지 않습니다.'); history.back();</script>");
        return;
    }

    // 비밀번호 변경 실행 (boolean 반환)
    boolean success = userservice.modifyPassword(uid, pass1);

    if (success) {
        resp.getWriter().write("<script>alert('비밀번호가 성공적으로 변경되었습니다!'); location.href='/farmStory/user/login.do';</script>");
    } else {
        resp.getWriter().write("<script>alert('비밀번호 변경 실패. 다시 시도해주세요.'); location.href='/farmStory/find/changePassword.do';</script>");
    }

    req.getSession().invalidate();  // 세션 종료

}