diff --git a/src/main/java/com/genius/gitget/challenge/certification/controller/CertificationController.java b/src/main/java/com/genius/gitget/challenge/certification/controller/CertificationController.java index 07f32680..dd5623dd 100644 --- a/src/main/java/com/genius/gitget/challenge/certification/controller/CertificationController.java +++ b/src/main/java/com/genius/gitget/challenge/certification/controller/CertificationController.java @@ -17,6 +17,7 @@ import com.genius.gitget.challenge.participant.service.ParticipantService; import com.genius.gitget.challenge.user.domain.User; import com.genius.gitget.challenge.user.service.UserService; +import com.genius.gitget.global.page.LimitedSizePagination; import com.genius.gitget.global.security.domain.UserPrincipal; import com.genius.gitget.global.util.response.dto.SingleResponse; import com.genius.gitget.global.util.response.dto.SlicingResponse; @@ -101,6 +102,7 @@ public ResponseEntity> getWeekCertification( } @GetMapping("/week/all/{instanceId}") + @LimitedSizePagination public ResponseEntity> getAllUserWeekCertification( @AuthenticationPrincipal UserPrincipal userPrincipal, @PathVariable Long instanceId, diff --git a/src/main/java/com/genius/gitget/challenge/instance/controller/InstanceController.java b/src/main/java/com/genius/gitget/challenge/instance/controller/InstanceController.java index 9cb794a4..ed9a082a 100644 --- a/src/main/java/com/genius/gitget/challenge/instance/controller/InstanceController.java +++ b/src/main/java/com/genius/gitget/challenge/instance/controller/InstanceController.java @@ -10,6 +10,7 @@ import com.genius.gitget.challenge.instance.dto.crud.InstancePagingResponse; import com.genius.gitget.challenge.instance.dto.crud.InstanceUpdateRequest; import com.genius.gitget.challenge.instance.facade.InstanceFacade; +import com.genius.gitget.global.page.LimitedSizePagination; import com.genius.gitget.global.util.response.dto.CommonResponse; import com.genius.gitget.global.util.response.dto.PagingResponse; import com.genius.gitget.global.util.response.dto.SingleResponse; @@ -82,6 +83,7 @@ public ResponseEntity> getInstanceById(@P } // 인스턴스 리스트 조회 + @LimitedSizePagination @GetMapping("/instance") public ResponseEntity> getAllInstances( @PageableDefault(size = 5, direction = Sort.Direction.ASC, sort = "id") Pageable pageable) { @@ -93,6 +95,7 @@ public ResponseEntity> getAllInstances( } // 특정 토픽에 대한 리스트 조회 + @LimitedSizePagination @GetMapping("topic/instances/{id}") public ResponseEntity> getAllInstancesOfSpecificTopic( @PageableDefault Pageable pageable, @PathVariable Long id) { diff --git a/src/main/java/com/genius/gitget/challenge/instance/controller/InstanceHomeController.java b/src/main/java/com/genius/gitget/challenge/instance/controller/InstanceHomeController.java index f0f83a3b..fe52f107 100644 --- a/src/main/java/com/genius/gitget/challenge/instance/controller/InstanceHomeController.java +++ b/src/main/java/com/genius/gitget/challenge/instance/controller/InstanceHomeController.java @@ -6,6 +6,7 @@ import com.genius.gitget.challenge.instance.dto.search.InstanceSearchRequest; import com.genius.gitget.challenge.instance.dto.search.InstanceSearchResponse; import com.genius.gitget.challenge.instance.facade.InstanceHomeFacade; +import com.genius.gitget.global.page.LimitedSizePagination; import com.genius.gitget.global.security.domain.UserPrincipal; import com.genius.gitget.global.util.exception.SuccessCode; import com.genius.gitget.global.util.response.dto.PagingResponse; @@ -31,6 +32,7 @@ public class InstanceHomeController { private final InstanceHomeFacade instanceHomeFacade; + @LimitedSizePagination @PostMapping("/search") public ResponseEntity> searchInstances( @RequestBody InstanceSearchRequest instanceSearchRequest, Pageable pageable) { @@ -43,6 +45,7 @@ public ResponseEntity> searchInstances( ); } + @LimitedSizePagination @GetMapping("/recommend") public ResponseEntity> getRecommendInstances( Pageable pageable, @@ -58,6 +61,7 @@ public ResponseEntity> getRecommendInstanc ); } + @LimitedSizePagination @GetMapping("/popular") public ResponseEntity> getPopularInstances(Pageable pageable) { PageRequest pageRequest = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), @@ -70,6 +74,7 @@ public ResponseEntity> getPopularInstances ); } + @LimitedSizePagination @GetMapping("/latest") public ResponseEntity> getLatestInstances(Pageable pageable) { PageRequest pageRequest = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), diff --git a/src/main/java/com/genius/gitget/challenge/likes/controller/LikesController.java b/src/main/java/com/genius/gitget/challenge/likes/controller/LikesController.java index 95fb667a..45ee554e 100644 --- a/src/main/java/com/genius/gitget/challenge/likes/controller/LikesController.java +++ b/src/main/java/com/genius/gitget/challenge/likes/controller/LikesController.java @@ -4,6 +4,7 @@ import com.genius.gitget.challenge.likes.dto.UserLikesAddResponse; import com.genius.gitget.challenge.likes.dto.UserLikesResponse; import com.genius.gitget.challenge.likes.facade.LikesFacade; +import com.genius.gitget.global.page.LimitedSizePagination; import com.genius.gitget.global.security.domain.UserPrincipal; import com.genius.gitget.global.util.exception.SuccessCode; import com.genius.gitget.global.util.response.dto.CommonResponse; @@ -32,6 +33,7 @@ public class LikesController { private final LikesFacade likesFacade; // 좋아요 목록 조회 + @LimitedSizePagination @GetMapping("/likes") public ResponseEntity> getLikesListOfUser( Pageable pageable, diff --git a/src/main/java/com/genius/gitget/global/page/CustomPageImpl.java b/src/main/java/com/genius/gitget/global/page/CustomPageImpl.java new file mode 100644 index 00000000..c69ea0b3 --- /dev/null +++ b/src/main/java/com/genius/gitget/global/page/CustomPageImpl.java @@ -0,0 +1,42 @@ +package com.genius.gitget.global.page; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class CustomPageImpl extends PageImpl { + + @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) + public CustomPageImpl(@JsonProperty("content") List content, @JsonProperty("number") int number, + @JsonProperty("size") int size, + @JsonProperty("totalElements") Long totalElements, @JsonProperty("pageable") JsonNode pageable, + @JsonProperty("last") boolean last, + @JsonProperty("totalPages") int totalPages, @JsonProperty("sort") JsonNode sort, + @JsonProperty("first") boolean first, + @JsonProperty("numberOfElements") int numberOfElements) { + super(content, PageRequest.of(number, size), totalElements); + } + + public CustomPageImpl(List content, Pageable pageable, Long total) { + super(content, pageable, total); + } + + public CustomPageImpl(List content) { + super(content); + } + + public CustomPageImpl() { + super(new ArrayList()); + } +} + diff --git a/src/main/java/com/genius/gitget/global/page/LimitedSizePagination.java b/src/main/java/com/genius/gitget/global/page/LimitedSizePagination.java new file mode 100644 index 00000000..e7ac8f3f --- /dev/null +++ b/src/main/java/com/genius/gitget/global/page/LimitedSizePagination.java @@ -0,0 +1,19 @@ +package com.genius.gitget.global.page; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import jakarta.validation.constraints.Positive; + +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface LimitedSizePagination { + @Positive + int maxSize() default 200; +} + diff --git a/src/main/java/com/genius/gitget/store/payment/controller/PaymentController.java b/src/main/java/com/genius/gitget/store/payment/controller/PaymentController.java index 99017a14..97aaa441 100644 --- a/src/main/java/com/genius/gitget/store/payment/controller/PaymentController.java +++ b/src/main/java/com/genius/gitget/store/payment/controller/PaymentController.java @@ -1,5 +1,6 @@ package com.genius.gitget.store.payment.controller; +import com.genius.gitget.global.page.LimitedSizePagination; import com.genius.gitget.global.security.domain.UserPrincipal; import com.genius.gitget.global.util.exception.SuccessCode; import com.genius.gitget.global.util.response.dto.PagingResponse; @@ -25,6 +26,7 @@ public class PaymentController { private final PaymentService paymentService; @GetMapping + @LimitedSizePagination public ResponseEntity> getPaymentDetails(@AuthenticationPrincipal UserPrincipal userPrincipal, @PageableDefault diff --git a/src/main/java/com/genius/gitget/topic/controller/TopicController.java b/src/main/java/com/genius/gitget/topic/controller/TopicController.java index 85d36eb4..32fa180e 100644 --- a/src/main/java/com/genius/gitget/topic/controller/TopicController.java +++ b/src/main/java/com/genius/gitget/topic/controller/TopicController.java @@ -3,6 +3,7 @@ import static com.genius.gitget.global.util.exception.SuccessCode.CREATED; import static com.genius.gitget.global.util.exception.SuccessCode.SUCCESS; +import com.genius.gitget.global.page.LimitedSizePagination; import com.genius.gitget.global.util.response.dto.CommonResponse; import com.genius.gitget.global.util.response.dto.PagingResponse; import com.genius.gitget.global.util.response.dto.SingleResponse; @@ -34,6 +35,7 @@ public class TopicController { private final TopicFacade topicFacade; // 토픽 리스트 요청 + @LimitedSizePagination @GetMapping public ResponseEntity> getAllTopics( @PageableDefault(size = 5, direction = Sort.Direction.ASC) Pageable pageable) { diff --git a/src/test/java/com/genius/gitget/paging/CustomPageImpl.java b/src/test/java/com/genius/gitget/paging/CustomPageImpl.java new file mode 100644 index 00000000..1f22ea6a --- /dev/null +++ b/src/test/java/com/genius/gitget/paging/CustomPageImpl.java @@ -0,0 +1,43 @@ +package com.genius.gitget.paging; + + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.springframework.data.domain.PageRequest; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.genius.gitget.global.page.CustomPageImpl; + +public class CustomPageImplTest { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Test + public void testCustomPageImplSerialization() throws JsonProcessingException { + + // 데이터 목록과 페이지 정보를 설정 + List data = List.of("item1", "item2", "item3"); + PageRequest pageRequest = PageRequest.of(0, 10); + + // CustomPageImpl 객체 생성 + CustomPageImpl customPage = new CustomPageImpl<>(data, pageRequest, 3L); + + // CustomPageImpl 객체를 JSON으로 직렬화 + String json = objectMapper.writeValueAsString(customPage); + + System.out.println(json); + + // JSON 문자열을 다시 CustomPageImpl 객체로 역직렬화 + CustomPageImpl deserializedPage = objectMapper.readValue(json, CustomPageImpl.class); + + assertNotNull(deserializedPage); + assertEquals(customPage.getContent(), deserializedPage.getContent()); + assertEquals(customPage.getTotalElements(), deserializedPage.getTotalElements()); + assertEquals(customPage.getPageable().getPageNumber(), deserializedPage.getPageable().getPageNumber()); + } +} +