설명
백엔드 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을 재사용하도록 구현해야 합니다.
참고
설명
백엔드 PR #132(장소 및 경로 벌크 조회 API 추가 및 비동기 가상 스레드 최적화)가 적용됨에 따라, 프론트엔드 화면 초기 진입 시 발생하는 API N+1 병목을 완화하고 로딩 성능을 최적화하기 위해 신규 일괄(벌크) 조회 API 및 파라미터를 적용해야 합니다.
기대 동작
1. 일정 및 일정 아이템 일괄 조회 (일정 벌크 조회)
GET /rooms/{roomId}/schedules?includeItems=trueincludeItems=true쿼리 파라미터를 전달하면 전체 일자별 일정 목록과 각 일정 하위의 장소 아이템 목록(items배열)을 N+1 조회 없이 한 번에 조회합니다.2. 북마크 카테고리 구분 없는 전체 조회 (북마크 벌크 조회)
GET /rooms/{roomId}/bookmarkscategoryId쿼리 파라미터를 전달하지 않고(생략) 호출하면, 카테고리 필터링 없이 방의 전체 보관함 항목을 한 번에 정렬된 결과로 응답받습니다.3. 장소 미리보기 벌크 조회 적용
GET /places/{googlePlaceId}/preview) 대신 벌크 API를 사용합니다.POST /places/previews/batch{"googlePlaceIds": ["ChIJ...", ...]}(최대 100개)4. 장소 사진 관련 벌크 조회 적용
POST /places/photo-names/batch{"googlePlaceIds": ["ChIJ...", ...]}(최대 100개)POST /places/photos/batch{"photoNames": ["places/.../photos/...", ...]}(최대 100개)5. 일정 경로(이동 정보) 벌크 조회 적용
POST /rooms/{roomId}/schedules/{scheduleId}/routes/batch{ "items": [ { "itemId": 1, "travelMode": "WALKING" }, { "itemId": 2, "travelMode": "DRIVING" } ] }status/errorCode)에 대한 렌더링 예외 처리가 필요합니다.6. Rate Limit에 대응한 프론트엔드 측 캐싱 권장
photoUrl)을 컴포넌트 리렌더링이나 탭 전환 시마다 중복 요청하지 않아야 합니다.photoName에 대해서는 새로고침 전까지 기존 URL을 재사용하도록 구현해야 합니다.참고