-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feat : 회원탈퇴 API 구현 #18
The head ref may contain hidden characters: "LINKODE-5-BE-\uD68C\uC6D0\uD0C8\uD1F4"
Conversation
기존에는 키값이 저장됬는데 |
앜ㅋㅋ 저희가 엑세스토큰이랑 리프레시 토큰 2개를 발급하잖아요 리프레시 토큰이 훨씬 유효기간이 기니까 만료된 엑세스토큰의 재발급을 위해 리프레시토큰을 키값으로 저장했는데(근데..아직 재발급 하는 부분은 구현되지 않았..습니다.. 이것두 추후에 다시 해볼게요 당장 급한건아니라..) 헤더로 들어오는건 엑세스토큰이란 말이죠 그러면 그 토큰으로 레디스를 찾아봐야 일치하는게 당연히 없으니까 엑세스토큰받음->깃허브아이디뽑음->레디스의 리프레시 토큰에서 for 문같은거 돌면서 일일히 깃허브 아이디 추출함->엑세스토큰의 아이디랑 일치하는지 확인 이 과정을 거쳐야하는거같더라구요. 근데 깃허브 아이디를 키값으로 저장해두면 엑세스토큰에서 추출한 깃허브 아이디로 바로 찾으면 되니까 비교하는 과정이 줄어드는 것 같아서 수정하게되었습니다! |
오! 답변감사합니다! |
요약 (Summary)
🔑 변경 사항 (Key Changes)
JwtAuthenticationFilter 수정
: 해당 코드에 api 요청이 들어왔을 때, 토큰이 레디스에 있는지 확인하는 부분이 누락되어 있어, 추가하였습니다. 구현된 코드에서 토큰을 발급할 때에 subject 로 githubId 를 사용하고 claim 으로 memberId 를 사용합니다. 따라서 두가지 값을 모두 추출할 수 있고, 저는 레디스에 String 값인 githubId 를 키값으로 리프레시토큰을 value 로 저장하기 때문에 githubId 를 추출하여 레디스에서 찾는 쪽으로 구현하였습니다. 만약에 레디스에서 사용자를 찾을 수 없다면 403 forbidden 으로 막히게 됩니다.TokenService 수정
: 이전 코드에서는 token 으로 레디스에서 삭제하는 코드들이었는데, 위에서 말했듯이 레디스에 키 : gitbhuId, 값 : refreshToken 이렇게 저장하기 때문에 키값으로 찾으려면 파라미터 값이 token -> githubId 로 변경되어야했습니다. 따라서 파라미터로 받는 값을 수정하였습니다. 즉, 깃허브 아이디로 레디스를 찾는다고 보면 됩니다.JwtProvider 메소드 추가
: JwtProvider 에 엑세스토큰에서 githubId 를 추출하는 메소드 추가하였습니다.MemberController.deleteMember 작성
: 컨트롤러에 회원 탈퇴를 처리하는 컨트롤러 작성하였습니다.Member, Studyroom, MemberStudyroom 도메인 수정
: 도메인 코드에 updateStatus 메소드 추가하였습니다. status 를 DELETE 로 변경하기 위해 추가하였습니다.BaseTime 수정
: 구현 중 modified_at 필드가 업데이트 되지 않는 오류 발견해서 확인하던 중에 어노테이션이 @ModifiedBy 로 잘못들어가 있는 것을 확인해서 @ModifiedDate 로 수정하였습니다.MemberService.deleteMember 작성
: 회원탈퇴를 위한 서비스 코드입니다. memberStudyroomService 에 member_studyroom 에 관련된 데이터들의 delete 처리를 넘겼습니다. member 테이블에서 해당 사용자의 status 를 DELETE 로 업데이트하였고, tokenService.invalidateToken 를 사용하여 레디스에서 지우는 작업도 수행하였습니다. 아직 자료실이 구현되지 않아 탈퇴하는 회원의 자료 처리가 안되어있습니다. 추후에 추가로 수정하도록 하겠습니다.MemberStudyroomService.deleteMember 작성
: 회원탈퇴를 하는 회원의 역할(CAPTAIN/CREW) 에 따라 다르게 처리하도록 구현하였습니다. 만약 CAPTAIN 이라면 해당 스터디룸 또한 DELETE 처리하고, 스터디룸에 속한 다른 사용자의 데이터도 DELETE 처리하였습니다. (스터디룸이 사라져버렸으니, 빈 스터디룸에는 사용자가 ACTIVE 한 상태일 수 없습니다.) 만약 CREW 라면 단순히 사용자만 DELETE 처리하였습니다.exception 추가
: 적절한 예외처리를 위해 exception 추가하였습니다.📝 리뷰 요구사항 (To Reviewers)
keys *
로 확인가능 -> 혹시 키값으로 확인하는 방법은 까먹으셨다면 이전 pr 에서 맥에 레디스 까는 법에 대한 링크를 참고해주세요!)확인 방법
❗️application-local.yml 파일의 데이터베이스 설정을 로컬에 맞췄는지 확인해주세요.
먼저 코드를 실행시키고 레디스도 실행시켜주세요.
redis-cli
를 입력하고keys *
를 입력했을 때 (empty array) 라면 바로 아래의 쿼리문을 실행시키고, 만약 데이터가 존재한다면FLUSHDB
을 입력하여 초기화해 주세요.이 쿼리문을 실행시켜주세요.
그 다음 로그인을 진행해주세요.
레디스에서 다시
keys *
를 입력하고 깃허브 id 로 키값이 들어간 것을 확인해주세요.그 다음 PATCH 메소드로 아래의 요청을 보내주세요. 헤더에는 로그인에서 받은 "엑세스" 토큰을 넣어서 보내주세요.
로그인 후 레디스에 저장된 모습입니다.
요청에 성공하면 데이터베이스로 들어가서 값들이 잘 처리되었는지 확인해주세요.
저는 회원탈퇴한 사용자의 토큰을 스터디룸 수정 api 에 넣어보았는데 403 이 뜬 것을 확인할 수 있습니다.
리뷰하실 때에는 delete 처리되는 값이 전부 저랑 반대여야 성공입니다.