250108 TIL 채팅 방 생성 코드 수정

윤수용·2025년 1월 9일
0

TIL

목록 보기
95/113

1. 한 일

Django REST Framework에서의 요청 처리

  • Django REST Framework의 APIView를 활용하여 POST 요청 처리 로직을 작성했다.
  • request.data.copy()serializer를 사용하여 클라이언트 데이터를 검증 및 저장하는 방식을 학습했다.
  • 필수 필드 누락 시 400 Bad Request 응답을 반환하고, 적절한 에러 메시지를 포함하는 방식을 구현했다.

모델 데이터 저장

  • Django 모델의 objects.create()를 활용하여 ChatRoomChatMessage 객체를 생성하는 과정을 연습했다.
  • ForeignKey 필드에 객체 인스턴스(chat_id=chatroom_instance)나 기본 키(chat_id_id=chat_id)를 모두 사용할 수 있음을 확인했다.
  • JSONField에 Python 딕셔너리를 저장하여 메시지 데이터를 관리하는 방식을 구현했다.

API 응답 설계

  • 사용자 메시지와 AI 응답을 포함하는 JSON 응답 구조를 설계하고 반환했다.
  • 응답 예시:
{
    "message": "메시지가 성공적으로 생성되었습니다.",
    "user_msg": "How's the weather today?",
    "ai_response": {"content": "It's sunny and warm today."}
}

ModelSerializerread_only_fields

  • ModelSerializer를 사용하여 데이터 직렬화와 유효성 검증 과정을 자동화했다.
  • read_only_fields를 활용하여 클라이언트가 수정할 수 없는 필드(user_id, created_at, updated_at)를 명시적으로 설정했다.



2. TroubleShooting

오류 디버깅

  • 오류 메시지: "TypeError: Object of type ChatRoom is not JSON serializable"

    • 원인은 모델 인스턴스(ChatRoom)를 JSON 응답에 직접 포함하려 한 것이었다.
    • 이를 해결하기 위해 ChatRoomSerializer를 사용하여 모델 인스턴스를 JSON 형식으로 변환했다.
  • 오류 메시지: "'str' object has no attribute 'parent_run_id'"

    • 원인은 chatbot 함수로 전달된 chat_history 데이터 형식이 예상과 달랐기 때문이었다.
    • chat_history를 단순한 리스트(JSON) 구조로 변경하여 문제를 해결했다.

코드 개선

  • 반복적으로 호출되던 ForeignKey 객체를 재사용하도록 개선하여 성능과 코드 가독성을 높였다.
  • 예외 처리 로직을 세분화하여, 특정 예외(ChatRoom.DoesNotExist)는 404 에러로, 기타 예외는 500 에러로 명확히 구분했다.
  • 중복된 로직을 제거하고, serializer.is_valid()serializer.save()를 활용하여 코드를 간결하게 작성했다.

대화 맥락 유지

  • 과거 대화 기록(최신 10개 메시지)을 가져와 챗봇 함수에 전달하는 로직을 구현했다.
  • 메시지를 HumanMessageAIMessage 형태로 구성하려 했으나 호환성 문제를 발견하고, JSON 형태로 간단히 재구성하여 문제를 해결했다.



3. 느낀 점

  • Django REST Framework의 serializerread_only_fields를 활용하면 데이터 검증 및 처리가 훨씬 간단해진다는 점을 배웠다.
  • 트랜잭션(transaction.atomic)을 통해 모델 간 데이터 일관성을 유지하고, 실패 시 롤백을 처리할 수 있는 구조를 익혔다.
  • 디버깅 과정을 통해 함수 간 데이터 형식이 중요하며, 이를 명확히 정의하고 처리해야 한다는 점을 깨달았다.
profile
잘 먹고 잘 살자

0개의 댓글

관련 채용 정보