Files
sodalive-backend-spring-boot/src/main/kotlin/kr/co/vividnext/sodalive/chat/character
Klaus 4904625488 feat(original): 원작 도메인 추가, 관리자 CRUD/연결 API, 소프트 삭제, 서비스 계층 정비
- 원작 엔티티/레포지토리/관리자 API 구축(이미지 S3 업로드 포함)
- 캐릭터-원작 연관관계 및 관리자에서 배정/해제 API 제공
- 소프트 삭제(`isDeleted`) 도입 및 조회/수정/배정 로직에서 삭제 항목 필터링
- 컨트롤러-레포지토리 직접 접근 제거, `AdminOriginalWorkService`로 DB 접근 캡슐화
- 캐릭터 등록/수정에서 `originalWorkId` 지원 및 외부 API 업데이트 조건 분리
2025-09-14 22:33:30 +09:00
..

ChatCharacter 엔티티 관계 구현

개요

이 구현은 ChatCharacter와 다른 엔티티들 간의 1:N 관계를 설정합니다. ChatCharacter가 저장될 때 관련 엔티티들도 함께 저장되며, Tag, Value, Hobby, Goal은 중복을 허용하지 않고 기존 내용과 동일한 내용이 들어오면 관계만 맺습니다.

엔티티 구조

주요 엔티티

  • ChatCharacter: 메인 엔티티로, 캐릭터의 기본 정보를 저장합니다.
  • ChatCharacterMemory: 캐릭터의 기억 정보를 저장합니다.
  • ChatCharacterPersonality: 캐릭터의 성격 특성을 저장합니다.
  • ChatCharacterBackground: 캐릭터의 배경 정보를 저장합니다.
  • ChatCharacterRelationship: 캐릭터의 관계 정보를 저장합니다.

중복 방지를 위한 엔티티

  • ChatCharacterTag: 캐릭터 태그 정보를 저장합니다. 태그 이름은 유일합니다.
  • ChatCharacterValue: 캐릭터 가치관 정보를 저장합니다. 가치관 이름은 유일합니다.
  • ChatCharacterHobby: 캐릭터 취미 정보를 저장합니다. 취미 이름은 유일합니다.
  • ChatCharacterGoal: 캐릭터 목표 정보를 저장합니다. 목표 이름은 유일합니다.

매핑 엔티티

  • ChatCharacterTagMapping: ChatCharacter와 ChatCharacterTag 간의 관계를 맺습니다.
  • ChatCharacterValueMapping: ChatCharacter와 ChatCharacterValue 간의 관계를 맺습니다.
  • ChatCharacterHobbyMapping: ChatCharacter와 ChatCharacterHobby 간의 관계를 맺습니다.
  • ChatCharacterGoalMapping: ChatCharacter와 ChatCharacterGoal 간의 관계를 맺습니다.

관계 설정

  • ChatCharacter와 Memory, Personality, Background, Relationship은 1:N 관계입니다.
  • ChatCharacter와 Tag, Value, Hobby, Goal은 매핑 엔티티를 통한 N:M 관계입니다.
  • 모든 관계는 ChatCharacter가 저장될 때 함께 저장됩니다(CascadeType.ALL).

서비스 기능

ChatCharacterService는 다음과 같은 기능을 제공합니다:

  1. 캐릭터 생성 및 저장
  2. 캐릭터 조회 (UUID, 이름, 전체 목록)
  3. 캐릭터에 태그, 가치관, 취미, 목표 추가
  4. 캐릭터에 기억, 성격 특성, 배경 정보, 관계 추가
  5. 모든 정보를 포함한 캐릭터 생성

사용 예시

// 캐릭터 생성
val chatCharacter = chatCharacterService.createChatCharacter(
    characterUUID = "uuid-123",
    name = "AI 어시스턴트",
    description = "친절한 AI 어시스턴트",
    systemPrompt = "당신은 친절한 AI 어시스턴트입니다."
)

// 태그 추가
chatCharacterService.addTagToCharacter(chatCharacter, "친절함")
chatCharacterService.addTagToCharacter(chatCharacter, "도움")

// 가치관 추가
chatCharacterService.addValueToCharacter(chatCharacter, "정직")

// 취미 추가
chatCharacterService.addHobbyToCharacter(chatCharacter, "독서")

// 목표 추가
chatCharacterService.addGoalToCharacter(chatCharacter, "사용자 만족")

// 기억 추가
chatCharacterService.addMemoryToChatCharacter(
    chatCharacter,
    "첫 만남",
    "사용자와의 첫 대화",
    "기쁨"
)

// 성격 특성 추가
chatCharacterService.addPersonalityToChatCharacter(
    chatCharacter,
    "친절함",
    "항상 친절하게 대응합니다."
)

// 배경 정보 추가
chatCharacterService.addBackgroundToChatCharacter(
    chatCharacter,
    "생성 배경",
    "사용자를 돕기 위해 만들어졌습니다."
)

// 관계 추가
chatCharacterService.addRelationshipToChatCharacter(
    chatCharacter,
    "사용자와의 관계: 도우미"
)

// 모든 정보를 포함한 캐릭터 생성
val completeCharacter = chatCharacterService.createChatCharacterWithDetails(
    characterUUID = "uuid-456",
    name = "종합 AI",
    description = "모든 정보를 가진 AI",
    systemPrompt = "당신은 모든 정보를 가진 AI입니다.",
    tags = listOf("종합", "지식"),
    values = listOf("정확성", "유용성"),
    hobbies = listOf("학습", "정보 수집"),
    goals = listOf("정확한 정보 제공"),
    memories = listOf(Triple("학습 시작", "처음 학습을 시작했습니다.", "호기심")),
    personalities = listOf(Pair("분석적", "정보를 분석적으로 처리합니다.")),
    backgrounds = listOf(Pair("개발 목적", "정보 제공을 위해 개발되었습니다.")),
    relationships = listOf("사용자와의 관계: 정보 제공자")
)

중복 방지 메커니즘

Tag, Value, Hobby, Goal 엔티티는 각각 고유한 필드(tag, value, hobby, goal)에 대해 유니크 제약 조건을 가지고 있습니다. 서비스 레이어에서는 이미 존재하는 엔티티를 찾아 재사용하거나, 존재하지 않는 경우 새로 생성합니다. 이를 통해 중복을 방지하고 관계만 맺을 수 있습니다.