From eed755fd11130dca510bf90a70bed3cc8d04ca65 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 12 Aug 2025 21:03:06 +0900 Subject: [PATCH] =?UTF-8?q?feat(admin-character):=20=EC=BA=90=EB=A6=AD?= =?UTF-8?q?=ED=84=B0=20=EC=88=98=EC=A0=95=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 태그 중복 매핑이 되지 않도록 수정 --- .../character/service/ChatCharacterService.kt | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/chat/character/service/ChatCharacterService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/chat/character/service/ChatCharacterService.kt index 7f9e20c..9f1b1cd 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/chat/character/service/ChatCharacterService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/chat/character/service/ChatCharacterService.kt @@ -123,6 +123,31 @@ class ChatCharacterService( tags.distinct().forEach { addTagToCharacter(chatCharacter, it) } } + /** + * 태그 매핑을 증분 업데이트(추가/삭제만)하여 불필요한 매핑 레코드 재생성을 방지 + */ + @Transactional + fun updateTagsForCharacter(chatCharacter: ChatCharacter, tags: List) { + val desired = tags.distinct() + // 현재 매핑된 태그 문자열 목록 + val current = chatCharacter.tagMappings.map { it.tag.tag } + + // 추가가 필요한 태그 + val toAdd = desired.filterNot { current.contains(it) } + toAdd.forEach { addTagToCharacter(chatCharacter, it) } + + // 제거가 필요한 태그 매핑 + if (chatCharacter.tagMappings.isNotEmpty()) { + val iterator = chatCharacter.tagMappings.iterator() + while (iterator.hasNext()) { + val mapping = iterator.next() + if (!desired.contains(mapping.tag.tag)) { + iterator.remove() // orphanRemoval=true 이므로 매핑 엔티티 삭제 처리 + } + } + } + } + /** * 여러 가치관을 한번에 캐릭터에 연결 */ @@ -412,8 +437,7 @@ class ChatCharacterService( // request에서 변경된 데이터만 업데이트 if (request.tags != null) { - chatCharacter.tagMappings.clear() - addTagsToCharacter(chatCharacter, request.tags) + updateTagsForCharacter(chatCharacter, request.tags) } if (request.values != null) {