고래씌

[JSP] 4-3. 마이페이지 만들기(회원정보 변경, 회원탈퇴, 비밀번호 변경) 본문

Server/JSP과 Servlet

[JSP] 4-3. 마이페이지 만들기(회원정보 변경, 회원탈퇴, 비밀번호 변경)

고래씌 2023. 12. 7. 12:32

4.1과 4-2. 내용 이어집니다.

 

1. 마이페이지 만들기

 

■ common.css 파일에 mypage-form 디자인 추가

 

 

 

 

① myPage.jsp 파일 생성

 

 

■ MyPageController.java 파일

package com.kh.member.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class MyPageController
 */
@WebServlet("/myPage.me")
public class MyPageController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MyPageController() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// url로 직접 페이지 요청시
		// 로그인하기 전 요청인지 => 메인페이지로 sendRedirect
		// 로그인한 후 요청인지 확인 => 마이페이지로 포워딩
		
		HttpSession session = request.getSession();
		if(session.getAttribute("loginUser") == null) {   // 세션 안에 있는 로그인 정보가 있는지 없는지 확인. 로그인정보가 없다? 로그인전.
			session.setAttribute("alertMsg", "로그인 후 이용해주세요.");
			response.sendRedirect(request.getContextPath()); // 기본 root경로로 보냄
		} else {
			request.getRequestDispatcher("views/member/myPage.jsp").forward(request, response);

		}
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

 

 

■ myPage.jsp 파일

 

 

▶ 전화번호, 이메일, 주소입력창에 null값이면 빈값으로 출력되도록 설정, 취미도 체크가 되어있었다면 체크가 되어있도록 설정

 

 

 

취미도 체크가 되어있었다면 체크가 되어있도록 설정

- 방법 ① 

 

 

- 방법 ② 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%@ include file="../common/menubar.jsp" %>
	
	<div class="outer">
		<br>
		<h2 align="center">마이페이지</h2>
		
		<form action="<%= contextPath %>/myPage.me" method="post" id="mypage-form">

			 <table>
			 	<tr>
			 		<td>* 아이디</td>
			 		<td><input type="text" name="userId" value="<%= loginUser.getUserId() %>" maxlength="12" readonly></td>
			 		<td></td>
			 	</tr>
			 	<tr>
			 		<td>* 이름</td>
			 		<td><input type="text" name="userName" value="<%= loginUser.getUserName() %>" maxlength="6" required></td>
			 		<td></td>
			 	</tr>
			 	<tr>
			 		<td>전화번호</td>
			 		<td><input type="text" name="phone" value="<%= loginUser.getPhone() == null ? "" : loginUser.getPhone() %>"placeholder="- 포함해서 입력"></td>
			 		<td></td>
			 	</tr>
			 	<tr>
			 		<td>이메일</td>
			 		<td>
			 			<input type="email" name="email" value="<%= loginUser.getEmail() == null ? "" : loginUser.getEmail() %>"></td>
			 		<td></td>
			 	</tr>
			 	<tr>
			 		<td>주소</td>
			 		<td><input type="text" name="address" value="<%= loginUser.getAddress() == null ? "" : loginUser.getAddress()%>"></td>
			 		<td></td>
			 	</tr>
			 	<tr>
			 		<td>관심분야</td>
			 		<td colspan="2">
			 		<!-- 방법2 -->
			 			<% String interest = loginUser.getInterest() == null ? "" : loginUser.getInterest(); // "운동, 낚시, 취미" %>
			 			<input type="checkbox" name="interest" id="interest1" value="운동"
			 			<%= interest.contains("운동") ? "checked" : "" %>><label for="interest1">운동</label>
			 			<input type="checkbox" name="interest" id="interest2" value="등산"
			 			<%= interest.contains("등산") ? "checked" : "" %>><label for="interest2">등산</label>
			 			<input type="checkbox" name="interest" id="interest3" value="낚시"
			 			<%= interest.contains("낚시") ? "checked" : "" %>><label for="interest3">낚시</label>
			 			<input type="checkbox" name="interest" id="interest4" value="요리"
			 			<%= interest.contains("요리") ? "checked" : "" %>><label for="interest4">요리</label>
			 			<input type="checkbox" name="interest" id="interest5" value="게임"
			 			<%= interest.contains("게임") ? "checked" : "" %>><label for="interest5">게임</label>
			 			<input type="checkbox" name="interest" id="interest6" value="영화"
			 			<%= interest.contains("영화") ? "checked" : "" %>><label for="interest6">영화</label>
			 		</td>
			 	</tr>
			 </table>
			 
			 <script>
			 	// 방법1
			 	 const interest = "<%= loginUser.getInterest()%>"; // "운동, 요리" / "null"

				//console.log(intereest);
			 	
			 	// ["운동", "요리",..]
			 	interest.split(",").forEach(function(value){
			 		document.querySelector("input[type=checkbox][value='"+value+"']");
			 		console.log(value);
			 		// checkbox.checked = true;
			 	})
			 </script>
			 
			 <br><br>
			 
			 <div align="center">
			 	<button type="submit">정보변경</button>
			 	
			 </div>
			 
		</form>
	</div>

</body>
</html>

 

 

 


2. 사용자가 마이페이지 수정할 때

 

■ member-mapper.xml 파일

 

- 회원정보 변경 할 때

 

 

- 회원정보 페이지 다시 가져올 때

 

 

 

 

■ MyPageController.java

package com.kh.member.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.kh.member.model.service.MemberService;
import com.kh.member.model.vo.Member;

/**
 * Servlet implementation class MyPageController
 */
@WebServlet("/myPage.me")
public class MyPageController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MyPageController() {
        super();
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // url로 직접 페이지 요청시
        // 로그인하기 전 요청인지 => 메인페이지로 sendRedirect
        // 로그인한 후 요청인지 확인 => 마이페이지로 포워딩
        // 마이페이지로 포워딩

        HttpSession session = request.getSession();
        if(session.getAttribute("loginUser") == null) {   // 세션 안에 있는 로그인 정보가 있는지 없는지 확인. 로그인정보가 없다? 로그인전.
            session.setAttribute("alertMsg", "로그인 후 이용해주세요.");
            response.sendRedirect(request.getContextPath()); // 기본 root경로로 보냄
        } else {
            request.getRequestDispatcher("views/member/myPage.jsp").forward(request, response);

        }
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 회원정보 변경 페이지

        request.setCharacterEncoding("UTF-8");

        String userId = request.getParameter("userId");
        String userName = request.getParameter("userName");
        String phone = request.getParameter("phone");
        String email = request.getParameter("email");
        String address = request.getParameter("address");
        String interest = String.join(",", 
                        request.getParameterValues("interest") == null ? 
                        new String[]{} : request.getParameterValues("interest"));
        // 사용자가 체크한 값이 없다면 빈 배열을 보여주고, 있다면 체크한 항못들을 보여준다.

        Member m = new Member(userId, userName, phone, email, address, interest);

        // 3) 요청처리
        Member updateMem = new MemberService().updateMember(m);

        // 4) 돌려받은 결과를 가지고 사용자가 보게될 응답 화면 지정
        if(updateMem == null) {  // 실패
            request.setAttribute("errorMsg", "회원정보 수정에 실패했습니다.");
            request.getRequestDispatcher("views/common/errorPage.jsp").forward(request, response);
        } else { // 성공
            HttpSession session = request.getSession();
            session.setAttribute("alertMsg", "성공적으로 회원정보를 수정했습니다.");
            // session.removeAttribute("loginUser");  // 이것을 안지워도 된다! 왜냐하면...
            session.setAttribute("loginUser", updateMem);   // 같은 키값은 존재할 수 없다! => 같은 키값이 존재하면 덮어쓰기된다.
            // 회원정보가 변경됨

            response.sendRedirect(request.getContextPath()+"/myPage.me");  // 다시 마이페이지로 url 재요청
        }

    }

}

 

 

▶ Member클래스. 생성자가 없기때문에 Member클래스에 생성자를 생성해준다.

 

=> Member 클래스에 생성자가 없기 때문에 만들어줌

 

 

 

■ MemberService.java 파일에 회원정보 변경에 관한 메소드 추가

 

 

 

 

■ MemberDao 클래스에 updateMember 메소드와 selectMember 메소드 추가

 

UPDATE  => 처리된 행의 개수를 반환한다.

 

 

 

 

 

 

 


3. 회원탈퇴

■ myPage.jsp 파일에 </body> 바로 앞에 이와같은 코드를 붙힌다.

<!-- The Modal -->
    <div class="modal" id="deleteForm">
      <div class="modal-dialog">
        <div class="modal-content">
          <!-- Modal Header -->
          <div class="modal-header">
            <h4 class="modal-title">회원탈퇴</h4>
            <button type="button" class="close" data-dismiss="modal">&times;</button>
          </div>
          <!-- Modal body -->
          <div class="modal-body" align="center">
          
            <b>탈퇴 후 복구가 불가능합니다. <br>정말로 탈퇴하시겠습니까?</b><br><br>
            
            <form action="<%= contextPath %>/delete.me" method="post">
                <table>
                    <tr>
                        <td>비밀번호</td>
                        <td><input type="password" name="userPwd" required></td>
                    </tr>
                </table>
                <br>
                <button type="submit" class="btn btn-danger btn-sm">탈퇴하기</button>
            </form>
            
            </div>
        </div>
      </div>
    </div>
    
    <!-- The Modal -->
    <div class="modal" id="updatePwdForm">
      <div class="modal-dialog">
        <div class="modal-content">
          <!-- Modal Header -->
          <div class="modal-header">
            <h4 class="modal-title">비밀번호 변경</h4>
            <button type="button" class="close" data-dismiss="modal">&times;</button>
          </div>
          
          <!-- Modal body -->
          <div class="modal-body" align="center">
            <form action="<%= contextPath %>/updatePwd.me" method="post">
                <!-- 현재 비밀번호, 변경할 비밀번호, 변경할 비밀번호 재입력 -->
                <input type="hidden" name="userId" value="<%= loginUser.getUserId() %>">
                <table>
                    <tr>
                        <td>현재 비밀번호</td>
                        <td><input type="password" name="userPwd" required></td>
                    </tr>
                    <tr>
                        <td>변경할 비밀번호</td>
                        <td><input type="password" name="updatePwd" required></td>
                    </tr>
                    <tr>
                        <td>변경할 비밀번호 재입력</td>
                        <td><input type="password" name="checkPwd" required></td>
                    </tr>
                </table>
                <br>
                <button type="submit" class="btn btn-secondary btn-sm" onclick="return validatePwd();">비밀번호 변경</button>
            </form>
            
            <script>
            // 제대로된 비밀번호를 입력했는지 유효성 검사
                function validatePwd() {
                    if($("input[name=updatePwd]").val() != $("input[name=checkPwd]").val()) {
                        alert("비밀번호가 일치하지 않습니다.");
                        return false;
                    }
                }
            </script>
          </div>
        </div>
      </div>
    </div>

 

 

 

 

■ DelectController.java 파일

package com.kh.member.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.kh.member.model.service.MemberService;
import com.kh.member.model.vo.Member;

/**
 * Servlet implementation class DelectController
 */
@WebServlet("/delete.me")
public class DelectController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DelectController() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 회원탈퇴
		request.setCharacterEncoding("UTF-8");
		
		String userPwd = request.getParameter("userPwd");  // 사용자가 입력한 값은 비밀번호임
		
		// sessoin에서 loginUser내에 있는 id 값 가져오기
		HttpSession session = request.getSession();
		
		String userId = ((Member) session.getAttribute("loginUser")).getUserId();
		
		int result = new MemberService().deleteMember(userId, userPwd);

		
		if(result > 0) {
			session.setAttribute("alertMsg", "성공적으로 회원탈되 되었습니다.");
			session.removeAttribute("loginUser");
			
			response.sendRedirect(request.getContextPath());
		}else {
			request.setAttribute("errorMsg", "회원탈퇴에 실패했습니다.");
			request.getRequestDispatcher("views/common/errorPage.jsp").forward(request, response);
		}
	}

}

 

 

=> 비밀번호가 일치하지않아 실패할경우 errorPage.jsp로 넘어가서 실패했다는 문구가 뜨도록 설정

=> 실패할경우 아래와 같은 페이지로 이동하도록 설정하였다.

 

 

 

■ MemberService.java

 

 

 

■ member-mapper.xml

 

 

■ MemberDao.java

 

 

▶ 구현영상

 

 

 


4. 비밀번호 변경

 

① 비밀번호 변경 쿼리문 작성

=> 로그인 쿼리문 호출시켜서 변경하는 방법도 있긴하다!

 

■ member-mapper.xml

 

 

② myPage.js에 form 태그의 action 확인 후 servelt 작성

myPage.jsp

 

 

■ MemberUpdatePwdController.java

package com.kh.member.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.kh.member.model.service.MemberService;
import com.kh.member.model.vo.Member;

/**
 * Servlet implementation class MemberUpdatePwdController
 */
@WebServlet("/updatePwd.me")
public class MemberUpdatePwdController extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public MemberUpdatePwdController() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
	
		String userId = request.getParameter("userId");
		String userPwd = request.getParameter("userPwd");
		String updatePwd = request.getParameter("updatePwd");
		
		Member updateMem = new MemberService().updatePwdMember(userId, userPwd, updatePwd);
	
		HttpSession session = request.getSession();
		if(updateMem == null) {  // 실패
			session.setAttribute("alertMsg", "비밀번호 변경에 실패했습니다.");
		} else {
			session.setAttribute("alertMsg", "성공적으로 비밀번호를 변경했습니다.");
			session.setAttribute("loginUser", updateMem); // 조회한 키값으로 동일하다면 덮어씌우기함
		}
		
		response.sendRedirect(request.getContextPath()+"/myPage.me");  // request.getContextPath() => /jsp
	}

}

 

=> 갱신된 회원정보를 조회하고(updateMem) 있다면 "성공적으로 비밀번호를 변경했습니다."라는 알람창 출력하고 덮어씌워지게 된다.

 

Member updateMem = new MemberService().updatePwdMember(userId, userPwd, updatePwd);

 

=> 갱신된 회원정보를 가져와 저장

 

 

③ JDBC 객체 연결

=> JDBCTemplated에 있는 getConnection() 호출하여 Connection 객체 생성함!!

 

 

■ MemberService.java

 

 

 

④ SQL문 처리

■ MemberDao.java