Skip to content

Conversation

@LimKangHyun
Copy link
Collaborator

@LimKangHyun LimKangHyun commented Jul 14, 2025

🛰️ Issue Number

Closes #18

🪐 작업 내용

SSE 연결 종료 및 객체 정리 설명

        // 연결종료 객체정리
        emitter.onCompletion(() -> emitters.remove(emitter));
        emitter.onTimeout(() -> emitters.remove(emitter));
        emitter.onError(error -> emitters.remove(emitter));

이번 작업내용은 아니지만, emitter 객체 해제의 경우는 주석으로 적기에는 조금 길어서 이 부분에 적어두었습니다.

  • onCompletion 발생 -> 브라우저 종료, 새로고침시 자동으로 서버에서 호출됨 / 로비 페이지 벗어날 시에는 FE에서 close() 호출을 명시적으로 해줘야 서버에서 onCompletion 발생
  • onTimeout 발생-> 해당 객체에 설정된 timeOut 종료 시, 서버에서 호출됨
  • onError-> 네트워크 끊김 등 클라이언트 연결 예외 시 서버에서 호출됨

SSE 플로우

  1. Room의 생성, 수정, 삭제 메서드에서는 각 작업이 완료된 후, 해당 작업에 대응하는 이벤트 객체(RoomCreatedEvent, RoomUpdatedEvent, RoomDeletedEvent)를 발행합니다.

  2. 이 이벤트들은 SseMapper를 통해 LobbySseEvent로 변환되며, 이 과정에서 이벤트 타입(CREATE, UPDATE, DELETE)이 지정되고, 클라이언트에게 전달할 payload가 구성됩니다.

  3. 변환된 LobbySseEvent는 이벤트 리스너를 통해 SSE(로비에 있는 사용자)를 구독 중인 모든 클라이언트에게 브로드캐스팅됩니다.

변경 사항

  • SSE 이벤트 타입을 enum클래스로 정의해두었습니다.
  • 이벤트 객체 없이 이벤트리스너에 전달은 가능하지만 기능별 메시지 타입별로 책임분리를 위해, 나누어놓았습니다!
  • 현재 방 생성 메서드에만 이벤트 퍼블리셔가 추가되어있습니다. 추후 방 수정, 방 삭제 로직이 완성되면 이벤트 퍼블리셔를 추가해 두겠습니다!
  • 클라이언트의 SSE 연결을 무제한으로 유지하는 경우(생성된 emitter객체가 오래 유지되는 경우) emitter 객체를 잘 정리해준다면 문제가 되지는 않지만, 타임아웃을 설정하고 클라이언트에서 재연결 요청을 받는것이 안전한 방법이라고 합니다! 따라서 저도 30초 타임아웃을 유지하고 나중에 테스트 하면서 문제가 없다면 5분으로 늘릴 예정입니다!

테스트 사진

아래는 security 설정을 모두 끄고, 생성 SSE 메시지 알림 테스트 해보았습니다. 정상적으로 알림을 받는 것을 확인할 수 있습니다.
스크린샷 2025-07-14 오후 3 43 12

📚 Reference

✅ Check List

  • 코드가 정상적으로 컴파일되나요?
  • 테스트 코드를 통과했나요?
  • merge할 브랜치의 위치를 확인했나요?
  • Label을 지정했나요?

@LimKangHyun LimKangHyun self-assigned this Jul 14, 2025
@LimKangHyun LimKangHyun linked an issue Jul 14, 2025 that may be closed by this pull request
4 tasks
@LimKangHyun LimKangHyun added the enhancement New feature or request label Jul 14, 2025
Copy link
Collaborator

@silver-eunjoo silver-eunjoo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[L1-변경요청]
강현님 PR 제목 수정 부탁드립니닷 !

@LimKangHyun LimKangHyun changed the title Feat/18 [feat] SSE 알림 기능 구현 Jul 14, 2025
Copy link
Collaborator

@sehee123 sehee123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다. SSE.. ⭐️

Copy link
Collaborator

@jiwon1217 jiwon1217 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 ! listener 패키지에 이벤트 타입마다 EventListener 클래스를 만드신 이유가 궁금합니다.

@LimKangHyun
Copy link
Collaborator Author

고생하셨습니다 ! listener 패키지에 이벤트 타입마다 EventListener 클래스를 만드신 이유가 궁금합니다.

이벤트 하나하나가 단순해서 하나로 합칠수 있긴한데, 이벤트 타입의 관점에서 srp를 생각하면서 작성했습니다!

@silver-eunjoo
Copy link
Collaborator

silver-eunjoo commented Jul 14, 2025

PR 설명에서

클라이언트의 SSE 연결을 무제한으로 유지하는 경우(생성된 emitter객체가 오래 유지되는 경우) emitter 객체를 잘 정리해준다면 문제가 되지는 않지만, 타임아웃을 설정하고 클라이언트에서 재연결 요청을 받는것이 안전한 방법이라고 합니다! 따라서 저도 30초 타임아웃을 유지하고 나중에 테스트 하면서 문제가 없다면 5분으로 늘릴 예정입니다!

이 부분에서 궁금한 건데, emitter 객체가 오래 유지되는 경우는 그럼 사용자가 로비에서 오래 머무를 때를 얘기하는 거죠?

@LimKangHyun
Copy link
Collaborator Author

PR 설명에서

클라이언트의 SSE 연결을 무제한으로 유지하는 경우(생성된 emitter객체가 오래 유지되는 경우) emitter 객체를 잘 정리해준다면 문제가 되지는 않지만, 타임아웃을 설정하고 클라이언트에서 재연결 요청을 받는것이 안전한 방법이라고 합니다! 따라서 저도 30초 타임아웃을 유지하고 나중에 테스트 하면서 문제가 없다면 5분으로 늘릴 예정입니다!

이 부분에서 궁금한 건데, emitter 객체가 오래 유지되는 경우는 그럼 사용자가 로비에서 오래 머무를 때를 얘기하는 거죠?

넵 맞습니다!

Copy link
Collaborator

@silver-eunjoo silver-eunjoo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

헐 짱 어려운데.. 너무 설명을 잘해주셔서 이해해버렸어요..

감사합니다 !! 고생하셨습니다 👍

@LimKangHyun LimKangHyun merged commit cf25ffa into dev Jul 14, 2025
@LimKangHyun LimKangHyun deleted the feat/18 branch July 18, 2025 12:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] SSE 알림 기능

6 participants