AInfo 챗봇 구조 #2 - REST 기반 ChatRoom/ChatLog 흐름 이해하기
AInfo 프로젝트의 챗봇 기능 중 REST 기반으로 구현된 채팅방과 채팅 로그 관리 API 구조를 정리합니다.
AInfo 챗봇 구조 #2 - REST 기반 ChatRoom/ChatLog 흐름 이해하기
AInfo의 ChatRoom/ChatLog API 구조
AInfo의 챗봇은 실시간 대화는 WebSocket으로 처리하지만, 대화 기록은 Django REST API로 관리합니다. 사용자가 채팅방을 생성하거나 목록을 조회하고, 특정 채팅방의 대화를 불러오는 등의 기능은 다음과 같은 REST API 흐름을 따릅니다.
모델 구조
ChatRoom
1
2
3
4
class ChatRoom(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=100, default="새 채팅")
created_at = models.DateTimeField(auto_now_add=True)
- 사용자별 대화방을 생성해 대화 흐름을 구분
- 제목 변경 가능
ChatLog
1
2
3
4
5
class ChatLog(models.Model):
chatroom = models.ForeignKey(ChatRoom, on_delete=models.CASCADE, related_name="chatlogs")
role = models.CharField(max_length=5, choices=[("user", "User"), ("bot", "Bot")])
message = models.TextField()
timestamp = models.DateTimeField(auto_now_add=True, db_index=True)
- 채팅방에 속한 메시지를 저장
- user/bot 역할 구분
- 시간 순 정렬을 위한
timestamp
인덱스 지정
시리얼라이저 구조
ChatRoomSerializer
: 사용자 인증 기반으로 자신의 채팅방만 조회/생성 가능ChatLogSerializer
: 채팅 로그를 목록 형태로 조회 가능 (읽기 전용)
1
2
3
class ChatRoomSerializer(serializers.ModelSerializer):
chatlogs = ChatLogSerializer(many=True, read_only=True)
user = serializers.PrimaryKeyRelatedField(read_only=True)
API 뷰 구조
채팅방 목록/생성
GET /chatbot/room/
: 로그인한 사용자의 채팅방 목록 반환POST /chatbot/room/
: 새로운 채팅방 생성
1
2
3
class ChatRoomListCreateView(ListCreateAPIView):
def perform_create(self, serializer):
serializer.save(user=self.request.user)
채팅방 상세/수정/삭제
GET /chatbot/room/{pk}/
: 특정 채팅방 상세PATCH /chatbot/room/{pk}/
: 제목 수정DELETE /chatbot/room/{pk}/
: 삭제 + Redis 내 메모리 기록도 제거
1
2
3
4
5
class ChatRoomDetailDeleteUpdateView(RetrieveUpdateDestroyAPIView):
def perform_destroy(self, instance):
chat_history_manager = ChatHistoryManager(...)
chat_history_manager.clear_history()
instance.delete()
채팅 로그 목록
GET /chatbot/room/{pk}/logs/
: 해당 채팅방의 전체 로그 반환- timestamp 오름차순 정렬
Redis와의 연동: 멀티턴 대비
채팅방 삭제 시, Redis 기반 ChatHistoryManager
에서 대화 히스토리도 함께 삭제합니다. 이는 LangChain 멀티턴 대화 구조와 연계되며, 추후 챗봇 응답의 맥락 유지에 활용됩니다.
This post is licensed under CC BY 4.0 by the author.