Skip to content

feat: 채팅 API 및 WebSocket 실시간 통신 구현(#54) - #57

Merged
JoonKyoLee merged 8 commits into
mainfrom
feat/chat-api-websocket
Jul 6, 2026
Merged

JoonKyoLee merged 8 commits into
mainfrom
feat/chat-api-websocket

Conversation

@JoonKyoLee

Copy link
Copy Markdown
Collaborator

관련 이슈

작업 내용

  • 채팅 도메인 엔티티 및 기본 리포지토리 구현
  • 멘토링 승인 시 채팅방 생성 연동
  • 채팅방 목록 및 상세 조회 API 구현
  • 채팅 메시지 조회 및 전송 API 구현
  • 채팅 읽음 처리 및 종료 요청 API 구현
  • 채팅 종료 승인 및 OB 일정 수정 API 구현
  • WebSocket 및 실시간 이벤트 구현

상세 변경 사항

  • chat 도메인을 새로 추가하고 ChatRoom, ChatMessage 엔티티를 구현했습니다.
  • ChatRoomStatus, ChatCloseRequester, ChatMessageStatus enum을 추가했습니다.
  • ChatRoomRepository, ChatMessageRepository를 추가했습니다.
  • MypageService.approveOBMentoringRequest()에 채팅방 생성 로직을 연동했습니다.
  • GET /api/chat/rooms 추가
  • GET /api/chat/rooms/{roomId} 추가
  • GET /api/chat/rooms/{roomId}/messages 추가
  • POST /api/chat/rooms/{roomId}/messages 추가
  • POST /api/chat/rooms/{roomId}/read 추가
  • POST /api/chat/rooms/{roomId}/close-request 추가
  • POST /api/chat/rooms/{roomId}/close-approve 추가
  • PUT /api/chat/rooms/{roomId}/schedule 추가
  • /ws/chat WebSocket endpoint를 추가했습니다.
  • STOMP 기반 pub/sub 구조와 채팅 이벤트 응답 DTO를 추가했습니다.

구현 포인트

  • 멘토링 신청 1건당 채팅방 1개가 생성되도록 모델링해, 승인 트랜잭션 내부에서 멘토링 상태 변경과 채팅방 생성을 함께 처리했습니다.
  • 채팅 메시지는 커서 기반 페이지네이션으로 구현해 최초 50건 조회, 이후 이전 메시지 추가 조회가 가능하도록 구성했습니다.
  • 채팅방 목록 조회에서는 미읽음 수를 방별 개별 조회하지 않고, room id 기준 그룹 집계 쿼리로 한 번에 조회하도록 구현했습니다.
  • 읽음 처리는 개별 메시지 순회가 아니라 벌크 업데이트로 처리해 입장 시 전체 읽음 처리 요구사항에 맞췄습니다.
  • 종료 요청/승인 흐름은 채팅방 락 기반으로 처리해 상태 경쟁 상황에서도 closeRequester, ChatRoomStatus, MentoringApplication.status가 함께 정합성 있게 변경되도록 구성했습니다.
  • 종료 승인 시 MentoringApplication -> COMPLETED, ChatRoom -> READ_ONLY를 한 트랜잭션에서 반영했습니다.
  • 일정 수정은 OB 권한뿐 아니라 해당 채팅방의 멘토 참여자인지까지 함께 검증하도록 구현했습니다.
  • WebSocket은 현재 프로젝트 JWT 인증 구조와 맞춰 STOMP CONNECT 시 Authorization 헤더 기반 인증을 수행하도록 구성했습니다.
  • REST와 WebSocket이 서로 다른 로직을 갖지 않도록, 둘 다 동일한 ChatService를 타고 서비스 레벨에서 실시간 이벤트를 발행하도록 설계했습니다.
  • 실시간 이벤트는 MESSAGE_SENT, MESSAGE_READ, CLOSE_REQUESTED, CLOSE_APPROVED, SCHEDULE_UPDATED, ROOM_LIST_UPDATED로 분리해 프론트가 필요한 화면만 갱신할 수 있도록 했습니다.

테스트

  • ./gradlew compileJava 성공 확인

참고 사항

  • 현재 WebSocket 브로커는 Spring Simple Broker 기반으로 구성했습니다.
  • 프론트는 STOMP 연결 시 Authorization: Bearer {accessToken} 헤더를 함께 전달해야 합니다.

@JoonKyoLee JoonKyoLee self-assigned this Jul 6, 2026
@JoonKyoLee
JoonKyoLee requested a review from howooyeon July 6, 2026 13:18
@github-actions

github-actions Bot commented Jul 6, 2026 •

Copy link
Copy Markdown

Unit Test Results

1 tests   1 ✔️  0s ⏱️
1 suites  0 💤
1 files    0 ❌

Results for commit d78ea45.

♻️ This comment has been updated with latest results.

@JoonKyoLee
JoonKyoLee merged commit 06b6f87 into main Jul 6, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: YB·OB 채팅 및 멘토링 종료 처리 API 구현

1 participant