Skip to content

[이용구] sprint12 #506

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: part3-이용구
Choose a base branch
from

Conversation

reflash407
Copy link
Collaborator

요구사항

기본

웹소켓 구현하기

  • 웹소켓 환경 구성
    • spring-boot-starter-websocket 의존성을 추가하세요.

      implementation 'org.springframework.boot:spring-boot-starter-websocket'
      
    • 웹소켓 메시지 브로커 설정

      • 메모리 기반 SimpleBroker를 사용하세요.
      • STOMP 엔드포인트는 /ws로 설정하고, SockJS 연결을 지원해야 합니다.
  • 메시지 수신
    • 구독(Subscribe) 엔드포인트: /sub/channels.{channelId}.messages
    • 수신되는 메시지 타입은 MessageDto를 사용하세요.
  • 메시지 송신
    • 클라이언트가 메시지를 전송할 수 있도록 다음과 같이 엔드포인트를 구성하세요.
    • 첨부파일이 없는 텍스트 메시지
      • 송신 방식: 웹소켓
      • 전송 엔드포인트: /pub/messages
      • 요청 페이로드 타입: MessageCreateRequest
    • 첨부파일이 포함된 메시지
      • 기존 HTTP API를 유지하세요.

SSE 구현하기

  • SSE 환경을 구성하세요.
    • SSE 연결을 위한 엔드포인트를 구현하세요.
      • GET /api/sse
    • 다음 요구사항을 만족해야 합니다.
      • 사용자당 N개의 연결을 허용할 수 있어야 합니다 (예: 다중 탭/기기).
      • SseEmitter 객체를 스레드 세이프한 메모리 구조에서 안전하게 관리해야 합니다.
      • 메모리 누수 방지를 위해 다음과 같은 처리를 해야 합니다:
        • onCompletiononTimeoutonError 이벤트 핸들러에서 emitter를 제거합니다.
        • 주기적 스케줄링 작업을 통해 ping을 보내고, 응답이 없는 연결을 정리합니다.
      • 각 이벤트에는 고유한 ID를 부여하고, 클라이언트에서 Last-Event-ID를 전송해 이벤트 유실 복원이 가능하도록 해야 합니다.
  • 기존에 클라이언트에서 폴링 방식으로 주기적으로 요청하던 데이터를 SSE를 이용해 서버에서 실시간으로 전달하는 방식으로 리팩토링하세요.
  • 새로운 알림 이벤트 전송
    • 새 알림이 생성되었을 때 클라이언트에 이벤트를 전송하세요.
    • 클라이언트는 이 이벤트를 수신하면 알림 목록에 알림을 추가합니다.
    • 이벤트 명세

    | id | 이벤트 고유 ID |
    | --- | --- |
    | name | `notifications` |
    | data | `NotificationDto` |

  • 파일 업로드 상태 변경 이벤트 전송
    • 파일 업로드 상태가 변경될 때 이벤트를 발송하세요.
    • 클라이언트는 해당 상태를 수신하여 UI를 다시 렌더링합니다.
    • 이벤트 명세

    | id | 이벤트 고유 ID |
    | --- | --- |
    | name | `binaryContents.status` |
    | data | `BinaryContentDto` |

  • 채널 목록 갱신 이벤트 전송
    • 채널 목록을 업데이트해야 할 경우, 이벤트를 발송하세요.
    • 클라이언트는 해당 이벤트를 수신하면 채널 목록을 재조회합니다.
    • 이벤트 명세

    | id | 이벤트 고유 ID |
    | --- | --- |
    | name | `channels.refresh` |
    | data | `{channelId: $channelId}` |

  • 사용자 목록 갱신 이벤트 전송
    • 사용자 목록을 업데이트해야 할 경우, 이벤트를 발송하세요.
    • 클라이언트는 해당 이벤트를 수신하면 사용자 목록을 재조회합니다.
    • 이벤트 명세

    | id | 이벤트 고유 ID |
    | --- | --- |
    | name | `users.refresh` |
    | data | `{userId: $userId}` |

멘토에게

  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

@reflash407 reflash407 requested a review from JJong0416 June 22, 2025 07:55
@reflash407 reflash407 assigned reflash407 and unassigned reflash407 Jun 22, 2025
@reflash407 reflash407 added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Jun 22, 2025
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