diff --git a/src/main/java/com/likelion/danchu/domain/store/controller/StoreController.java b/src/main/java/com/likelion/danchu/domain/store/controller/StoreController.java index 5442327..5be3d56 100644 --- a/src/main/java/com/likelion/danchu/domain/store/controller/StoreController.java +++ b/src/main/java/com/likelion/danchu/domain/store/controller/StoreController.java @@ -23,6 +23,7 @@ import com.likelion.danchu.domain.store.dto.request.StoreRequest; import com.likelion.danchu.domain.store.dto.response.PageableResponse; import com.likelion.danchu.domain.store.dto.response.StoreDistanceResponse; +import com.likelion.danchu.domain.store.dto.response.StoreListItemResponse; import com.likelion.danchu.domain.store.dto.response.StoreResponse; import com.likelion.danchu.domain.store.exception.StoreErrorCode; import com.likelion.danchu.domain.store.service.StoreHashtagService; @@ -98,10 +99,11 @@ public ResponseEntity> createStore( - size : 페이지 당 보여줄 가게 수입니다. (기본값: 3) """) @GetMapping - public ResponseEntity>> getPaginatedStores( + public ResponseEntity>> getPaginatedStores( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "3") int size) { - PageableResponse storeResponses = storeService.getPaginatedStores(page, size); + PageableResponse storeResponses = + storeService.getPaginatedStores(page, size); return ResponseEntity.ok(BaseResponse.success("가게 페이징 조회에 성공했습니다.", storeResponses)); } diff --git a/src/main/java/com/likelion/danchu/domain/store/dto/response/StoreListItemResponse.java b/src/main/java/com/likelion/danchu/domain/store/dto/response/StoreListItemResponse.java new file mode 100644 index 0000000..555798a --- /dev/null +++ b/src/main/java/com/likelion/danchu/domain/store/dto/response/StoreListItemResponse.java @@ -0,0 +1,18 @@ +package com.likelion.danchu.domain.store.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(title = "StoreListItemResponse", description = "목록 아이템(가게 정보를 store로 래핑)") +public class StoreListItemResponse { + + @Schema(description = "가게 정보", requiredMode = Schema.RequiredMode.REQUIRED) + private StoreResponse store; +} diff --git a/src/main/java/com/likelion/danchu/domain/store/mapper/StoreMapper.java b/src/main/java/com/likelion/danchu/domain/store/mapper/StoreMapper.java index 97e16c3..76da72c 100644 --- a/src/main/java/com/likelion/danchu/domain/store/mapper/StoreMapper.java +++ b/src/main/java/com/likelion/danchu/domain/store/mapper/StoreMapper.java @@ -10,6 +10,7 @@ import com.likelion.danchu.domain.hashtag.dto.response.HashtagResponse; import com.likelion.danchu.domain.menu.dto.response.MenuResponse; import com.likelion.danchu.domain.store.dto.request.StoreRequest; +import com.likelion.danchu.domain.store.dto.response.StoreListItemResponse; import com.likelion.danchu.domain.store.dto.response.StoreResponse; import com.likelion.danchu.domain.store.entity.Store; @@ -73,4 +74,18 @@ public StoreResponse toResponse(Store store, List hashtags) { public StoreResponse toResponse(Store store) { return toResponse(store, List.of(), List.of()); } + + // StoreResponse를 store로 감싼 목록 아이템으로 변환 + public StoreListItemResponse toListItem( + Store store, List hashtags, List menus) { + return StoreListItemResponse.builder().store(toResponse(store, hashtags, menus)).build(); + } + + public StoreListItemResponse toListItem(Store store, List hashtags) { + return StoreListItemResponse.builder().store(toResponse(store, hashtags)).build(); + } + + public StoreListItemResponse toListItem(Store store) { + return StoreListItemResponse.builder().store(toResponse(store)).build(); + } } diff --git a/src/main/java/com/likelion/danchu/domain/store/service/StoreService.java b/src/main/java/com/likelion/danchu/domain/store/service/StoreService.java index 22fa983..ed3b958 100644 --- a/src/main/java/com/likelion/danchu/domain/store/service/StoreService.java +++ b/src/main/java/com/likelion/danchu/domain/store/service/StoreService.java @@ -26,6 +26,7 @@ import com.likelion.danchu.domain.store.dto.request.StoreRequest; import com.likelion.danchu.domain.store.dto.response.PageableResponse; import com.likelion.danchu.domain.store.dto.response.StoreDistanceResponse; +import com.likelion.danchu.domain.store.dto.response.StoreListItemResponse; import com.likelion.danchu.domain.store.dto.response.StoreResponse; import com.likelion.danchu.domain.store.entity.Store; import com.likelion.danchu.domain.store.entity.StoreHashtag; @@ -128,13 +129,15 @@ public StoreResponse createStore(StoreRequest storeRequest, MultipartFile imageF * @param size 한 페이지에 포함될 가게 수 * @return 페이징된 가게 목록 응답 */ - public PageableResponse getPaginatedStores(int page, int size) { + public PageableResponse getPaginatedStores(int page, int size) { PageRequest pageRequest = PageRequest.of(page, size); // 페이지당 3개 Page storePage = storeRepository.findAll(pageRequest); List stores = storePage.getContent(); if (stores.isEmpty()) { - return PageableResponse.from(storePage.map(storeMapper::toResponse)); // 그대로 빈 페이지 반환 + Page empty = + storePage.map(s -> storeMapper.toListItem(s, List.of(), List.of())); // 메뉴 빈 리스트 + return PageableResponse.from(empty); } // 현재 페이지의 가게 ID들 수집 @@ -156,16 +159,16 @@ public PageableResponse getPaginatedStores(int page, int size) { // 메뉴 응답 리스트도 한 번에 로딩하여 (N+1 방지) Map> menusByStoreId = loadMenusByStoreIds(storeIds); - // 각 가게 별로 해시태그 포함하여 DTO 변환 - Page storeResponsePage = + // StoreListItemResponse(store로 래핑) + Page wrappedPage = storePage.map( store -> - storeMapper.toResponse( + storeMapper.toListItem( store, hashtagsByStoreId.getOrDefault(store.getId(), List.of()), menusByStoreId.getOrDefault(store.getId(), List.of()))); - return PageableResponse.from(storeResponsePage); + return PageableResponse.from(wrappedPage); } /**