Skip to content

장소, 경로 및 북마크/일정 일괄 조회 API 적용을 통한 초기 로딩 성능 최적화 #79

@minbros

Description

@minbros

설명

백엔드 PR #132(장소 및 경로 벌크 조회 API 추가 및 비동기 가상 스레드 최적화)가 적용됨에 따라, 프론트엔드 화면 초기 진입 시 발생하는 API N+1 병목을 완화하고 로딩 성능을 최적화하기 위해 신규 일괄(벌크) 조회 API 및 파라미터를 적용해야 합니다.

기대 동작

1. 일정 및 일정 아이템 일괄 조회 (일정 벌크 조회)

  • 방 초기 진입 시 각 일정의 장소 항목(아이템) 목록을 한 번에 받아오도록 적용합니다.
  • API: GET /rooms/{roomId}/schedules?includeItems=true
  • 동작: includeItems=true 쿼리 파라미터를 전달하면 전체 일자별 일정 목록과 각 일정 하위의 장소 아이템 목록(items 배열)을 N+1 조회 없이 한 번에 조회합니다.

2. 북마크 카테고리 구분 없는 전체 조회 (북마크 벌크 조회)

  • 보관함 초기 로딩 시 카테고리별로 API를 여러 번 쪼개서 호출하지 않고 전체 목록을 일괄 조회합니다.
  • API: GET /rooms/{roomId}/bookmarks
  • 동작: categoryId 쿼리 파라미터를 전달하지 않고(생략) 호출하면, 카테고리 필터링 없이 방의 전체 보관함 항목을 한 번에 정렬된 결과로 응답받습니다.

3. 장소 미리보기 벌크 조회 적용

  • 방 초기 로딩 또는 여러 후보지를 카드 형태로 노출할 때, 기존 단건 API(GET /places/{googlePlaceId}/preview) 대신 벌크 API를 사용합니다.
  • API: POST /places/previews/batch
  • Request Body: {"googlePlaceIds": ["ChIJ...", ...]} (최대 100개)
  • 참고: 개별 장소의 외부 API 조회 실패 시 status/errorCode 형태의 부분 실패 응답이 포함되므로 예외 처리가 필요합니다.

4. 장소 사진 관련 벌크 조회 적용

  • 여러 장소의 사진 및 URL 조회를 단건 대신 벌크로 일괄 처리합니다.
  • 대표 사진 이름 벌크 조회 API: POST /places/photo-names/batch
    • Request Body: {"googlePlaceIds": ["ChIJ...", ...]} (최대 100개)
  • 사진 URL 벌크 조회 API: POST /places/photos/batch
    • Request Body: {"photoNames": ["places/.../photos/...", ...]} (최대 100개)

5. 일정 경로(이동 정보) 벌크 조회 적용

  • 일자별 일정의 구간 경로를 단건 API 대신 한 번에 조회하여 지도와 타임라인에 표시합니다.
  • API: POST /rooms/{roomId}/schedules/{scheduleId}/routes/batch
  • Request Body:
    {
      "items": [
        { "itemId": 1, "travelMode": "WALKING" },
        { "itemId": 2, "travelMode": "DRIVING" }
      ]
    }
    (최대 25개 구간)
  • 참고: 마지막 항목이거나 경로 없음 등 구간별 결과 상태(status/errorCode)에 대한 렌더링 예외 처리가 필요합니다.

6. Rate Limit에 대응한 프론트엔드 측 캐싱 권장

  • 백엔드에 사용자/API별 속도 제한(Rate Limit)이 엄격하게 적용되어 있습니다. (예: 사진 관련 API 분당 30회 제한 등)
  • 따라서 프론트엔드에서는 한 번 조회한 사진 URL(photoUrl)을 컴포넌트 리렌더링이나 탭 전환 시마다 중복 요청하지 않아야 합니다.
  • React Query 등 상태 관리 도구의 캐시를 적극 활용하여, 동일한 photoName에 대해서는 새로고침 전까지 기존 URL을 재사용하도록 구현해야 합니다.

참고

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions