Skip to content

Commit 483bdb6

Browse files
committed
fix[member]: 챗봇 답변 내용에 대한 항목에 cascade 로직 추가 및 연관 데이터 삭제 로직 순서 변경
1 parent 8f081dc commit 483bdb6

File tree

5 files changed

+67
-30
lines changed

5 files changed

+67
-30
lines changed

backend/src/main/java/com/ai/lawyer/domain/chatbot/entity/Chat.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ public class Chat {
3333
@Lob
3434
private String message;
3535

36-
@OneToMany(mappedBy = "chatId")
36+
@OneToMany(mappedBy = "chatId", cascade = CascadeType.ALL, orphanRemoval = true)
3737
private List<ChatPrecedent> chatPrecedents;
3838

39-
@OneToMany(mappedBy = "chatId")
39+
@OneToMany(mappedBy = "chatId", cascade = CascadeType.ALL, orphanRemoval = true)
4040
private List<ChatLaw> chatLaws;
4141

4242
@CreationTimestamp

backend/src/main/java/com/ai/lawyer/domain/chatbot/repository/ChatLawRepository.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,18 @@
22

33
import com.ai.lawyer.domain.chatbot.entity.ChatLaw;
44
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.jpa.repository.Modifying;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
58
import org.springframework.stereotype.Repository;
69

710
@Repository
811
public interface ChatLawRepository extends JpaRepository<ChatLaw, Long> {
12+
13+
/**
14+
* member_id에 해당하는 모든 ChatLaw 삭제 (회원 탈퇴 시 사용)
15+
*/
16+
@Modifying
17+
@Query("DELETE FROM ChatLaw cl WHERE cl.chatId.historyId.memberId.memberId = :memberId")
18+
void deleteByMemberIdValue(@Param("memberId") Long memberId);
919
}

backend/src/main/java/com/ai/lawyer/domain/chatbot/repository/ChatPrecedentRepository.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
import com.ai.lawyer.domain.chatbot.entity.ChatPrecedent;
44
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.jpa.repository.Modifying;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
58

69
public interface ChatPrecedentRepository extends JpaRepository<ChatPrecedent, Long> {
10+
11+
/**
12+
* member_id에 해당하는 모든 ChatPrecedent 삭제 (회원 탈퇴 시 사용)
13+
*/
14+
@Modifying
15+
@Query("DELETE FROM ChatPrecedent cp WHERE cp.chatId.historyId.memberId.memberId = :memberId")
16+
void deleteByMemberIdValue(@Param("memberId") Long memberId);
717
}

backend/src/main/java/com/ai/lawyer/domain/chatbot/repository/ChatRepository.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,18 @@
22

33
import com.ai.lawyer.domain.chatbot.entity.Chat;
44
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.jpa.repository.Modifying;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
58
import org.springframework.stereotype.Repository;
69

710
@Repository
811
public interface ChatRepository extends JpaRepository<Chat, Long> {
12+
13+
/**
14+
* member_id에 해당하는 모든 Chat 삭제 (회원 탈퇴 시 사용)
15+
*/
16+
@Modifying
17+
@Query("DELETE FROM Chat c WHERE c.historyId.memberId.memberId = :memberId")
18+
void deleteByMemberIdValue(@Param("memberId") Long memberId);
919
}

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

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
import com.ai.lawyer.domain.post.repository.PostRepository;
99
import com.ai.lawyer.domain.poll.repository.PollVoteRepository;
1010
import com.ai.lawyer.domain.chatbot.repository.HistoryRepository;
11+
import com.ai.lawyer.domain.chatbot.repository.ChatRepository;
12+
import com.ai.lawyer.domain.chatbot.repository.ChatPrecedentRepository;
13+
import com.ai.lawyer.domain.chatbot.repository.ChatLawRepository;
1114
import com.ai.lawyer.global.jwt.TokenProvider;
1215
import com.ai.lawyer.global.jwt.CookieUtil;
1316
import com.ai.lawyer.global.email.service.EmailService;
@@ -33,6 +36,9 @@ public class MemberService {
3336
private final PostRepository postRepository;
3437
private final PollVoteRepository pollVoteRepository;
3538
private final HistoryRepository historyRepository;
39+
private final ChatRepository chatRepository;
40+
private final ChatPrecedentRepository chatPrecedentRepository;
41+
private final ChatLawRepository chatLawRepository;
3642

3743
public MemberService(
3844
MemberRepository memberRepository,
@@ -43,7 +49,10 @@ public MemberService(
4349
EmailAuthService emailAuthService,
4450
PostRepository postRepository,
4551
PollVoteRepository pollVoteRepository,
46-
HistoryRepository historyRepository) {
52+
HistoryRepository historyRepository,
53+
ChatRepository chatRepository,
54+
ChatPrecedentRepository chatPrecedentRepository,
55+
ChatLawRepository chatLawRepository) {
4756
this.memberRepository = memberRepository;
4857
this.passwordEncoder = passwordEncoder;
4958
this.tokenProvider = tokenProvider;
@@ -53,6 +62,9 @@ public MemberService(
5362
this.postRepository = postRepository;
5463
this.pollVoteRepository = pollVoteRepository;
5564
this.historyRepository = historyRepository;
65+
this.chatRepository = chatRepository;
66+
this.chatPrecedentRepository = chatPrecedentRepository;
67+
this.chatLawRepository = chatLawRepository;
5668
}
5769

5870
@org.springframework.beans.factory.annotation.Autowired(required = false)
@@ -225,37 +237,32 @@ public void deleteMember(String loginId) {
225237
// 2. 연관된 데이터 명시적 삭제 (순서 중요: FK 제약조건 고려)
226238
log.info("연관 데이터 삭제 시작: memberId={}", memberId);
227239

228-
// 2-1. 채팅 히스토리 삭제 (Chat 엔티티도 cascade로 함께 삭제됨)
229-
try {
230-
historyRepository.deleteByMemberIdValue(memberId);
231-
log.info("채팅 히스토리 삭제 완료: memberId={}", memberId);
232-
} catch (Exception e) {
233-
log.error("채팅 히스토리 삭제 실패: memberId={}, error={}", memberId, e.getMessage());
234-
}
240+
// 2-1. ChatPrecedent, ChatLaw 삭제 (Chat의 FK 참조)
241+
chatPrecedentRepository.deleteByMemberIdValue(memberId);
242+
log.info("채팅 판례 삭제 완료: memberId={}", memberId);
235243

236-
// 2-2. 투표 내역 삭제
237-
try {
238-
pollVoteRepository.deleteByMemberIdValue(memberId);
239-
log.info("투표 내역 삭제 완료: memberId={}", memberId);
240-
} catch (Exception e) {
241-
log.error("투표 내역 삭제 실패: memberId={}, error={}", memberId, e.getMessage());
242-
}
244+
chatLawRepository.deleteByMemberIdValue(memberId);
245+
log.info("채팅 법령 삭제 완료: memberId={}", memberId);
243246

244-
// 2-3. 게시글 삭제 (Poll 엔티티도 cascade로 함께 삭제됨)
245-
try {
246-
postRepository.deleteByMemberIdValue(memberId);
247-
log.info("게시글 삭제 완료: memberId={}", memberId);
248-
} catch (Exception e) {
249-
log.error("게시글 삭제 실패: memberId={}, error={}", memberId, e.getMessage());
250-
}
247+
// 2-2. Chat 삭제 (History의 FK 참조)
248+
chatRepository.deleteByMemberIdValue(memberId);
249+
log.info("채팅 삭제 완료: memberId={}", memberId);
250+
251+
// 2-3. History 삭제 (Member의 FK 참조)
252+
historyRepository.deleteByMemberIdValue(memberId);
253+
log.info("채팅 히스토리 삭제 완료: memberId={}", memberId);
254+
255+
// 2-4. 투표 내역 삭제
256+
pollVoteRepository.deleteByMemberIdValue(memberId);
257+
log.info("투표 내역 삭제 완료: memberId={}", memberId);
258+
259+
// 2-5. 게시글 삭제 (Poll 엔티티도 cascade로 함께 삭제됨)
260+
postRepository.deleteByMemberIdValue(memberId);
261+
log.info("게시글 삭제 완료: memberId={}", memberId);
251262

252263
// 3. Redis 토큰 삭제
253-
try {
254-
tokenProvider.deleteAllTokens(loginId);
255-
log.info("Redis 토큰 삭제 완료: loginId={}", loginId);
256-
} catch (Exception e) {
257-
log.error("Redis 토큰 삭제 실패: loginId={}, error={}", loginId, e.getMessage());
258-
}
264+
tokenProvider.deleteAllTokens(loginId);
265+
log.info("Redis 토큰 삭제 완료: loginId={}", loginId);
259266

260267
// 4. 회원 정보 삭제
261268
final Long finalMemberId = memberId;

0 commit comments

Comments
 (0)