<< 학습 목표 >>
1. 회원 탈퇴 기능을 구현할 수 있다.
드디어 이번 챕터의 마지막인 회원 탈퇴 기능을 구현하자
회원 탈퇴 기능은 매우 간단함
회원 탈퇴 기능을 개발할 때는 어떤걸 먼저해야한다???
기능에 대한 정의, 스토리보드, 인터페이스
이 세 가지는 앞서 ( https://codingaja.tistory.com/49 ) 이미 했으므로 전 글을 보고 오자
회원 탈퇴 기능을 구현하기 위해서는
1. 메인 페이지의 회원 탈퇴 버튼에 "회원 탈퇴 버튼 클릭 시 회원 탈퇴 요청이 들어가도록 추가"
2. 회원 탈퇴 요청을 받아 회원 탈퇴 처리
2-1. 회원 탈퇴 요청을 받을 컨트롤러
2-2. 회원 탈퇴 요청을 처리할 서비스
2-3. 회원 탈퇴 처리를 할 DAO
<< 1. 메인 페이지의 회원 탈퇴 버튼에 "회원 탈퇴 버튼 클릭 시 회원 탈퇴 요청이 들어가도록 추가" >>
메인 페이지를 출력하는 서블릿(member 패키지 -> MemberMain 서블릿)으로 가서 닫는 main 태그(</main>)와 닫는 body태그(</body>) 사이에 다음과 같이 JS 코드를 추가하자
// ...
pw.print("<script src=\"https://code.jquery.com/jquery-3.6.3.min.js\" integrity=\"sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU=\" crossorigin=\"anonymous\"></script>");
pw.print("<script>");
pw.print(" $(\"#delete_btn\").on(\"click\", function() {");
pw.print(" if(confirm(\"탈퇴하시겠습니까?\")) {");
pw.print(" $.ajax({");
pw.print(" url: $(this).attr(\"href\"),");
pw.print(" type: \"POST\",");
pw.print(" success: function() {");
pw.print(" location.reload();");
pw.print(" },");
pw.print(" error: function() {");
pw.print(" }");
pw.print(" });");
pw.print(" }");
pw.print(" return false;");
pw.print(" });");
pw.print("</script>");
// ...
<< 코드 설명 >>
탈퇴 버튼을 클릭(1)하면 탈퇴 여부를 물어봄(2)
탈퇴를 한다고 했다면(3) ajax로 탈퇴 요청을 보냄(4)
탈퇴가 되었다면(5) 페이지를 새로고침(6)해 메인 페이지를 다시 보여줌
<< 2. 회원 탈퇴 요청을 받아 회원 탈퇴 처리 >>
2-1. 회원 탈퇴 요청을 받을 컨트롤러
member 패키지 -> MemberDelete 서블릿 추가 후 아래 코드 추가
package member;
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;
@WebServlet("/member/delete")
public class MemberDelete extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
if(session.getAttribute("member") == null) {
response.sendRedirect("/member/login");
return ;
}
MemberDto member = (MemberDto) session.getAttribute("member");
MemberService service = new MemberService();
service.deleteMemberByIdx(member.getIdx());
session.invalidate();
}
}
<< 코드 설명 >>
1. 로그인한 사용자만 탈퇴할 수 있으므로 로그인하지 않은 사용자라면 로그인 페이지로 리다이렉트
로그인 후 메인 페이지에 몇 시간 이상, 장시간 머물렀을 경우 로그인이 풀릴 수 있음
사용자는 로그인이 풀렸다는걸 모르는 상태로 회원 탈퇴 버튼을 눌렀을 수 있으므로 회원 탈퇴 컨트롤러에서 로그인 여부를 확인하는 것
2. 로그인한 사용자의 회원 번호로 회원 탈퇴 처리
3. 회원 탈퇴를 했으므로 세션을 삭제해 세션에 저장된 로그인 정보 삭제

2-2. 회원 탈퇴 요청을 처리할 서비스
회원 정보 처리 서비스(member 패키지 -> MemberService 클래스) 내 회원 탈퇴 처리 서비스 메서드 추가
package member;
public class MemberService {
public void deleteMemberByIdx(int idx) {
MemberDao dao = new MemberDao();
dao.deleteMemberByIdx(idx);
}
// ...
<< 코드 설명 >>
기능에 대한 정의에서 회원 탈퇴란 회원 정보 삭제 라고 했으므로 DAO를 통해 DB에 저장된 회원 정보 삭제(1)

2-3. 회원 탈퇴 처리를 할 DAO
회원 정보 처리 DAO(member패키지 -> MemberDao 클래스) 내 회원 탈퇴 메서드 추가
// ...
public void deleteMemberByIdx(int idx) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBUtil.getConnection();
String sql = "DELETE FROM member WHERE idx = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, idx);
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.closes(conn, pstmt);
}
}
// ...
<< 코드 설명 >>
idx로 회원 정보를 삭제할 쿼리 준비(1)
?에 탈퇴할 회원의 idx를 저장(2)
회원 정보 삭제 쿼리 보내기 & 실행(3)

서버를 시작하고 로그인 후 회원 탈퇴를 해보자
여기까지 회원 탈퇴를 구현했음
실제 서비스에서는 회원 탈퇴가 회원 정보를 삭제하지 않음
실제 서비스에서는 회원 정보 테이블에 회원 정보에 회원 탈퇴 플래그(Flag) 칼럼을 둠
그리고 회원 탈퇴 시 회원 탈퇴 플래그를 true로 바꿈
실제 서비스에서 회원 정보를 삭제하지 않는 이유는 여러 이유가 있지만 회원 정보는 그 서비스의 굉장히 중요한 자산 중 하나임
보통 실제 서비스는 특정 회원이 우리 서비스에서 어떤 활동을 하는지 기록해둠
그리고 그것들을 활용해서 서비스를 개선함
회원 탈퇴 시 회원 정보를 삭제하면 그것들 모두 지워야하므로 서비스를 개선 수 없음
우리의 회원 탈퇴 처리를 실제와 가깝게 회원 탈퇴 플래그로 핸들링 하려면 회원 탈퇴 뿐만 아니라 다른 코드들도 수정해야하므로 다음 글에서 바꿔보자
'Servlet + JSP > Serlvet-Chapter05' 카테고리의 다른 글
Chapter05. CRUD 프로젝트 / 회원 탈퇴 개선 (0) | 2023.03.28 |
---|---|
Chapter05. CRUD 프로젝트 / 회원 정보 수정 (0) | 2023.03.28 |
Chapter05. CRUD 프로젝트 / 로그인 정보 활용하기 ( 세션 활용 3 ) (0) | 2023.03.27 |
Chapter05. CRUD 프로젝트 / 로그인 정보 저장하기 ( 세션 활용 2 ) (0) | 2023.03.27 |
Chapter05. CRUD 프로젝트 / 로그인 상태 저장하기 ( 세션 활용 1 ) (0) | 2023.03.27 |