반응형

회원 탈퇴 기능 구현

 

  • 회원 정보에서 회원 탈퇴 링크 추가

 

 

  • 생성된 링크 모습

 

 

 

  • 회원 탈퇴 페이지
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title> 회원 정보 </title>
</head>
<body>

<h1>회원 탈퇴</h1>
<div th:replace="/fragments/layout.html :: fragment-body-menu"></div>
<div th:replace="/fragments/layout.html :: fragment-member-info-menu"></div>

<div>
    <p>
        회원 탈퇴를 하면
        서비스를 더 이상 이용하실 수 없습니다.
        <br/>
        회원 탈퇴를 진행하시겠습니까?
    </p>

    <form id="submitForm" method="post">
        <div>
            <input type="password" name="password" placeholder="현재 비밀번호 입력" required/>
        </div>
        <div>
            <button type="submit">회원 탈퇴 하기</button>
        </div>
    </form>
</div>

</body>
</html>

 

 

 

  • 페이지 맵핑을 위한 컨트롤러
@GetMapping("/member/withdraw")
public String memberWithdraw(Model model) {

    return "member/withdraw";
}

 

 

 

 

 

 

  • 평문 패스워드와 암호화된 패스워드 비교 메서드
  • 평문 패스워드를 암호화하는 메서드
package com.zerobase.fastlms.util;

import org.springframework.security.crypto.bcrypt.BCrypt;

public class PasswordUtils {

    public static boolean equals(String plaintext, String hashed) {

        if (plaintext == null || plaintext.length() < 1) {
            return false;
        }

        if (hashed == null || hashed.length() < 1) {
            return false;
        }
        return BCrypt.checkpw(plaintext, hashed);
    }

    public static String encPassword(String plaintext) {

        if (plaintext == null || plaintext.length() < 1) {
            return "";
        }
        return BCrypt.hashpw(plaintext, BCrypt.gensalt());
    }
}

 

 

 

  • 탈퇴 처리를 위한 컨트롤러
@PostMapping("/member/withdraw")
public String memberWithdrawSubmit(Model model
        , MemberInput parameter
        , Principal principal) {

    String userId = principal.getName();

    ServiceResult result = memberService.withdraw(userId, parameter.getPassword());
    if (!result.isResult()) {
        model.addAttribute("message", result.getMessage());
        return "common/error";
    }

    return "redirect:/member/logout";
}

 

 

 

  • 회원 탈퇴를 위한 서비스 인터페이스 생성
/**
 * 회원 탈퇴
 */
ServiceResult withdraw(String userId, String password);

 

 

 

  • 탈퇴한 회원에 대한 상태가 필요함
package com.zerobase.fastlms.member.entity;

public interface MemberCode {

    /* 현재 가입 요청 상태 */
    String MEMBER_STATUS_REQ = "REQ";

    /* 현재 정상 이용 상태 */
    String MEMBER_STATUS_ING = "ING";

    /* 현재 정지 상태  */
    String MEMBER_STATUS_STOP = "STOP";

    /* 현재 탈퇴 상태 */
    String MEMBER_STATUS_WITHDRAW = "WITHDRAW";
}

 

 

 

  • Dto에서는 기본적으로 password를 받아오지 않으므로,
  • password를 별도의 입력값으로 받아야함.
@Override
public ServiceResult withdraw(String userId, String password) {

    Optional<Member> optionalMember = memberRepository.findById(userId);
    if (!optionalMember.isPresent()) {
         return new ServiceResult(false, "회원 정보가 존재하지 않습니다.");
    }

    Member member = optionalMember.get();

    if (!PasswordUtils.equals(password, member.getPassword())) {
        return new ServiceResult(false, "비밀번호가 일치하지 않습니다.");
    }

    member.setUserName("삭제회원");
    member.setPhone("");
    member.setPassword("");
    member.setRegDt(null);
    member.setUdtDt(null);
    member.setEmailAuthYn(false);
    member.setEmailAuthDt(null);
    member.setEmailAuthKey("");
    member.setResetPasswordKey("");
    member.setResetPasswordLimitDt(null);
    member.setUserStatus(MemberCode.MEMBER_STATUS_WITHDRAW);
    member.setZipcode("");
    member.setAddr("");
    member.setAddrDetail("");
    memberRepository.save(member);

    return new ServiceResult();
}

 

 

 

  • 회원 탈퇴 기능 테스트

 

 

  • 비밀번호가 일치하지 않는 경우

 

 

 

  • 비밀번호가 맞는 경우 탈퇴 처리 완료

 

 

 

  • DB에서 리셋된 모습

 

 


반응형

+ Recent posts