Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -98,10 +99,11 @@ public ResponseEntity<BaseResponse<StoreResponse>> createStore(
- size : 페이지 당 보여줄 가게 수입니다. (기본값: 3)
""")
@GetMapping
public ResponseEntity<BaseResponse<PageableResponse<StoreResponse>>> getPaginatedStores(
public ResponseEntity<BaseResponse<PageableResponse<StoreListItemResponse>>> getPaginatedStores(
@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "3") int size) {

PageableResponse<StoreResponse> storeResponses = storeService.getPaginatedStores(page, size);
PageableResponse<StoreListItemResponse> storeResponses =
storeService.getPaginatedStores(page, size);
return ResponseEntity.ok(BaseResponse.success("가게 페이징 조회에 성공했습니다.", storeResponses));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -73,4 +74,18 @@ public StoreResponse toResponse(Store store, List<HashtagResponse> hashtags) {
public StoreResponse toResponse(Store store) {
return toResponse(store, List.of(), List.of());
}

// StoreResponse를 store로 감싼 목록 아이템으로 변환
public StoreListItemResponse toListItem(
Store store, List<HashtagResponse> hashtags, List<MenuResponse> menus) {
return StoreListItemResponse.builder().store(toResponse(store, hashtags, menus)).build();
}

public StoreListItemResponse toListItem(Store store, List<HashtagResponse> hashtags) {
return StoreListItemResponse.builder().store(toResponse(store, hashtags)).build();
}

public StoreListItemResponse toListItem(Store store) {
return StoreListItemResponse.builder().store(toResponse(store)).build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -128,13 +129,15 @@ public StoreResponse createStore(StoreRequest storeRequest, MultipartFile imageF
* @param size 한 페이지에 포함될 가게 수
* @return 페이징된 가게 목록 응답
*/
public PageableResponse<StoreResponse> getPaginatedStores(int page, int size) {
public PageableResponse<StoreListItemResponse> getPaginatedStores(int page, int size) {
PageRequest pageRequest = PageRequest.of(page, size); // 페이지당 3개
Page<Store> storePage = storeRepository.findAll(pageRequest);
List<Store> stores = storePage.getContent();

if (stores.isEmpty()) {
return PageableResponse.from(storePage.map(storeMapper::toResponse)); // 그대로 빈 페이지 반환
Page<StoreListItemResponse> empty =
storePage.map(s -> storeMapper.toListItem(s, List.of(), List.of())); // 메뉴 빈 리스트
return PageableResponse.from(empty);
}

// 현재 페이지의 가게 ID들 수집
Expand All @@ -156,16 +159,16 @@ public PageableResponse<StoreResponse> getPaginatedStores(int page, int size) {
// 메뉴 응답 리스트도 한 번에 로딩하여 (N+1 방지)
Map<Long, List<MenuResponse>> menusByStoreId = loadMenusByStoreIds(storeIds);

// 각 가게 별로 해시태그 포함하여 DTO 변환
Page<StoreResponse> storeResponsePage =
// StoreListItemResponse(store로 래핑)
Page<StoreListItemResponse> 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);
}

/**
Expand Down