본문 바로가기
Project/소경관

[소경관] : JPA 회원 탈퇴 구현하기 및 회원 탈퇴 Session 처리하기

by 오주현 2022. 6. 4.
반응형

기능 중 회원에 관한 기능을 이번 휴일 내로 다 구현하기로 해서 천천히 만들고 있다.

 

이번에는 회원 탈퇴를 구현해야 하는데 일단, JPA를 사용하는 것이 처음이라 여러 예시를 찾아보고 몇 가지를 테스트한 뒤에 구현하고 성공했다.

 

@GetMapping("deleteUser")
public String deleteUserPage() {
    return "myInfo/deleteUser";
}

먼저 탈퇴 페이지를 보여주는 Controller는 간단하게 만들어주었다. 따로 처리해 줄 필요가 없다.

 

<form th:action="@{/myInfo/deleteUser}" method="post">

    <button type="submit" class="btn btn-danger">회원 탈퇴</button>
    <hr class="my-4" />

</form>

경고나 재확인 등을 처리하지 않고 바로 페이지에 경고 문구와 함께 클릭 시 바로 탈퇴 처리가 되도록 설정해주었다.

 

때문에 View에서 뭔가 받아 올 필요는 없고 버튼을 눌렀을 때 바로 회원탈퇴 로직을 타도록 해주었다.

 

@Override
public boolean deleteUser(UserEntity userEntity) throws Exception {

    iUserRepository.delete(userEntity);
    boolean res = true;

    return res;
}

JpaRepositroy에서 CRUD 정도는 쉽게 구현할 수 있도록 도와준다고 했는데 진짜 간단하게 위 처럼 delete로 유저 정보만 날려주면 알아서 삭제시켜주었다.

 

true, false로 값을 체크해 오려고 했는데 리턴 값을 boolean으로 받는 법은 아직 탐구하지 못 했고 일단 로직을 거치면 무조건 true를 반환하게 만들어주었다.

 

@PostMapping("deleteUser")
public String deleteUser(HttpServletRequest request, HttpSession session) throws Exception {

    UserEntity userEntity = (UserEntity) session.getAttribute("userDTO");

    boolean res = iInfoService.deleteUser(userEntity);

    if (res == true) {

        session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }

        return "redirect:/user/logIn";
    } else {
        return "myInfo/deleteUser";
    }
}

세션 값을 userEntity에 담아주고 위에 로직을 타도록 보내고 리턴 받아온 true 값에 대해 세션 또한 삭제시켰다. 몇 가지 테스트를 해 본 결과 세션을 삭제시키지 않고 회원 탈퇴를 진행했을 때 세션 값을 찍어보면 세션 정보가 그대로 있는 것이 확인되었다. 때문에 회원 탈퇴에 성공했을 때 세션 값을 비워주고 로그인 페이지로 redirect를 해주었다. 

 

마찬가지로 이때 redirect가 없다면 에러 페이지가 나오니 redirect를 해주어야 한다. 아직 왜 그런지 차이에 대해선 마찬가지로 탐구해 보지는 못 했다.

 

@GetMapping("/session-info")
public String sessionInfo(HttpServletRequest request) {
    HttpSession session = request.getSession(false);

    if (session == null) {
        return "세션이 없습니다.";
    }

    session.getAttributeNames().asIterator()
            .forEachRemaining(name -> log.info("session name = {}, value = {}", name, session.getAttribute(name)));

    log.info("sessionId = {}", session.getId());
    log.info("getMaxInactiveInterval = {}", session.getMaxInactiveInterval());
    log.info("creationTime = {}", new Date(session.getCreationTime()));
    log.info("lastAccessedTime = {}", new Date(session.getLastAccessedTime()));
    log.info("isNew = {}", session.isNew());

    return "세션 출력";
}

세션 값을 확인하는 Controller이다. 따로 만들어줘서 로그를 확인했다. 

반응형

댓글