Skip to content

Commit ab17883

Browse files
authored
Merge pull request #193 from Travlocks/refactor/#191-explore-pagination
[refactor] #191 템플릿 리스트 조회 페이징 개선 및 totalPages 반환
2 parents 82b9daf + e66935e commit ab17883

5 files changed

Lines changed: 41 additions & 27 deletions

File tree

src/main/java/org/umc/travlocksserver/domain/template/controller/TemplateController.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import io.swagger.v3.oas.annotations.Parameter;
44
import jakarta.validation.Valid;
55
import lombok.RequiredArgsConstructor;
6+
import org.springframework.data.domain.PageRequest;
7+
import org.springframework.data.domain.Pageable;
68
import org.springframework.http.ResponseEntity;
79
import org.springframework.security.core.annotation.AuthenticationPrincipal;
810
import org.springframework.validation.annotation.Validated;
@@ -29,6 +31,7 @@
2931
import org.umc.travlocksserver.domain.template.service.query.TemplateRouteQueryService;
3032
import org.umc.travlocksserver.domain.template.dto.response.TemplateDetailResponseDTO;
3133
import org.umc.travlocksserver.global.annotation.LoginUser;
34+
import org.umc.travlocksserver.global.response.PageResponseDTO;
3235
import org.umc.travlocksserver.global.response.SuccessResponse;
3336
import org.umc.travlocksserver.domain.template.dto.request.TemplateVlockAddRequestDTO;
3437
import org.umc.travlocksserver.domain.template.dto.request.TemplateVlockReorderRequestDTO;
@@ -265,19 +268,22 @@ public ResponseEntity<SuccessResponse<BatchRouteResponseDTO>> getRoutes(
265268
}
266269

267270
@GetMapping("/explore")
268-
public ResponseEntity<SuccessResponse<List<TemplateExploreResponseDTO>>> exploreTemplates(
271+
public ResponseEntity<SuccessResponse<PageResponseDTO<TemplateExploreResponseDTO>>> exploreTemplates(
269272
String keyword,
270273
List<String> cities,
271274
List<String> themes,
272275
List<TripDays> tripDays,
273276
List<String> transportTypes,
274277
String sort,
275-
int page) {
278+
@RequestParam(defaultValue = "0") int page) {
279+
280+
Pageable pageable = PageRequest.of(page, 9);
281+
282+
PageResponseDTO<TemplateExploreResponseDTO> response = templateQueryService.exploreTemplatesWithPage(
283+
keyword, cities, themes, tripDays, transportTypes, sort, pageable);
284+
276285
return ResponseEntity.ok(
277-
SuccessResponse.ok(
278-
TemplateSuccessCode.TEMPLATE_EXPLORE_SUCCESS,
279-
templateQueryService.exploreTemplates(
280-
keyword, cities, themes, tripDays, transportTypes, sort, page)));
286+
SuccessResponse.ok(TemplateSuccessCode.TEMPLATE_EXPLORE_SUCCESS, response));
281287
}
282288

283289
@GetMapping("/recent")

src/main/java/org/umc/travlocksserver/domain/template/controller/TemplateControllerDocs.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.umc.travlocksserver.domain.template.dto.response.*;
2020
import org.umc.travlocksserver.domain.template.enums.TripDays;
2121
import org.umc.travlocksserver.global.response.ErrorResponse;
22+
import org.umc.travlocksserver.global.response.PageResponseDTO;
2223
import org.umc.travlocksserver.global.response.SuccessResponse;
2324
import io.swagger.v3.oas.annotations.Operation;
2425
import org.springframework.http.MediaType;
@@ -284,7 +285,7 @@ ResponseEntity<SuccessResponse<BatchRouteResponseDTO>> getRoutes(
284285
""")
285286
@ApiResponse(responseCode = "200", description = "템플릿 탐색 성공", content = @Content(mediaType = "application/json", schema = @Schema(implementation = SuccessResponse.class)))
286287
@ApiResponse(responseCode = "400", description = "템플릿 탐색 실패 (잘못된 요청)", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class)))
287-
ResponseEntity<SuccessResponse<List<TemplateExploreResponseDTO>>> exploreTemplates(
288+
ResponseEntity<SuccessResponse<PageResponseDTO<TemplateExploreResponseDTO>>> exploreTemplates(
288289
@RequestParam(required = false)
289290
String keyword,
290291
@RequestParam(required = false)
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package org.umc.travlocksserver.domain.template.repository;
22

3+
import org.springframework.data.domain.Page;
4+
import org.springframework.data.domain.Pageable;
35
import org.umc.travlocksserver.domain.template.dto.response.TemplateExploreResponseDTO;
46
import org.umc.travlocksserver.domain.template.enums.TripDays;
57

68
import java.util.List;
79

810
public interface TemplateExploreRepositoryCustom {
9-
List<TemplateExploreResponseDTO> findExploreTemplates(
11+
Page<TemplateExploreResponseDTO> findExploreTemplatesWithPage(
1012
String keyword,
1113
List<String> cityNames,
1214
List<String> travelThemes,
1315
List<TripDays> tripDays,
1416
List<String> transportTypes,
1517
String sort,
16-
int offset);
18+
Pageable pageable);
1719
}

src/main/java/org/umc/travlocksserver/domain/template/repository/TemplateExploreRepositoryCustomImpl.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.querydsl.core.types.OrderSpecifier;
55
import com.querydsl.jpa.impl.JPAQueryFactory;
66
import lombok.RequiredArgsConstructor;
7+
import org.springframework.data.domain.Page;
8+
import org.springframework.data.domain.Pageable;
79
import org.springframework.stereotype.Repository;
810
import org.umc.travlocksserver.domain.template.dto.response.TemplateExploreResponseDTO;
911
import org.umc.travlocksserver.domain.template.dto.response.QTemplateExploreResponseDTO;
@@ -24,14 +26,14 @@ public class TemplateExploreRepositoryCustomImpl implements TemplateExploreRepos
2426
private static final int PAGE_SIZE = 9; // 한 페이지당 9개로 고정
2527

2628
@Override
27-
public List<TemplateExploreResponseDTO> findExploreTemplates(
29+
public Page<TemplateExploreResponseDTO> findExploreTemplatesWithPage(
2830
String keyword,
2931
List<String> cityNames,
3032
List<String> travelThemes,
3133
List<TripDays> tripDays,
3234
List<String> transportTypes,
3335
String sort,
34-
int offset) {
36+
Pageable pageable) {
3537
QTemplate t = QTemplate.template;
3638
QMember m = QMember.member;
3739
QTravelTheme tt = QTravelTheme.travelTheme;
@@ -41,7 +43,7 @@ public List<TemplateExploreResponseDTO> findExploreTemplates(
4143
OrderSpecifier<?> orderSpecifier = getOrderSpecifier(t, sort);
4244

4345
// QueryDSL 쿼리 작성
44-
return queryFactory
46+
var query = queryFactory
4547
.select(
4648
new QTemplateExploreResponseDTO(
4749
t.id,
@@ -63,10 +65,16 @@ public List<TemplateExploreResponseDTO> findExploreTemplates(
6365
travelThemesIn(travelThemes, tt),
6466
tripDaysIn(tripDays, t),
6567
transportTypesIn(transportTypes, t))
66-
.offset(offset)
67-
.limit(PAGE_SIZE)
68-
.orderBy(orderSpecifier)
69-
.fetch();
68+
.offset((pageable.getOffset()))
69+
.limit(pageable.getPageSize())
70+
.orderBy(orderSpecifier);
71+
72+
var results = query.fetchResults();
73+
74+
return new org.springframework.data.domain.PageImpl<>(
75+
results.getResults(),
76+
pageable,
77+
results.getTotal());
7078
}
7179

7280
private com.querydsl.core.types.Predicate tripDaysIn(List<TripDays> tripDays, QTemplate t) {

src/main/java/org/umc/travlocksserver/domain/template/service/query/TemplateQueryService.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import lombok.RequiredArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
55
import org.springframework.beans.factory.annotation.Value;
6+
import org.springframework.data.domain.Page;
67
import org.springframework.data.domain.PageRequest;
8+
import org.springframework.data.domain.Pageable;
79
import org.springframework.stereotype.Service;
810
import org.springframework.transaction.annotation.Transactional;
911
import org.umc.travlocksserver.domain.favorite.repository.FavoriteRepository;
@@ -20,6 +22,7 @@
2022
import org.umc.travlocksserver.domain.template.repository.TemplateExploreRepositoryCustom;
2123
import org.umc.travlocksserver.domain.template.repository.TemplateRepository;
2224
import org.umc.travlocksserver.domain.traveltheme.repository.PreferredTravelThemeRepository;
25+
import org.umc.travlocksserver.global.response.PageResponseDTO;
2326
import org.umc.travlocksserver.infra.redis.template.CachedTemplateSuggestions;
2427
import org.umc.travlocksserver.infra.redis.template.TemplateSuggestionCache;
2528

@@ -150,29 +153,23 @@ public TemplateDetailResponseDTO getTemplateDetail(Long templateId, Long memberI
150153
isFavorited);
151154
}
152155

153-
public List<TemplateExploreResponseDTO> exploreTemplates(
156+
public PageResponseDTO<TemplateExploreResponseDTO> exploreTemplatesWithPage(
154157
String keyword,
155158
List<String> cities,
156159
List<String> themes,
157160
List<TripDays> tripDays,
158161
List<String> transportTypes,
159162
String sort,
160-
int page) {
163+
Pageable pageable) {
161164

162-
List<TemplateExploreResponseDTO> result = templateExploreRepositoryCustom.findExploreTemplates(
163-
keyword,
164-
cities,
165-
themes,
166-
tripDays,
167-
transportTypes,
168-
sort,
169-
page * 9);
165+
Page<TemplateExploreResponseDTO> result = templateExploreRepositoryCustom.findExploreTemplatesWithPage(
166+
keyword, cities, themes, tripDays, transportTypes, sort, pageable);
170167

171168
if (result.isEmpty()) {
172169
throw new TemplateException(TemplateErrorCode.TEMPLATE_NO_MATCH);
173170
}
174171

175-
return result;
172+
return PageResponseDTO.from(result);
176173
}
177174

178175
public List<TemplateLatestDTO> getRecentTemplates(Long memberId) {

0 commit comments

Comments
 (0)