👨🏻‍💻

3. 채팅방 정적 데이터 띄우기

브랜치
채팅
생성 일시
2023/09/27 06:20
작성일
2023/09/26
작성자
최종 편집 일시
2023/10/11 04:20
자세한 코드를 보려면 버튼을 클릭하세요

채팅방 연결에도 http가 필요한 이유

채팅은 실시간으로 이뤄지기 때문에 WebSocket만 이용하면 될 것이라 생각하였지만,
실제로는 채팅방에 참여하고 있는 상대의 정보, 어떤 상품에 대한 채팅방인지, 기존에 오고갔던 메시지 내용 등 실시간성이 필요 없는 데이터도 많이 있습니다.
이러한 정적인 정보를 표현해주기 위해 http 연결을 해주어야 합니다.
필요한 정적인 정보는 아래와 같습니다.
채팅 상대방 정보 (상대방 아이디, 매너온도)
거래 상품에 대한 정보 (상품명, 상품 이미지, 상품 가격, 거래 상태)
기존에 오고갔던 대화 내용

chat.html → urls.py

채팅방 목록 중 특정 채팅방을 클릭하면 아래와 같이 selected_chatroom 경로로 이동하도록 설정해놓았습니다.
채팅 목록에서 채팅방 각각의 컨테이너는 div 태그로 되어 있는데, 아래와 같이 작성하여 a 태그처럼 새로운 주소로 이동시킬 수 있습니다.
<div class="flex-box chat-box between" style="cursor: pointer;" onclick='location.href="{% url 'dangun_app:selected_chatroom' chatroom.chatroom.id%}";'>
Python
복사
selected_chatroom의 경로는 아래와 같이 chatroom_id가 포함된 주소로 설정하였습니다.
path('chat/<int:chatroom_id>/', views.chatroom, name='selected_chatroom'),
Python
복사
채팅방에 참여하지 않은 다른 사용자가 주소를 통해 채팅방에 접근할 수 있는 문제가 발생할 수 있습니다. 이 문제는 테스트 및 보완이 필요할 것으로 보입니다.

views.py

채팅방 상세 내용을 불러오는 메서드는 chatroom 함수입니다.
chatroom 함수는 아래 순서로 실행됩니다.
1.
채팅 목록을 불러옵니다.
@login_required def chatroom(request, chatroom_id): user = request.user # 참여하고 있는 채팅방 목록 및 관련 정보 불러오기 chatrooms_context = get_chatrooms_context(user)
Python
복사
2.
클라이언트에서 선택한 채팅방에 대한 정보를 불러온다.
# 클릭한 채팅방 및 채팅 상대방에 대한 정보 selected_chatroom = ChatRoom.objects.get(id=chatroom_id) if selected_chatroom.chat_host == user.id: chat_partner = CustomUser.objects.get(id=selected_chatroom.chat_guest) # 채팅 상대 정보 chatroom = ChatRoom.objects.get(id=chatroom_id) if chatroom.chat_host == user.id: chat_partner = CustomUser.objects.get(id=chatroom.chat_host) else: chat_partner = CustomUser.objects.get(id=selected_chatroom.chat_host) # 어떤 상품에 대한 채팅방인지 product = PostProduct.objects.get(id=selected_chatroom.product_id) # 주고받은 채팅(메시지) 기록 messages = Message.objects.filter(chatroom=chatroom_id).order_by('sent_at') # WebSocket 연결을 위한 주소 ws_path = f"/ws/chat/{selected_chatroom.id}"
Python
복사
3.
불러온 정보를 context로 취합하여 템플릿(dangun_app/chat.html)로 넘겨준다.
# 템플릿에 전달할 데이터 정의 context = { 'chatrooms' : chatrooms_context, "selected_chatroom" : selected_chatroom, "product" : product, "chat_partner" : chat_partner, "messages" : messages, "ws_path" : ws_path, } return render(request, "dangun_app/chat.html", context)
Python
복사

chat.html

views.py에서 넘겨 받은 context에서 필요한 데이터를 사용하여 html에 표현해줍니다.
채팅방의 상대에 대한 정보, 물품에 대한 정보
이미 오고갔던 채팅 메시지

결과물