Skip to content

채팅 기록 조회 API 개발 #140

@ckdals4600

Description

@ckdals4600

이슈 배경

  • 사용자가 채팅방에 입장했을 때 대화 내용 최신순으로 제공
  • 스크롤을 올릴 때 과거 데이터 로딩은 무한 스크롤 방식으로 제공

이슈 내용

  • Endpoint: GET /v1/chats/{chatId}
  • Request:
    • Path Variable: chatId
    • Query Param: lastId (No-Offset 페이징을 위한 마지막 메시지 ID, 첫 조회 시 null), size (페이지 크기)
  • Response: ChatHistoryRes
    • messages: 최신순으로 정렬된 메시지 리스트.
    • hasNext: 다음 페이지(더 과거의 데이터) 존재 여부.
        {
          "success": true,
          "status": "OK",
          "message": "채팅 기록 조회 완료",
          "data": {
            "messages": [
              {
                "id": 11,
                "content": "AI 답변입니다",
                "type": "AI",
                "feedback": "NONE"
              },
              {
                "id": 10,
                "content": "Spring Boot 관련 질문",
                "type": "USER"
              }
            ],
            "hasNext": true,
            "lastId": 10
          }
        }

2. 개발 범위

  • ChatController: 채팅방 ID와 페이징 파라미터(lastId, size)를 받아 조회 요청을 핸들링함.
  • ChatFacade:
    • ChatService를 통해 접근 권한(본인 소유)을 검증함.
    • MessageService를 호출하여 페이징된 메시지 목록을 조회하고 DTO로 변환함.
  • MessageQueryService:
    • MessageRepository를 사용하여 lastId보다 작은 ID를 가진 메시지를 조회함.
    • 정렬 기준: createdAt 내림차순 (최신 -> 과거).
  • MessageRepository:
    • No-Offset 방식의 쿼리 메서드을 활용하여 성능을 최적화한 페이징 조회를 구현함.

3. 데이터 구조 및 매핑

  • 정렬: 최신 대화가 상단에 오도록 내림차순(DESC)으로 반환함.
  • 피드백 필드:
    • AI 타입 메시지: feedback 상태(LIKE, DISLIKE, NONE) 포함.
    • USER 타입 메시지: feedback 필드 제외(또는 null 처리).

4. 테스트 작성

  • Integration Test:
    • 첫 페이지 조회 시 최신 메시지가 반환되는지 검증함.
    • lastId를 통한 다음 페이지 조회 시 끊긴 시점의 과거 데이터가 이어져서 나오는지 확인함.
  • Unit Test: Repository의 페이징 쿼리 동작 및 AI/USER 타입별 필드 매핑 로직 테스트.

참고 자료

No response

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions