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) {