본문 바로가기

카테고리 없음

[회원 예제] 3. 회원 정보 수정, 회원 탈퇴 구현

회원 정보 수정하고 회원 탈퇴 구현해보자

 

⚠️주의⚠️

이전 내용 구현 후 진행

https://yun000.tistory.com/222

 

로그인,로그아웃 구현

⚠️주의⚠️회원가입 구현 후 진행 가능https://yun000.tistory.com/219 회원 가입 구현MVC pattern으로 회원가입을 만들어보자 🍏구조project는 Dynamic Web Project생성.project이름은 FinalPrj로 했다. 🍏설정1

yun000.tistory.com


 

🍏구조

 

🍏 설정

JSTL세팅

https://yun000.tistory.com/229

 

JSTL사용 세팅

ApacheTomcat 홈페이지https://tomcat.apache.org/download-taglibs.cgi Apache Tomcat® - Apache Taglibs DownloadsWelcome to the Apache Taglibs download page. This page provides download links for obtaining the latest version of the Apache Standard Taglib

yun000.tistory.com

 

🍏코드

 

◆ MemberDAO.java

=deleteMember, updateMember추가

package com.example.myweb.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import com.example.myweb.model.MemberVO;

public class MemberDAO {

    private DataSource ds;

    public MemberDAO() {
        try {
            Context ctx = new InitialContext();
            ds = (DataSource) ctx.lookup("java:comp/env/jdbc/Oracle");
        } catch (Exception e) {
            throw new RuntimeException("DataSource lookup failed: " + e.getMessage());
        }
    }

    public void insert(MemberVO member) {
        Connection con = null;
        try {
            con = ds.getConnection(); // DataSource에서 Connection 가져오기
            String sql = "INSERT INTO member (userid, name, password, email, address) VALUES (?, ?, ?, ?, ?)";
            PreparedStatement pstmt = con.prepareStatement(sql);
            pstmt.setString(1, member.getUserid());
            pstmt.setString(2, member.getName());
            pstmt.setString(3, member.getPassword());
            pstmt.setString(4, member.getEmail());
            pstmt.setString(5, member.getAddress());
            pstmt.executeUpdate();
        } catch (Exception e) {
            throw new RuntimeException("MemberDAO.insert() : " + e.getMessage());
        } finally {
            if (con != null) try { con.close(); } catch (Exception ignored) {}
        }
    }
    
    public String getPassword(String userid)
    {
    	String pw="";
    	Connection con=null;
    	try {
			con=ds.getConnection();
			String sql="SELECT password from member where userid=?";
			PreparedStatement pstmt=con.prepareStatement(sql);
			pstmt.setString(1,userid);
			ResultSet rs=pstmt.executeQuery();
			
			//something exsists
			if(rs.next()) {
				pw=rs.getString("password");
			}
			else {
				throw new SQLException("there is no such id");
			}
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
			throw new RuntimeException(e);
			
		}finally {
			closeConnection(con);
		}
    	
    	return pw;
    }
  
    private void closeConnection(Connection con)
    {
    	if(con!=null) {
    		try {con.close();}catch(Exception e){}
    	}
    }
    
    public MemberVO getMember(String userid) {
    	 MemberVO member = new MemberVO();
    	 Connection con = null;
    	 try {
	    	 con = ds.getConnection();
	    	 
	    	 String sql = "select * from member where userid=?";
	    	 PreparedStatement pstmt = con.prepareStatement(sql);
	    	 pstmt.setString(1, userid);
	    	 ResultSet rs = pstmt.executeQuery();
	    	 
	    	 if(rs.next()) {
		    	 //조회한 결과(rs.getXxxx())를 member 객체에 setXxx 합니다.
		    	 member.setUserid(rs.getString("userid"));
		    	 member.setName(rs.getString("name"));
		    	 member.setPassword(rs.getString("password"));
		    	 member.setEmail(rs.getString("email"));
		    	 member.setAddress(rs.getString("address"));
	    	 }
	    	 else {throw new RuntimeException("no user");}
    	 } 
    	 catch (Exception e) {
    		 throw new RuntimeException("MemberDAO.getMember : " + e.getMessage());
    	 } 
    	 finally{
    		 closeConnection(con);
    	 }
    	 return member;
	 }
    
    public void updateMember(MemberVO member)
    {
    	Connection con = null;
        try {
            con = ds.getConnection(); // DataSource에서 Connection 가져오기
            String sql = "UPDATE member SET name=?, password=?, email=?, address=? WHERE userid=?";
            
            PreparedStatement pstmt = con.prepareStatement(sql);
            
            pstmt.setString(1, member.getName());
            pstmt.setString(2, member.getPassword());
            pstmt.setString(3, member.getEmail());
            pstmt.setString(4, member.getAddress());
            pstmt.setString(5, member.getUserid());
            //pstmt.executeUpdate();
            
            int rowCount=pstmt.executeUpdate();
            System.out.println(rowCount+"개 행이 변경");
            if(rowCount<=0) {
            	throw new RuntimeException("변경된 행 없음");
            }
            
        } catch (Exception e) {
            throw new RuntimeException("MemberDAO.insert() : " + e.getMessage());
        } finally {
            closeConnection(con);
        }
    }
    
    public void deleteMember(String userid,String password)
    {
    	Connection con=null;
    	try {
			con=ds.getConnection();
			String sql="DELETE FROM member WHERE userid=? AND password=?";
			
			PreparedStatement pstmt = con.prepareStatement(sql);
			pstmt.setString(1, userid);
			pstmt.setString(2, password);
			//pstmt.executeUpdate();
			
			int rowCount=pstmt.executeUpdate();
			if(rowCount<=0) {
				throw new RuntimeException("wrong id or password");
			}
			
		} catch (Exception e) {
			throw new RuntimeException("MemberDAO.delete() : " + e.getMessage());
		} finally {
			closeConnection(con);
		}
    }
}

 

 

◆ AuthFilter.java

=사용자 인증 구현

package com.example.myweb.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class AuthFilter implements Filter {

	String encoding = "utf-8";
	
	public void init(FilterConfig fConfig) throws ServletException {
		encoding = fConfig.getInitParameter("encoding");
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
			throws IOException, ServletException 
	{
		request.setCharacterEncoding(encoding);
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		
		HttpSession session = req.getSession();
		String userid = (String)session.getAttribute("userid");
		
		if(userid==null) {
			res.sendRedirect("/Login.do");
			return;
		}
		
		CharUpperWrapper requestWrapper = new CharUpperWrapper(req);
		chain.doFilter(requestWrapper, response);
	}

	public void destroy() {
	}
}

 

 

◆ CharUpperWrapper.java

=얻은 파라미터를 대문자로 변경한다.

package com.example.myweb.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class CharUpperWrapper extends HttpServletRequestWrapper {

	HttpServletRequest request;
	
	public CharUpperWrapper(HttpServletRequest request) {
		super(request);
		this.request = request;
	}

	public String getParameter(String name) {
		String value = request.getParameter(name);
		return value.toUpperCase();
	}
}

 

 

◆ MemberVO.java

package com.example.myweb.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data //Getter Setter
@NoArgsConstructor //기본 생성자
@AllArgsConstructor
public class MemberVO {
    private String userid;
    private String name;
    private String password;
    private String email;
    private String address;
}

 

 

◆ MemberServlet.java

=회원 수정, 탈퇴 추가

package com.example.myweb.web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
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.example.myweb.dao.MemberDAO;
import com.example.myweb.model.MemberVO;


@WebServlet("/member/Member.do")
public class MemberServlet extends HttpServlet 
{
	MemberDAO dao;
	public void init(ServletConfig config) throws ServletException 
	{ dao = new MemberDAO(); }
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		request.setCharacterEncoding("utf-8");
		String action=request.getParameter("action");
		
		//회원 가입
		if("insert".equals(action))
		{
			String userid = request.getParameter("userid"); //요청 파라미터 받아서
			String name = request.getParameter("name");
			String password = request.getParameter("password");
			String email = request.getParameter("email");
			String address = request.getParameter("address");
			
			MemberVO member = new MemberVO(userid,name,password,email,address);

			response.setContentType("text/html;charset=utf-8");
			try {
				//insert informations
				dao.insert(member);
				response.sendRedirect("/Login.do");
			}
			catch(Exception e) { 
				throw new RuntimeException(e);
			}
		}
		//회원 수정
		else if("update".equals(action))
		{
			String userid = (String)request.getSession().getAttribute("userid");
			String name = request.getParameter("name");
			String password = request.getParameter("password");
			String email = request.getParameter("email");
			String address = request.getParameter("address");
			
			if(userid==null) {
				throw new RuntimeException("로그인한 사용자 없습니다");
			}else {
				MemberVO member=new MemberVO(userid,name,password,email,address);
				dao.updateMember(member);
				response.sendRedirect("/member/Member.do?action=select");
			}
		}
		//회원 탈퇴
		else if("delete".equals(action))
		{
			String userid = (String)request.getSession().getAttribute("userid");
			String password = request.getParameter("password");
			
			String view="index.jsp";
			
			if(userid==null) {
				throw new RuntimeException("로그인한 사용자 없습니다");
			}
			else
			{
				try {
					String dbpw=dao.getPassword(userid);
					
					if(dbpw.contentEquals(password)){
						//correct password
						dao.deleteMember(userid,password);
						MemberVO member=new MemberVO();
					}
					else {
						//wrong password
						throw new RuntimeException("wrong password! 회원 탈퇴 불가");
					}
				} 
				catch (RuntimeException e) {
					request.setAttribute("message", e.getMessage());
					view="loginerror.jsp";
				}
				
				RequestDispatcher disp=request.getRequestDispatcher("/WEB-INF/views/"+view);
				disp.forward(request, response);
			}
		}
	}
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		String action =request.getParameter("action");
		HttpSession session=request.getSession();
		String view="/index.jsp";
		
		//회원가입
		if("insert".equals(action) || action==null) {
			request.setAttribute("action", "insert");
			view="/member/memberform.jsp";
		}
		//회원 수정
		else if("select".equals(action)) {
			
			String userid=(String)session.getAttribute("userid");
			if(userid==null){
				request.setAttribute("message", "로그인하지 않은 사용자");
				view="/loginform.jsp";
			}
			else {
				MemberVO member=dao.getMember(userid);
				request.setAttribute("member", member);
				request.setAttribute("action", "update");
				view="/member/memberform.jsp";
			}
		}
		//회원 탈퇴
		else if("delete".equals(action)) {
			
			String userid=(String)request.getSession().getAttribute("userid");
			if(userid==null){
				request.setAttribute("message", "로그인하지 않은 사용자");
				view="/loginform.jsp";
			}
			else {
				request.setAttribute("action", "delete");
				view="/deleteform.jsp";
			}
		}

		RequestDispatcher disp=request.getRequestDispatcher("/WEB-INF/views"+view);
		disp.forward(request, response);
	}
}

 

 

◆sample.jsp

=인증된 사용자만 볼 수 있는 페이지

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>로그인 사용자만 볼 수 있습니다.</h1>
	${param.name}
</body>
</html>

 

 

◆ runtime.jsp

=runtime exception 발생할 때 다듬어진 화면을 사용자가 볼 수 있게 해준다

<%@ page language="java" contentType="text/html; charset=UTF-8"
	isErrorPage="true"
    pageEncoding="UTF-8"%>
<%
	response.setStatus(200);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ERROR</title>
</head>
<body>
	<h1><%=exception.getMessage() %></h1> <!-- exception발생했을 때만 생견단다 -->
	<h2>runtime exception</h2>
	
	<pre>
		<%
			exception.printStackTrace(new java.io.PrintWriter(out));
		%>
	</pre> 

</body>
</html>

 

 

◆ memberform.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원정보</title>
</head>
<body>
	<h1>회원 정보 입력 폼</h1>
	 <form action="/member/Member.do" method="post">
	 <fieldset>
		 <legend>회원정보</legend>
		 <table>
			 <tr>
				 <td class="label">아이디</td>
				 <td class="field"><input type="text" name="userid" value="${member.userid}" ${empty member.userid ? "": "readonly" }></td>
			 </tr>
			 <tr>
				 <td class="label">비밀번호</td>
				 <td class="field"><input type="password" name="password" value="${member.password}"></td>
			 </tr>
			 <tr>
				 <td class="label">이름</td>
				 <td class="field"><input type="text" name="name" value="${member.name}"></td>
			 </tr>
			 <tr>
				 <td class="label">이메일</td>
				 <td class="field"><input type="text" name="email" value="${member.email}"></td>
			 </tr>
			 <tr>
				 <td class="label">주소</td>
				 <td class="field"><input type="text" name="address" size="50" value="${member.address}"></td>
			 </tr>
		 </table>
		 
		 <input type="hidden" name="action" value="${action}">
		 <input type="submit" value="  save  "> 
		 <input type="reset" value="  reset  ">
	 </fieldset>
	</form>

</body>
</html>

 

 

◆ deleteform.jsp

=회원탈퇴 시 아이디와 비밀번호를 한 번 더 입력할 것이다

이 정보가 맞아야 회원 탈퇴가 가능하다

<%@ 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>
	<h1>회원 탈퇴</h1>
	 <form action="/member/Member.do" method="post">
	 <fieldset>
		 <legend>회원정보</legend>
		 <table>
			 <tr>
				 <td class="label">아이디</td>
				 <td class="field"><input type="text" name="userid" value="${member.userid}"></td>
			 </tr>
			 <tr>
				 <td class="label">비밀번호</td>
				 <td class="field"><input type="password" name="password" value="${member.password}"></td>
			 </tr>
		 </table>
		 
		 <input type="hidden" name="action" value="${action}">
		 <input type="submit" value="  탈퇴  "> 
		 <input type="reset" value="  reset  ">
	 </fieldset>
	</form>
</body>
</html>

 

 

◆ index.jsp

<%@ page contentType="text/html; charset=UTF-8"
		 import="java.util.Date, 
		         java.util.Random,
		         java.util.Enumeration"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Welcome page</title>
</head>

<body>
	
	<%@ include file="header.jsp" %>
	<a href="<c:url value='/Login.do'/>">로그인</a>
	<c:url value="/member/Member.do" var="insert" scope="page"/>
	<a href="${insert}">회원가입</a>
	<a href="/member/Member.do?action=select">회원정보 수정</a>
	<a href="/member/Member.do?action=delete">회원정보 삭제</a>
	
	<br><br>
	<%
	out.println(new Date() + "<br>");
	out.println(new Random().nextInt());
	%><br>
	RemoteAddr: <%= request.getRemoteAddr() %><br>
	URI: <%= request.getRequestURI() %><br>
	URL: <%= request.getRequestURL() %><br>
	
	<c:forEach var="i" begin="0" end="10">
	${i} 
	</c:forEach>
	<jsp:include page="footer.jsp"/>
	<%-- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
	<c:import url="https://www.naver.com"/> --%>
</body>
</html>

 

 

◆ web.xml

=AuthFilter을 추가했다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>FinalPrj</display-name>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

<!-- /////////////////////////////////////////////////////////////////// -->

    <servlet>
	    <servlet-name>MemberServlet</servlet-name>
	    <servlet-class>com.example.myweb.web.MemberServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
	    <servlet-name>MemberServlet</servlet-name>
	    <url-pattern>/servlet/com.example.myweb.web.MemberServlet</url-pattern>
	</servlet-mapping>

<!-- /////////////////////////////////////////////////////////////////// -->
	<servlet>
	    <servlet-name>LoginServlet</servlet-name>
	    <servlet-class>com.example.myweb.web.LoginServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
	    <servlet-name>LoginServlet</servlet-name>
	    <url-pattern>/servlet/com.example.myweb.web.LoginServlet</url-pattern>
	</servlet-mapping>
	
<!-- /////////////////////////////////////////////////////////////////// -->
	<error-page>
		<error-code>404</error-code>
		<location>/WEB-INF/views/error/404.jsp</location>
	</error-page> 
 
	 <error-page>
	 	<exception-type>java.lang.RuntimeException</exception-type>
		<location>/WEB-INF/views/error/runtime.jsp</location>
	 </error-page> 
	 
<!-- /////////////////////////////////////////////////////////////////// -->
	  <filter>
	  	<filter-name>AuthFilter</filter-name>
	  	<filter-class>com.example.myweb.filter.AuthFilter</filter-class>
	  	<init-param>
	  		<param-name>encoding</param-name>
	  		<param-value>utf-8</param-value>
	  	</init-param>
	  </filter>
	  
	  <filter-mapping>
	  	<filter-name>AuthFilter</filter-name>
	  	<url-pattern>/auth/*</url-pattern>
	  </filter-mapping>
</web-app>

 

 

🍏결과

▶ 로그인 후 회원 정보 업데이트 가능

 

 

회원 로그인 상태에서 탈퇴

 

 

URI정리

기능 URI Method view
회원정보입력 /member/Member.do?action=insert GET /member/memberform.jsp
회원정보입력 /member/Member.do?action=insert POST redirect/index.jsp
회원정보조회 /member/Member.do?action=select GET /member/memberform.jsp
회원정보수정 /member/Member.do?action=update POST redirect/member/Member.do?action=select
회원정보삭제 /member/Member.do?action=delete GET /member/deleteform.jsp
회원정보삭제 /member/Member.do?action=delete POST redirect/index.jsp