회원탈퇴를 어떤방식으로 처리하면 좋을까? (뉴스피드 프로젝트)

김상엽·2024년 2월 8일
0

Project

목록 보기
7/9
post-thumbnail

고민

회원탈퇴를 구현하려고 하는데 어떻게 구현하는게 좋을까?

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() + "삭제되었습니다.";
    }
    1. 회원탈퇴할 사용자의 모든 게시글댓글을 DB에서 스캔하여 가져옴
    1. 게시글댓글의 소유자(작성자)를 회원탈퇴할 사용자 -> "알수없음"사용자로 이전
    1. 회원탈퇴할 사용자를 DB에서 삭제

소유권 이전 로직의 문제점

위 로직을 구현하면서 서버가 처음으로 구동될때 "알수없음"사용자를 자동으로 DB에 저장하는 기능을 추가하는 과정이 잘 되지 않아서 현업 백엔드 개발자 친구에게 조언을 구하였는데 자동으로 저장하는 기능 외에도 다른 문제점들이 존재하였다.

1. 회원탈퇴를 진행할때 DB에 저장된 모든 게시글과 댓글을 스캔하여야한다는 문제점

커뮤니티는 게시글과 댓글의 양이 굉장히 많다.
회원탈퇴를 진행할때마다 모든 게시글과 댓글을 스캔한다면 DB는 매번 천문학적인 개수의 게시글과 댓글을 스캔하여야한다. 이는 서버에 엄청난 부하를 주게 된다.

2. 탈퇴한 회원의 게시글 복구 불가

대부분의 커뮤니티의 경우 탈퇴한 유저가 탈퇴한 게시글의 복구를 요청하는 경우 게시글을 복구해준다.
하지만 소유권을 이전하고 사용자를 삭제하는 위 로직의 경우, 탈퇴한 유저에 대한 정보가 삭제되기 때문에 게시글을 복구해줄 수 없고, 더 나아가 탈퇴한 유저의 계정또한 복구할 수 없다.

개선한 로직 (상태값)

이와 같은 문제를 해결하고자 유저의 상태(status) 값을 추가하여 성능적인 측면과 기능적인 측면으로도 개선할 수 있었다.

코드를 입력하세요
    1. 회원탈퇴할 사용자의 상태값을 Leave로 변경한다.
    1. 게시글, 댓글을 조회할때 작성자의 상태값이 Leave라면 작성자의 정보를 알수없음으로 출력한다.

상태(status)값을 이용한 로직의 장점

상태(status)값을 이용하여 회원탈퇴를 진행하는 로직으로 변경하면서 성능적인 측면과 기능적인 측면에서 다음과 같은 개선사항을 얻을 수 있었다.

1. 성능적인 개선(DB부하 감소)

회원탈퇴를 진행하는 과정에서 해당 회원의 상태(status)값만 변경해주면 되기 때문에 DB부하가 굉장히 개선되었다.

2. 기능적인 개선(복구기능)


대부분의 서비스의 경우 회원탈퇴를 진행하고, 어느정도 유예기간동안 탈퇴를 철회할 수 있다.
상태(status)값을 이용하면 해당 유저의 정보가 DB에 남아있기 때문에사용자의 요청에 따라 계정, 게시글, 댓글 모두 복구가 가능하다.

3. 기능적인 개선(비활성화)


대부분의 SNS의 경우 비활성화 기능을 제공한다. 상태(status)값을 Disabled로 지정하여 사용자 계정의 비활성화에 대한 새로운 기능을 추가할 수 있었다.

오늘의 회고

설계하는 과정에서 이렇게 유의미한 차이가 발생한 경험이 처음이었다.
설계를 하는 과정에서 확장성, 성능적 측면을 고려하며 고민을 많이 해야겠다. :)

profile
개발하는 기록자

0개의 댓글