캐릭터 챗봇 #338
Reference in New Issue
Block a user
No description provided.
Delete Branch "test"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
- GET /api/chat/room/{chatRoomId}/enter 엔드포인트 추가 - 참여 검증 후 roomId, character(아이디/이름/프로필/타입) 제공 - 최신 20개 메시지 조회(내림차순 조회 후 createdAt 오름차순으로 정렬) - hasMoreMessages 플래그 계산(가장 오래된 메시지 이전 존재 여부 판단)- 캐릭터 댓글 엔티티/레포지토리/서비스/컨트롤러 추가 - 댓글 작성 POST /api/chat/character/{characterId}/comments - 답글 작성 POST /api/chat/character/{characterId}/comments/{commentId}/replies - 댓글 목록 GET /api/chat/character/{characterId}/comments?limit=20 - 답글 목록 GET /api/chat/character/{characterId}/comments/{commentId}/replies?limit=20 - DTO 추가/확장 - CharacterCommentResponse, CharacterReplyResponse, CharacterCommentRepliesResponse, CreateCharacterCommentRequest - 캐릭터 상세 응답(CharacterDetailResponse) 확장 - latestComment(최신 댓글 1건) 추가 - totalComments(전체 활성 댓글 수) 추가 - 성능 최적화: getReplies에서 원본 댓글 replyCount 계산 시 DB 카운트 호출 제거 - toCommentResponse(replyCountOverride) 도입으로 원본 댓글 replyCount=0 고정 - 공통 검증: 로그인/본인인증/빈 내용 체크, 비활성 캐릭터/댓글 차단 WHY - 캐릭터 상세 화면에 댓글 경험 제공 및 전체 댓글 수 노출 요구사항 반영 - 답글 조회 시 불필요한 카운트 쿼리 제거로 DB 호출 최소화- 채팅 유료 메시지 구매 API 추가: POST /api/chat/room/{chatRoomId}/messages/{messageId}/purchase - ChatRoomService.purchaseMessage 구현: 참여/유효성/가격 검증, 이미지 메시지 보유 시 결제 생략, 결제 완료 시 ChatMessageItemDto 반환 - CanPaymentService.spendCanForChatMessage 추가: UseCan에 chatMessage(+이미지 메시지면 characterImage) 연동 저장 및 게이트웨이 별 정산 기록(setUseCanCalculate) - Character Image 결제 경로에 정산 기록 호출 누락분 보강 - ChatMessageItemDto 변환 헬퍼(toChatMessageItemDto) 추가 및 접근권한(hasAccess) 계산 일원화- /api/chat/character/image/my-list 엔드포인트 추가 - 로그인/본인인증 체크 - 캐릭터 프로필 이미지를 리스트 맨 앞에 포함 - 보유 이미지(무료 또는 구매 이력 존재)만 노출 - CloudFront 서명 URL 발급로 접근 제어 - 페이징 로직 개선 - 기존: 전체 조회 후 메모리에서 필터링/슬라이싱 - 변경: QueryDSL로 DB 레벨에서 보유 이미지만 오프셋/리밋 조회 - 프로필 아이템(인덱스 0) 포함을 고려하여 owned offset/limit 계산 - 빈 페이지 요청 시 즉시 빈 결과 반환 - Repository - CharacterImageQueryRepository + Impl 추가 - findOwnedActiveImagesByCharacterPaged(...) 구현 - 구매 이력: CHAT_MESSAGE_PURCHASE, CHARACTER_IMAGE_PURCHASE만 인정, 환불 제외 - 활성 이미지, sortOrder asc, id asc 정렬 + offset/limit - Service - getCharacterImagePath(characterId) 추가 - pageOwnedActiveByCharacterForMember(...) 추가 - Controller - my-list 응답 스키마는 list와 동일하게 totalCount/ownedCount/items 유지 - 페이지 사이즈 상한 20 적용, 5분 만료 서명 URL- /api/chat/room/{chatRoomId}/reset POST 엔드포인트 추가 - 초기화 절차: 30캔 결제 → 기존 방 나가기 → 동일 캐릭터로 새 방 생성 → 응답 반환 - 결제 시 CanUsage.CHAT_ROOM_RESET 신규 항목 사용(본인 귀속) - ChatQuotaService.resetFreeToDefault 추가 및 초기화 성공 시 무료 10회로 리셋(nextRechargeAt 초기화) - 사용내역 타이틀에 "캐릭터 톡 초기화" 노출(CanService) - ChatRoomResetRequest DTO(container 포함) 추가 - leaveChatRoom에 throwOnSessionEndFailure 옵션 추가(기본 false 유지) - endExternalSession에 throwOnFailure 옵션 추가: 최대 3회 재시도 후 실패 시 예외 전파 가능 - 채팅방 초기화 흐름에서는 외부 세션 종료 실패 시 예외를 던져 트랜잭션 롤백되도록 처리- 왜: 기존에는 추가 정보(memories, personalities, backgrounds, relationships) 수정 시 전체 삭제 후 재생성되어 변경 누락/DB 오버헤드가 발생함 - 무엇: - Memory/Personality/Background 값 필드(content/description/emotion)를 var로 전환해 in-place 업데이트 허용 - 서비스 레이어에 증분 업데이트 로직 적용 - 요청에 없는 항목만 제거, 기존 항목은 값만 갱신, 신규 키만 추가 - relationships는 personName+relationshipName 복합 키 매칭(keyOf)으로 필드만 갱신 - ChatCharacter 컬렉션에 orphanRemoval=true 설정하여 iterator.remove 시 고아 삭제 보장 - updateChatCharacterWithDetails에서 clear/add 제거 → 증분 업데이트 메서드 호출로 변경 - 효과: DELETE+INSERT 제거로 성능 개선, ID/createdAt 유지로 감사 추적 용이, 데이터 정합성 향상