Bootlind("블라인드"앱에서 착안했다)라는 부트캠프를 진행하고 있는 사람들을 위한 익명 커뮤니티 프로젝트를 진행하던중, 회원탈퇴를 구현하는중에 의문이 생겼다.
- 기존의 블라인드, 에브리타임 등의 뉴스피드 서비스는 사용자가 회원탈퇴를 해도 사용자가 탈퇴하기전에 작성한
게시글
,댓글
이 남아있지만 작성자의 정보가알수없음
으로 표기된다.- Bootlind 프로젝트에서도 탈퇴한 사용자의 게시글과 댓글을 보존하고 작성자의 정보를
알수없음
으로 변경되게 구현하고자 하였다.
public String deleteUser(User user) { User target = userRepository.findByUsername(user.getUsername()).orElseThrow( () -> new IllegalArgumentException("해당 사용자가 존재하지 않습니다") ); //회원탈퇴할 사용자 User blank = userRepository.findById(1L).orElseThrow( () -> new IllegalArgumentException("알수없음 이 존재하지 않습니다") ); //초기에 DB에 생성해놓은 "알수없음"의 이름을 가진 사용자 객체 List<Comment> commentList = commentRepository.findAllByUser(target); for(Comment comment : commentList) comment.updateUser(blank); List<Post> postList = postRepository.findAllByUser(target); for(Post post : postList) post.updateUser(blank); userRepository.deleteById(target.getId()); return target.getUsername() + "삭제되었습니다."; }
- 회원탈퇴할 사용자의 모든
게시글
과댓글
을 DB에서 스캔하여 가져옴
게시글
과댓글
의 소유자(작성자)를 회원탈퇴할 사용자 -> "알수없음"사용자로 이전
- 회원탈퇴할 사용자를 DB에서 삭제
위 로직을 구현하면서 서버가 처음으로 구동될때 "알수없음"사용자를 자동으로 DB에 저장하는 기능을 추가하는 과정이 잘 되지 않아서 현업 백엔드 개발자 친구에게 조언을 구하였는데 자동으로 저장하는 기능 외에도 다른 문제점들이 존재하였다.
커뮤니티는 게시글과 댓글의 양이 굉장히 많다.
회원탈퇴를 진행할때마다 모든 게시글과 댓글을 스캔한다면 DB는 매번 천문학적인 개수의 게시글과 댓글을 스캔하여야한다. 이는 서버에 엄청난 부하를 주게 된다.
대부분의 커뮤니티의 경우 탈퇴한 유저가 탈퇴한 게시글의 복구를 요청하는 경우 게시글을 복구해준다.
하지만 소유권을 이전하고 사용자를 삭제하는 위 로직의 경우, 탈퇴한 유저에 대한 정보가 삭제되기 때문에 게시글을 복구해줄 수 없고, 더 나아가 탈퇴한 유저의 계정또한 복구할 수 없다.
이와 같은 문제를 해결하고자 유저의
상태(status)
값을 추가하여 성능적인 측면과 기능적인 측면으로도 개선할 수 있었다.코드를 입력하세요
- 회원탈퇴할 사용자의 상태값을
Leave
로 변경한다.
- 게시글, 댓글을 조회할때 작성자의 상태값이
Leave
라면 작성자의 정보를알수없음
으로 출력한다.
상태(status)
값을 이용하여 회원탈퇴를 진행하는 로직으로 변경하면서 성능적인 측면과 기능적인 측면에서 다음과 같은 개선사항을 얻을 수 있었다.
회원탈퇴를 진행하는 과정에서 해당 회원의
상태(status)
값만 변경해주면 되기 때문에 DB부하가 굉장히 개선되었다.
대부분의 서비스의 경우 회원탈퇴를 진행하고, 어느정도 유예기간동안 탈퇴를 철회할 수 있다.
상태(status)
값을 이용하면 해당 유저의 정보가 DB에 남아있기 때문에사용자의 요청에 따라계정
,게시글
,댓글
모두 복구가 가능하다.
대부분의 SNS의 경우 비활성화 기능을 제공한다.상태(status)
값을Disabled
로 지정하여 사용자 계정의 비활성화에 대한 새로운 기능을 추가할 수 있었다.
설계하는 과정에서 이렇게 유의미한 차이가 발생한 경험이 처음이었다.
설계를 하는 과정에서 확장성, 성능적 측면을 고려하며 고민을 많이 해야겠다. :)