Skip to content

feat: 알림 실시간 채널 (SSE) - #117

Merged
RosieOh merged 1 commit into
mainfrom
feat/notification-sse
Sep 22, 2026
Merged

RosieOh merged 1 commit into
mainfrom
feat/notification-sse

Conversation

@RosieOh

@RosieOh RosieOh commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

Closes #45

이슈 할 일 대응

  • WebSocket/SSE 선택과 근거 — SSE (문서)
  • 연결 인증(JWT) — 기존 필터 그대로, /notifications/** 인증 규칙
  • 이벤트 페이로드 — notification 이벤트 = 알림 목록 항목과 같은 JSON, id = 알림 id
  • 최소 동작 서버/클라이언트 — 서버 이 PR, 클라이언트 CareCode_FE PR
  • 끊김/재연결/중복 — connected 수신 시 목록 재조회(목록이 진실의 원천), 중복은 재조회라 무해, 연결 상한
  • 모니터링 — 연결 수 게이지, 프록시 버퍼링 헤더

확인

  • NotificationStreamContractTest (실제 JWT·트랜잭션): 비로그인 401, 커밋된 알림은 받는 사람에게만, 롤백된 알림 미전송, 연결 상한
  • 실제 Tomcat (bootRun + compose DB): 관리자 발송 → 스트림으로 즉시 수신, 응답 헤더 확인, 6초 타임아웃 후 보안 오류 로그 0건
  • 전체 529 tests, 실패 0, skip 0

한계

연결이 인스턴스 메모리에 있다. 현재 단일 인스턴스라 충분하고, 늘릴 때는 Redis pub/sub 가 필요하다 (문서에 기록).

GET /notifications/stream 으로 새 알림을 즉시 받는다.

- WebSocket 대신 SSE: 알림은 한 방향이라, 기존 JWT 필터·인가·CORS 를 그대로 쓰는 쪽을 골랐다.
- 알림 엔티티 @PostPersist 에서 이벤트를 올리고 커밋 뒤에 보낸다. 알림을 만드는 경로가 여럿이라
  (서비스·관리자 발송·빈자리 알림 …) 각각에 발송 코드를 넣지 않는다. 롤백된 알림은 나가지 않는다.
- connected 이벤트, 알림 id 를 이벤트 id 로, 25초 heartbeat, 30분 타임아웃, 사용자당 연결 5개 상한.
- X-Accel-Buffering: no, 연결 수 게이지(carecode.notification.stream.connections).
- 연결 종료 시 ASYNC 디스패치는 인가를 다시 하지 않는다 (JWT 필터가 돌지 않아 커밋된 응답에 401 을 쓰려던 문제).
- docs/features/realtime-notifications.md
@RosieOh
RosieOh merged commit 276c2d6 into main Sep 22, 2026
7 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.

[알림] 실시간 채널(WebSocket/SSE) 설계 및 1차 구현

1 participant