본문 바로가기
C.W.K.
Stream
Lesson 02 of 07 · published

방과 채널

~12 min · management, rooms, channels

Level 0Poller
0 XP0/60 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

방은 서버가 만드는 연결 묶음이야

‘방’은 서버가 연결을 묶는 데 쓰는 임의의 문자열이야. 그 문자열로 메시지를 보내면 구독 중인 연결이 모두 받아. 브라우저는 방의 존재를 모르고 서버가 출입을 통제해.

연결을 유지한 채 방 바꾸기

Slack 이나 Discord 처럼 연결 하나 안에서 사용자가 방 사이를 오갈 수 있으면 사용성이 좋아져. 서버는 switch_room 메시지를 받으면 관리자에서 기존 멤버십을 제거하되 WebSocket 자체는 유지하고, 새 방에 다시 등록해. 물리 연결은 하나지만 논리적 멤버십이 바뀌는 거야.

채널과 방

어떤 라이브러리는 느슨한 연결 묶음인 ‘방’과 이름이 있고 오래 유지되기도 하는 전체 전송 주제인 ‘채널’을 구분해. 구현은 같고 개념만 달라. 한 용어를 골라 코드베이스 전체에서 일관되게 써.

Code

방 전환을 지원하는 처리기·python
@app.websocket('/ws/{room}')
async def chat(websocket: WebSocket, room: str):
    user_id = websocket.query_params.get('user_id', 'anon')
    await manager.connect(websocket, user_id, room)

    await manager.broadcast(room, {
        'type': 'user.joined',
        'data': {'user_id': user_id, 'room': room,
                 'online': manager.room_users(room)},
    }, exclude=websocket)

    try:
        async for msg in websocket.iter_json():
            t = msg.get('type')
            if t == 'switch_room':
                old_room = manager.ws_meta[websocket]['room']
                new_room = msg['data']['room']
                manager.disconnect(websocket)
                await manager.connect(websocket, user_id, new_room)
                await manager.broadcast(old_room, {
                    'type': 'user.left',
                    'data': {'user_id': user_id},
                })
            elif t == 'chat.message':
                await manager.broadcast(
                    manager.ws_meta[websocket]['room'],
                    {'type': 'chat.message', 'data': {**msg['data'], 'from': user_id}},
                    exclude=websocket,
                )
    except WebSocketDisconnect:
        room = manager.ws_meta.get(websocket, {}).get('room', room)
        manager.disconnect(websocket)
        await manager.broadcast(room, {
            'type': 'user.left',
            'data': {'user_id': user_id},
        })

External links

Exercise

general, random, support 방이 있는 사이드바 UI 를 만들어. 방을 누르면 기존 WebSocket 으로 switch_room 을 보내. 개발자 도구에서 새 WebSocket 연결이 생기지 않고 같은 연결을 재사용하는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.