Skip to content

Conversation

@jueunk617
Copy link
Collaborator

📌 개요

스터디룸 내 사용자의 입장 및 퇴장 상태를 실시간으로 클라이언트에 반영하기 위한 이벤트 기반 시스템을 도입하고, 이 과정에서 발생한 순환 참조 문제를 해결하여 백엔드 아키텍처를 개선했습니다.

🔨 작업 내용

실시간 입/퇴장 이벤트 방송 기능 추가

  • 사용자 입장 시 : USER_JOINED 이벤트가 /topic/room/{roomId}/events로 방송됩니다.
  • 사용자 퇴장 시 : USER_LEFT 이벤트가 /topic/room/{roomId}/events로 방송됩니다.

순환 참조 문제 해결을 위한 아키텍처 리팩토링

  • 문제점 : 초기 구현 과정에서 WebSocketSessionManagerRoomParticipantService 간의 양방향 의존성으로 인해 순환 참조가 발생하여 애플리케이션 실행에 실패했습니다.
  • 해결책 : Spring의 ApplicationEventPublisher를 활용한 발행/구독 모델을 도입하여 두 서비스 간의 직접적인 결합을 끊어냈습니다.

개선된 서비스 역할 분담

  • WebSocketSessionManager : 이제 세션 종료 시 RoomParticipantService를 직접 호출하는 대신, SessionDisconnectedEvent를 발행하는 책임만 가집니다.
  • RoomParticipantService : 발행된 SessionDisconnectedEvent를 구독(@EventListener)하여, 세션이 종료된 사용자에 대한 퇴장 처리 로직을 스스로 수행합니다.

🔗 관련 이슈

Closes #289

📝 참고 사항

  • 리팩토링에 따라 각 서비스의 책임이 명확해졌습니다. WebSocketSessionManagerTest는 이제 이벤트 발행 여부만 검증하고, RoomParticipantServiceTest는 이벤트 수신 시 퇴장 로직이 정상 동작하는지를 검증하도록 테스트 코드를 수정했습니다.

✅ 체크리스트

  • 기능 동작 확인
  • 테스트 코드 작성
  • 문서/주석 추가 및 최신화

@github-actions github-actions bot changed the title Feat: 웹소켓 이벤트 기반으로 스터디룸 멤버 동기화 개선 Feat: 웹소켓 이벤트 기반으로 스터디룸 멤버 동기화 개선 (#289) Oct 14, 2025
@jueunk617 jueunk617 merged commit 8f8bc24 into dev Oct 14, 2025
3 checks passed
@github-actions github-actions bot deleted the Feat/289 branch October 14, 2025 23:59
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.

5 participants