- /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: 본인 댓글에 대해 soft delete 처리
- 신고 API: 신고 내용을 그대로 저장하는 CharacterCommentReport 엔티티/리포지토리 도입
- Controller: 삭제, 신고 엔드포인트 추가 및 인증/본인인증 체크
- Service: 비즈니스 로직 구현 및 예외 처리 강화
왜: 캐릭터 댓글 관리 기능 요구사항(삭제/신고)을 충족하기 위함
무엇: 엔드포인트, 서비스 로직, DTO 및 JPA 엔티티/리포지토리 추가
- 캐릭터 댓글 엔티티/레포지토리/서비스/컨트롤러 추가
- 댓글 작성 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 호출 최소화
- ChatRoomService.listMyChatRooms 사용, 최근 순 최대 10개 노출
- 방 title/imageUrl을 그대로 사용해 UI/데이터 일관성 유지
- 비로그인 사용자는 빈 배열 반환
refactor(dto): RecentCharacter.characterId → roomId로 변경
- ChatCharacterRelationship 엔티티를 personName, relationshipName, description(TEXT), importance, relationshipType, currentStatus로 변경
- ChatCharacter.addRelationship 및 Service 메서드 시그니처를 새 스키마에 맞게 수정
- 등록/수정 플로우에서 relationships 매핑 로직 업데이트
- Admin 상세 응답 DTO(RelationshipResponse) 및 매핑 업데이트
- 전체 빌드 성공
- 상세 페이지 정보 강화 및 탐색성 향상을 위해 응답 필드를 확장
- CharacterDetailResponse에 originalTitle, originalLink, characterType, others 추가
- OtherCharacter DTO 추가 (characterId, name, imageUrl, tags)
- 공유 태그 기반으로 현재 캐릭터를 제외한 랜덤 10개 캐릭터 조회 JPA 쿼리 추가
- ChatCharacterRepository.findRandomBySharedTags(@Query, RAND 정렬, 페이징)
- 서비스 계층에 getOtherCharactersBySharedTags 추가 및 태그 지연 로딩 초기화
- 컨트롤러에서:
- others 리스트를 조회/매핑하여 응답에 포함
- originalTitle, originalLink, characterType을 응답에 포함
- ChatCharacter 엔티티에 originalTitle, originalLink(Nullable), characterType(Enum) 필드 추가
- characterType: CLONE | CHARACTER (기본값 CHARACTER)
- 원작/원작 링크는 빈 문자열 대신 null 허용으로 저장
- Admin DTO(Register/Update)에 originalTitle, originalLink, characterType 필드 추가
- 등록 API에서 외부 API 요청 바디에 3개 필드(originalTitle, originalLink, characterType) 제외 처리
- 수정 API에서 3개 필드만 변경된 경우 외부 API 호출 생략하고 DB만 업데이트
- hasChanges: 외부 API 대상 필드 변경 여부 판단(3개 필드 제외)
- hasDbOnlyChanges: 3개 필드만 변경된 경우 처리 분기
- Service 계층에 필드 매핑 및 Enum 파싱 추가
- createChatCharacter / createChatCharacterWithDetails에 originalTitle/originalLink/characterType 반영
- 이름 중복 검증 로직 유지, isActive=false 비활성화 이름 처리 로직 유지
- 관계 스키마를 name, relationShip 구조로 일원화
- Admin/사용자 컨트롤러 조회 응답에서 관계를 객체로 반환하도록 수정
- 등록/수정 요청 DTO에 ChatCharacterRelationshipRequest(name, relationShip) 추가
- 서비스 계층 create/update/add 메소드 시그니처 및 매핑 로직 업데이트
- description 한 줄 소개 사용 전제 하의 관련 사용부 점검(엔티티 컬럼 구성은 기존 유지)
왜: 기존에는 채팅방 미구현으로 최근 대화 리스트를 빈 배열로 응답했음. 채팅방/메시지 기능이 준비됨에 따라 실제 최근 대화 캐릭터를 노출해야 함.
무엇:
- repository: findRecentCharactersByMember JPA 쿼리 추가 (채팅방/참여자/메시지 조인, 최신 메시지 기준 정렬)
- service: getRecentCharacters(member, limit) 구현 (member null 처리 및 페이징 적용)
- controller: /api/chat/character/main에서 인증 사용자 기준 최근 캐릭터 최대 10개 반환
- ChatCharacterUpdateRequest 클래스 추가 (모든 필드 nullable)
- ChatCharacter 엔티티의 필드를 var로 변경하여 수정 가능하게 함
- 이미지 포함/제외 수정 API를 하나로 통합
- 변경된 데이터만 업데이트하도록 구현
- isActive가 false인 경우 특별 처리 추가