Skip to content
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

[Chat] 채팅방에서 유저를 내보낼 때 내보내지는 유저의 WebSocket Subscription 해제 #293

Merged

Conversation

minisundev
Copy link
Member

#️⃣연관된 이슈

📝작업 내용

  • 추방당한 유저의 개인 구독 queue로 해당 채팅방과 연결을 끊으라는 메시지를 서버측에서 보내게 했습니다

💬리뷰 요구사항(선택)

처음에는 서버측에서 아예 웹소켓 구독을 끊어버리고 싶어서 Interceptor의 postSend를 이용해 시도했습니다.

@Bean
  fun webSocketInterceptor(): ChannelInterceptor {
    return object : ChannelInterceptor {
      override fun preSend(
        message: Message<*>,
        channel: MessageChannel,
      ): Message<*> {
        val simpMessageType = SimpMessageHeaderAccessor.getMessageType(message.headers)
        return when (simpMessageType) {
          SimpMessageType.CONNECT -> authenticateAndSetPrincipal(message)
          SimpMessageType.SUBSCRIBE -> verifyAccess(message)
          SimpMessageType.MESSAGE -> verifyAccess(message)
          else -> message
        }
      }

      override fun postSend(
        message: Message<*>,
        channel: MessageChannel,
        sent: Boolean,
      ) {
        val headerAccessor = SimpMessageHeaderAccessor.wrap(message)
        val destination = headerAccessor.destination
        if (destination != null && destination == "/chatroom/expel") {
          val expelId = getExpelId(headerAccessor)
          disconnectExpelledUser(expelId)
        }
      }
    }
  }

  private fun disconnectExpelledUser(expelId: String) {
    simpUserRegistry.getUsers().forEach { 
    //특정 채팅방을 unsubscribe 시키고싶었으나 일이 점점 커져갔다
    }
  }

저렇게 코드를 작성하고 할 수 있는 방법들을 찾아보았으나 세션을 서버측에서 강제 해제하는 방법은 있어도 구독만 해제하는 방법은 발견하지 못했고 모든 세션을 다 iterate하면서 특정 세션을 찾았을때 그것만 close하는 것도 성능상 좋은 방법은 아니라고 판단했습니다.

rstoyanchev/spring-websocket-portfolio#36
이런 곳에서도 다 클라이언트에서 DISCONNECT FRAME을 보내는게 일반적이라고 하는 것으로 보였습니다.

그래서 그냥 클라이언트가 DISCONNECT FRAME을 보낼 수 있도록 식별되는 메시지를 서버측에서 돌려보내는 것으로 끝냈습니다

@minisundev minisundev added the Chat 채팅 관련 기능 label Nov 16, 2024
@minisundev minisundev requested a review from a team November 16, 2024 13:21
@minisundev minisundev self-assigned this Nov 16, 2024
@minisundev minisundev merged commit 37d679f into kSideProject:dev Nov 19, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Chat 채팅 관련 기능
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

채팅방에서 유저를 내보낼 때 내보내지는 유저의 WebSocket Subscription 해제
1 participant