티스토리 뷰
회원 데이터 관리 시스템 개선: soft delete 패턴 도입기
안녕하세요! 오늘은 SNS 어시스턴트 서비스의 회원 데이터 관리 시스템을 개선한 경험을 공유하려고 합니다. 특히 회원 탈퇴 처리 방식을 하드 삭제(hard delete)에서 소프트 삭제(soft delete)로 전환한 과정과 그 이유에 대해 설명드리겠습니다.
전에는 하드삭제와 소프트삭제가 어떻게 사용될 수 있는지 잘 몰랐는데 이번 기회에 활용하는 방법을 알게 되어 좋았습니다.
기존 시스템의 문제점
기존에 저희 서비스는 회원 탈퇴 요청 시 데이터베이스에서 해당 사용자의 모든 데이터를 완전히 삭제하는 방식을 사용했습니다. 이 방식은 간단하고 직관적이었지만, 다음과 같은 문제점들이 발견되었습니다:
- 프리미엄 이용권 남용: 탈퇴 후 재가입 시 다시 하루 무료 프리미엄 이용권이 부여되어, 일부 사용자들이 이를 반복적으로 악용하는 사례가 발생했습니다.
- 데이터 분석의 한계: 완전 삭제 방식은 탈퇴한 회원에 대한 통계 데이터를 수집하기 어렵게 만들었습니다. 특히 '얼마나 많은 회원이 탈퇴했는지', '탈퇴한 회원들의 특성은 무엇인지' 등의 중요한 인사이트를 얻기 어려웠습니다.
- 사용자 경험 저하: 실수로 탈퇴한 사용자가 다시 가입하려 할 때, 이전의 모든 데이터와 설정이 사라져 있어 불편함을 초래했습니다.
soft delete 패턴 도입
이러한 문제들을 해결하기 위해, 저희는 deletedAt 필드를 활용한 soft delete 패턴을 도입했습니다. 회원이 탈퇴할 때 실제로 데이터를 삭제하는 대신, 해당 시점에 deletedAt 타임스탬프를 기록하는 방식입니다.
@Column({ type: 'timestamp', nullable: true })
@Field(() => Date, { nullable: true })
deletedAt: Date; // 유저가 탈퇴한 날짜 기록
이 필드가 null이 아닌 경우 해당 계정은 탈퇴 처리된 것으로 간주합니다.
회원 탈퇴 로직 변경
기존의 deleteAccount 메서드는 사용자 데이터를 데이터베이스에서 완전히 삭제했지만, 새로운 구현에서는 deletedAt 필드만 업데이트합니다:
// 변경 전: 사용자 데이터 완전 삭제
await this.users.delete(userId);
// 변경 후: deletedAt 필드 설정
user.deletedAt = new Date();
await this.users.save(user);
회원 가입 로직 개선
회원 가입 로직에서도 중요한 변화가 있었습니다. 기존에 탈퇴했던 사용자가 재가입할 경우 deletedAt 필드를 확인하여 프리미엄 이용권 남용을 방지합니다:
if (existUser) {
if (existUser.deletedAt) {
existUser.password = password;
existUser.deletedAt = null; // deletedAt 필드 초기화
await this.users.save(existUser); // 데이터베이스에 변경사항 저장
}
const result = await this.login(
{ email, password, rememberMe: true },
res,
cookieDomain,
);
return result;
}
이렇게 변경함으로써, 탈퇴했던 사용자가 재가입할 때 기존 계정이 복구되고 새로운 프리미엄 이용권은 부여되지 않습니다.
이점과 결과
이러한 변경으로 인해 다음과 같은 이점을 얻었습니다:
- 데이터 분석 강화: 탈퇴한 사용자의 데이터를 보존함으로써, 사용자 이탈 원인 분석 및 서비스 개선에 필요한 인사이트를 얻을 수 있게 되었습니다.
- 프리미엄 이용권 남용 방지: 탈퇴 후 재가입을 통한 무료 프리미엄 이용권 반복 획득을 효과적으로 차단했습니다.
- 사용자 경험 개선: 실수로 탈퇴한 사용자도 기존 데이터를 유지한 채 복구할 수 있게 되었습니다.
- 관리 효율성 증대: 사용자 관리가 더 체계적이고 투명해져, 고객 서비스 대응도 향상되었습니다.
결론
soft delete 패턴 도입은 단순한 기술적 변경 이상의 가치를 가져왔습니다. 사용자 데이터 관리 전략을 개선함으로써 비즈니스 요구사항을 더 효과적으로 충족시키고, 사용자 경험도 향상시킬 수 있었습니다.
이러한 패턴은 데이터 무결성을 유지하면서도 유연한 사용자 관리가 필요한 많은 웹 서비스에 유용하게 적용될 수 있을 것입니다.
- Total
- Today
- Yesterday
- 원티드
- 북클럽
- NextApiRequest
- 초보
- error
- createPortal
- 프리온보딩
- 아차산
- Storybook
- 스토리 북
- nextjs
- NextRequest
- CLASS
- 우아한테크코스
- 노마드코더
- electron
- import/order
- jest
- 노개북
- env
- TopLayer
- WSL2
- javascript
- 프론트앤드
- C언어
- 윤성우 열혈C프로그래밍
- React
- 위코드
- nodejs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |