From 1a7a0f5f2cd755abe2cf15a79a5dd142552a6874 Mon Sep 17 00:00:00 2001 From: shinchaerin79 Date: Sat, 23 Aug 2025 00:09:00 +0900 Subject: [PATCH 1/2] =?UTF-8?q?:sparkles:=20content[i].store=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=EB=A5=BC=20=EB=A7=9E=EC=B6=94=EA=B8=B0=20=EC=9C=84?= =?UTF-8?q?=ED=95=B4=20StoreListItemResponse=20DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/StoreListItemResponse.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/com/likelion/danchu/domain/store/dto/response/StoreListItemResponse.java 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; +} From 135724152c0fe1a436369db265533691fadce18a Mon Sep 17 00:00:00 2001 From: shinchaerin79 Date: Sat, 23 Aug 2025 00:09:41 +0900 Subject: [PATCH 2/2] =?UTF-8?q?:recycle:=20=EA=B0=80=EA=B2=8C=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=ED=8E=98=EC=9D=B4=EC=A7=95=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/store/controller/StoreController.java | 6 ++++-- .../danchu/domain/store/mapper/StoreMapper.java | 15 +++++++++++++++ .../danchu/domain/store/service/StoreService.java | 15 +++++++++------ 3 files changed, 28 insertions(+), 8 deletions(-) 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/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); } /**