인프런 커뮤니티 질문&답변
채팅 로비에서 유저수 노출을 위하여
해결된 질문
작성
·
306
·
수정됨
0
LobbyMember 모델을 생성해서 index에 들어오면 해당 user를 추가하는 식으로 구성하였습니다.
class LobbyMember(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)consumer에도 따로 LobbyConsumer를 생성하여 접속할 땐 생성하거나 조회하고 채팅방에 접속 시 삭제하도록 하였습니다.
class LobbyConsumer(JsonWebsocketConsumer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.group_name = "lobby" def connect(self): user = self.scope["user"] if not user.is_authenticated: self.close() else: lobby_user, _ = LobbyMember.objects.get_or_create(user=user) async_to_sync(self.channel_layer.group_add)( self.group_name, self.channel_name ) async_to_sync(self.channel_layer.group_send)( self.group_name, {"type": "lobby"}, ) self.accept() def disconnect(self, code): if self.group_name: async_to_sync(self.channel_layer.group_discard)( self.group_name, self.channel_name ) user = self.scope["user"] lobby_member, _ = LobbyMember.objects.get_or_create(user=user) lobby_member.delete() async_to_sync(self.channel_layer.group_send)( self.group_name, {"type": "lobby"}, ) def lobby(self, message_dict): count = LobbyMember.get_count() self.send_json({"type": "lobby", "count": count})정상적으로 작동하는가 싶더니 2개의 다른 브라우저에서 같은 이용자로 로그인 한 후
한 곳에서 로그아웃하면 해당 유저가 삭제되어
아직 로그인 되어 있는 쪽에서는 로그인 유저가 0명으로 표시되더라구요.
지금처럼 LobbyMember를 생성하지 않고 기존 모델로 사용하는 방법이나 방향이 있을까요? 이렇게 하는건 아닌것 같아서 질문드립니다!
답변 1
1
이진석
지식공유자
안녕하세요.
웹소켓 연결 시에 LobbyMember(user)를 생성하고, 웹소켓 연결이 끊어질 때 LobbyMember(user)를 삭제하도록 구성하셨는 데요.
그러니 #3에서 말씀하신 것처럼, 한 user가 연결#1이 연결된 상황에서도 연결#2의 연결이 끊어진다면, 그 user의 LobbyMember가 삭제되는 상황이 발생할 수 밖에 없습니다.
#4에서 말씀하신 것처럼 기존 모델을 활용하시는 것도 한 방법이 되겠습니다. Lobby 라는 이름의 채팅방을 고정으로 이용하는 방식인 것이죠.
살펴보시고 질문 남겨주세요.
화이팅입니다. :-)






Lobby 방과 Lobby 방 전용 owner를 생성해서 해결하였습니다. 감사합니다!