Skip to content

feat(chat): 메시지 반응(👍👎), 답글(reply), 본인 선택지 배지 기능 추가#249

Merged
tlarbals824 merged 12 commits into
developfrom
feat/chat-reactions-replies
Jun 23, 2026
Merged

feat(chat): 메시지 반응(👍👎), 답글(reply), 본인 선택지 배지 기능 추가#249
tlarbals824 merged 12 commits into
developfrom
feat/chat-reactions-replies

Conversation

@tlarbals824

Copy link
Copy Markdown
Collaborator

요약

채팅방 진행 중 상세 개선 (5-1 ~ 5-6) 구현

  • 5-1 선택지 배지: 채팅방 진입 시 myVoteOption (A/B) 상시 제공. GET /api/chats/{voteId} 응답에 추가.
  • 5-2~5-4 이모지 반응: 👍(THUMBS_UP) / 👎(THUMBS_DOWN) 반응 지원
    • 길게 누르기 Context Menu 대응 API
    • 누적 카운트, 99+ , 본인 반응 토글/취소
    • PUT /api/chats/{voteId}/messages/{messageId}/reactions
  • 5-5~5-6 답글: replyToMessageId 로 답글 전송, 메시지 응답에 replyTo (원문 미리보기) 포함
  • 메시지 목록 응답에 reactions, myReaction, replyTo 추가
  • WebSocket 브로드캐스트에도 reply 정보 포함
  • DB: V17 마이그레이션 (parent_message_id + chat_message_reaction)

변경 파일

  • 신규 도메인: ChatMessageReaction, ReactionCount, MyReaction, ChatReactionType
  • DTO 확장: MessageResult/Response, SendMessage*, ChatRoom*, Reaction*, ReplyInfo
  • 서비스/컨트롤러 로직 대폭 추가 (enrichment, react 토글, reply 검증)
  • Flyway: V17__chat_reaction_and_reply.sql

명세 문서: chat-reactions-replies-badge-api-improvement.md

테스트 현황

  • 기존 ChatServiceTest, ChatControllerTest 등은 통과
  • 신규 기능(반응, 답글, 배지)에 대한 테스트는 아직 작성되지 않았습니다.
    • reactToMessage, reply 포함 sendMessage, getMessages enrichment, reactions 응답 등 커버리지 부족
    • Controller에 새로운 PUT /messages/.../reactions 테스트 없음

추후 테스트 보강 필요 (unit + integration)

체크리스트

  • 빌드/컴파일 성공
  • 기존 테스트 통과
  • 마이그레이션 추가
  • 신규 기능 테스트 작성 (추가 작업 필요)

@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@tlarbals824, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 11 minutes. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate.

For paid Pro and Pro+ PR reviews, CodeRabbit uses rolling per-developer review limits. Reviews become available again as older review attempts age out of the rolling limit window.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 50f05883-6388-4ac9-a3d7-1a7338605aab

📥 Commits

Reviewing files that changed from the base of the PR and between 096f22b and 7583c4d.

📒 Files selected for processing (40)
  • docs/spec/chat-reactions-replies-badge-api-improvement.md
  • src/integrationTest/java/com/ject/vs/chat/adapter/web/ChatApiIntegrationTest.java
  • src/integrationTest/java/com/ject/vs/support/ChatIntegrationTestSupport.java
  • src/main/java/com/ject/vs/chat/adapter/event/ChatMessageEventListener.java
  • src/main/java/com/ject/vs/chat/adapter/web/ChatController.java
  • src/main/java/com/ject/vs/chat/adapter/web/ChatDocs.java
  • src/main/java/com/ject/vs/chat/adapter/web/dto/ChatRoomResponse.java
  • src/main/java/com/ject/vs/chat/adapter/web/dto/MessageResponse.java
  • src/main/java/com/ject/vs/chat/adapter/web/dto/ReactMessageRequest.java
  • src/main/java/com/ject/vs/chat/adapter/web/dto/ReactionResponse.java
  • src/main/java/com/ject/vs/chat/adapter/web/dto/SendMessageRequest.java
  • src/main/java/com/ject/vs/chat/domain/ChatMessage.java
  • src/main/java/com/ject/vs/chat/domain/ChatMessageReaction.java
  • src/main/java/com/ject/vs/chat/domain/ChatMessageReactionRepository.java
  • src/main/java/com/ject/vs/chat/domain/ChatMessageRepository.java
  • src/main/java/com/ject/vs/chat/domain/ChatReactionType.java
  • src/main/java/com/ject/vs/chat/domain/MyReaction.java
  • src/main/java/com/ject/vs/chat/domain/ReactionCount.java
  • src/main/java/com/ject/vs/chat/domain/event/ChatReactionUpdatedEvent.java
  • src/main/java/com/ject/vs/chat/exception/ChatMessageNotFoundException.java
  • src/main/java/com/ject/vs/chat/exception/InvalidMessageException.java
  • src/main/java/com/ject/vs/chat/port/ChatService.java
  • src/main/java/com/ject/vs/chat/port/ReplyInfoResolver.java
  • src/main/java/com/ject/vs/chat/port/in/ChatCommandUseCase.java
  • src/main/java/com/ject/vs/chat/port/in/ChatQueryUseCase.java
  • src/main/java/com/ject/vs/chat/port/in/dto/ChatRoomResult.java
  • src/main/java/com/ject/vs/chat/port/in/dto/MessageResult.java
  • src/main/java/com/ject/vs/chat/port/in/dto/ReactionResult.java
  • src/main/java/com/ject/vs/chat/port/in/dto/ReactionUpdatedPayload.java
  • src/main/java/com/ject/vs/chat/port/in/dto/ReplyInfo.java
  • src/main/java/com/ject/vs/chat/port/in/dto/SendMessageCommand.java
  • src/main/java/com/ject/vs/user/port/UserQueryService.java
  • src/main/java/com/ject/vs/user/port/in/UserQueryUseCase.java
  • src/main/resources/db/migration/V16__chat_reaction_and_reply.sql
  • src/unitTest/java/com/ject/vs/chat/adapter/event/ChatMessageEventListenerTest.java
  • src/unitTest/java/com/ject/vs/chat/adapter/event/ChatWebSocketIntegrationTest.java
  • src/unitTest/java/com/ject/vs/chat/adapter/web/ChatControllerTest.java
  • src/unitTest/java/com/ject/vs/chat/domain/ChatMessageRepositoryTest.java
  • src/unitTest/java/com/ject/vs/chat/domain/ChatMessageTest.java
  • src/unitTest/java/com/ject/vs/chat/port/ChatServiceTest.java
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/chat-reactions-replies

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

- 메시지 답글 지원 (parentMessageId + replyTo 정보)
- 메시지 반응(THUMBS_UP / THUMBS_DOWN) 추가/취소/카운트
  - ChatMessageReaction 도메인 + ReactionCount / MyReaction 프로젝션
- 채팅방 진입 시 myVoteOption 배지 정보 제공 (ChatRoomResponse)
- SendMessageRequest에 replyToMessageId 추가
- GET /messages 응답에 replyTo, reactions, myReaction 포함
- PUT /messages/{messageId}/reactions 반응 API 신규
- V17 마이그레이션 (parent_message_id + chat_message_reaction 테이블)
- WS 브로드캐스트에 replyTo 정보 포함

명세: docs/spec/chat-reactions-replies-badge-api-improvement.md
- contentPreview는 전체 내용을 그대로 내림 (프론트에서 말줄임 처리)
- ReplyInfo, buildReplyInfo, loadParentInfos, buildReplyInfoForBroadcast 업데이트
- 스펙 문서도 반영
- Add senderId to MessageResult and MessageResponse
- Update constructions in service and event listener
- Update tests accordingly
@tlarbals824 tlarbals824 force-pushed the feat/chat-reactions-replies branch from 275f4ce to 1d6a091 Compare June 23, 2026 13:11
ReplyInfoResolver로 답글 원문 사용자 조회를 통합하고, 메시지 목록 enrichment에
batch 사용자 조회를 적용한다. 반응 변경 시 REACTION_UPDATED WebSocket
브로드캐스트를 추가하고, 메시지 없음/불일치는 404로 분리한다.
sender_id와 parent_message_id를 User·ChatMessage @manytoone으로 선언하고
JOIN FETCH 조회로 연관 엔티티를 바로 사용하도록 서비스·리스너·테스트를 정리한다.
sid, nick, col, msg, myReact를 senderId, senderNickname,
senderProfileIcon, message, myReaction으로 변경한다.
원문 메시지가 없을 때 닉네임 상수 중복을 제거하고,
contentPreview용 삭제 메시지 문구만 채팅 도메인에 유지한다.
parent chat_message row가 없으면 replyTo를 null로 반환한다.
ON DELETE SET NULL과 동일한 동작이며, synthetic 삭제 메시지 응답을 제거한다.
Testcontainers PostgreSQL 위에서 채팅방 조회, 메시지 전송/조회,
반응 추가·변경·취소 및 에러 케이스를 검증한다.
@github-actions

Copy link
Copy Markdown

빌드 실패
코드를 확인해주세요.

WebMvcTest에서 Long principal 인증을 사용하고,
ChatServiceTest mockUser 스텁 충돌 및 assertion을 정리한다.
@github-actions

Copy link
Copy Markdown

빌드 성공
배포 준비 완료!

@tlarbals824 tlarbals824 merged commit 2b390be into develop Jun 23, 2026
3 checks passed
@github-actions github-actions Bot deleted the feat/chat-reactions-replies branch June 23, 2026 13:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant