Skip to content

Commit baecebd

Browse files
committed
fix[member]: 회원 탈퇴 시 연관 데이터 삭제 로직 추가
1 parent a863c2a commit baecebd

File tree

4 files changed

+51
-4
lines changed

4 files changed

+51
-4
lines changed

backend/src/main/java/com/ai/lawyer/domain/member/entity/Member.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package com.ai.lawyer.domain.member.entity;
22

3+
import com.ai.lawyer.domain.post.entity.Post;
4+
import com.ai.lawyer.domain.poll.entity.PollVote;
5+
import com.ai.lawyer.domain.chatbot.entity.History;
36
import jakarta.persistence.*;
47
import jakarta.validation.constraints.*;
58
import lombok.*;
69
import org.hibernate.annotations.CreationTimestamp;
710
import org.hibernate.annotations.UpdateTimestamp;
811

912
import java.time.LocalDateTime;
13+
import java.util.ArrayList;
14+
import java.util.List;
1015

1116
@Entity
1217
@Table(name = "member",
@@ -63,6 +68,19 @@ public class Member implements MemberAdapter {
6368
@Column(name = "updated_at")
6469
private LocalDateTime updatedAt;
6570

71+
// 연관 관계: 회원 탈퇴 시 cascade 삭제
72+
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
73+
@Builder.Default
74+
private List<Post> posts = new ArrayList<>();
75+
76+
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
77+
@Builder.Default
78+
private List<PollVote> pollVotes = new ArrayList<>();
79+
80+
@OneToMany(mappedBy = "memberId", cascade = CascadeType.ALL, orphanRemoval = true)
81+
@Builder.Default
82+
private List<History> histories = new ArrayList<>();
83+
6684
@Getter
6785
public enum Gender {
6886
MALE("남성"), FEMALE("여성"), OTHER("기타");

backend/src/main/java/com/ai/lawyer/domain/member/entity/OAuth2Member.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package com.ai.lawyer.domain.member.entity;
22

3+
import com.ai.lawyer.domain.post.entity.Post;
4+
import com.ai.lawyer.domain.poll.entity.PollVote;
5+
import com.ai.lawyer.domain.chatbot.entity.History;
36
import jakarta.persistence.*;
47
import jakarta.validation.constraints.*;
58
import lombok.*;
69
import org.hibernate.annotations.CreationTimestamp;
710
import org.hibernate.annotations.UpdateTimestamp;
811

912
import java.time.LocalDateTime;
13+
import java.util.ArrayList;
14+
import java.util.List;
1015

1116
@Entity
1217
@Table(name = "oauth2_member",
@@ -74,6 +79,19 @@ public class OAuth2Member implements MemberAdapter {
7479
@Column(name = "updated_at")
7580
private LocalDateTime updatedAt;
7681

82+
// 연관 관계: 회원 탈퇴 시 cascade 삭제
83+
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
84+
@Builder.Default
85+
private List<Post> posts = new ArrayList<>();
86+
87+
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
88+
@Builder.Default
89+
private List<PollVote> pollVotes = new ArrayList<>();
90+
91+
@OneToMany(mappedBy = "memberId", cascade = CascadeType.ALL, orphanRemoval = true)
92+
@Builder.Default
93+
private List<History> histories = new ArrayList<>();
94+
7795
@Getter
7896
public enum Provider {
7997
KAKAO("카카오"), NAVER("네이버");

backend/src/main/java/com/ai/lawyer/domain/member/service/MemberService.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,19 +186,29 @@ public String getLoginIdByMemberId(Long memberId) {
186186

187187
@Transactional
188188
public void deleteMember(String loginId) {
189-
// Member 또는 OAuth2Member 삭제
189+
log.info("회원 탈퇴 시작: loginId={}", loginId);
190+
191+
// 1. Redis 토큰 삭제
192+
try {
193+
tokenProvider.deleteAllTokens(loginId);
194+
log.info("Redis 토큰 삭제 완료: loginId={}", loginId);
195+
} catch (Exception e) {
196+
log.error("Redis 토큰 삭제 실패: loginId={}, error={}", loginId, e.getMessage());
197+
}
198+
199+
// 2. Member 또는 OAuth2Member 삭제 (cascade로 연관 데이터 자동 삭제)
190200
java.util.Optional<Member> regularMember = memberRepository.findByLoginId(loginId);
191201
if (regularMember.isPresent()) {
192202
memberRepository.delete(regularMember.get());
193-
log.info("일반 회원 삭제 완료: loginId={}", loginId);
203+
log.info("일반 회원 삭제 완료 (연관 데이터 cascade 삭제): loginId={}", loginId);
194204
return;
195205
}
196206

197207
if (oauth2MemberRepository != null) {
198208
java.util.Optional<OAuth2Member> oauth2Member = oauth2MemberRepository.findByLoginId(loginId);
199209
if (oauth2Member.isPresent()) {
200210
oauth2MemberRepository.delete(oauth2Member.get());
201-
log.info("OAuth2 회원 삭제 완료: loginId={}", loginId);
211+
log.info("OAuth2 회원 삭제 완료 (연관 데이터 cascade 삭제): loginId={}", loginId);
202212
return;
203213
}
204214
}

backend/src/test/java/com/ai/lawyer/domain/member/service/MemberServiceTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,8 +300,9 @@ void withdraw_Success() {
300300
memberService.deleteMember(loginId);
301301

302302
// then
303+
verify(tokenProvider).deleteAllTokens(loginId); // Redis 토큰 삭제
303304
verify(memberRepository).findByLoginId(loginId);
304-
verify(memberRepository).delete(member);
305+
verify(memberRepository).delete(member); // 회원 삭제 (cascade로 연관 데이터 자동 삭제)
305306
}
306307

307308
@Test

0 commit comments

Comments
 (0)