기능 중 회원에 관한 기능을 이번 휴일 내로 다 구현하기로 해서 천천히 만들고 있다.
이번에는 회원 탈퇴를 구현해야 하는데 일단, 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이다. 따로 만들어줘서 로그를 확인했다.
'Project > 소경관' 카테고리의 다른 글
[소경관] : 완료 항목 보기 리팩토링하기 (0) | 2022.06.05 |
---|---|
[소경관] : 로그인 로직 오류 수정 (0) | 2022.06.04 |
[소경관] : thymeleaf input에 Session값 가져오기와 input에 Session값을 입력 받아 Controller에 넘기기 (0) | 2022.06.03 |
[소경관] : 회원가입과 로그인 로직 수정하기 (0) | 2022.06.02 |
[소경관] : 등록한 차량 초기화 (0) | 2022.05.31 |
댓글