From 7c757e79bf2c4d03bc3a1ffd5db4277e744de079 Mon Sep 17 00:00:00 2001 From: Wonjun You <59856002+wonjunYou@users.noreply.github.com> Date: Thu, 29 Aug 2024 23:29:46 +0900 Subject: [PATCH] =?UTF-8?q?[DEV-46]=20=EA=B3=B5=EC=A7=80=EC=82=AC=ED=95=AD?= =?UTF-8?q?=20=EC=A0=84=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20API=20offset=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=20=ED=8E=98=EC=9D=B4=EC=A7=80=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=A0=81=EC=9A=A9=20(#89)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/notice/api/NoticeApi.java | 27 ++++++++++++ .../controller/NoticeApiController.java | 26 +++++------ .../request/GetAllNoticeByPageRequest.java | 22 ++++++++++ .../dto/response/DetailNoticeResponse.java | 38 ---------------- .../response/GetAllNoticeByPageResponse.java | 43 +++++++++++++++++++ .../dto/response/NoticeResponse.java | 24 ++++++++--- .../notice/repository/NoticeRepository.java | 14 ++++++ .../domain/notice/service/NoticeService.java | 21 ++++----- 8 files changed, 145 insertions(+), 70 deletions(-) create mode 100644 src/main/java/ddingdong/ddingdongBE/domain/notice/api/NoticeApi.java create mode 100644 src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/request/GetAllNoticeByPageRequest.java delete mode 100644 src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/response/DetailNoticeResponse.java create mode 100644 src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/response/GetAllNoticeByPageResponse.java diff --git a/src/main/java/ddingdong/ddingdongBE/domain/notice/api/NoticeApi.java b/src/main/java/ddingdong/ddingdongBE/domain/notice/api/NoticeApi.java new file mode 100644 index 00000000..8113d745 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/notice/api/NoticeApi.java @@ -0,0 +1,27 @@ +package ddingdong.ddingdongBE.domain.notice.api; + +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +import ddingdong.ddingdongBE.domain.notice.controller.dto.request.GetAllNoticeByPageRequest; +import ddingdong.ddingdongBE.domain.notice.controller.dto.response.GetAllNoticeByPageResponse; +import ddingdong.ddingdongBE.domain.notice.controller.dto.response.NoticeResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +@Tag(name = "Notice", description = "Notice API") +@RequestMapping(value = "/server/notices", produces = APPLICATION_JSON_VALUE) +public interface NoticeApi { + + @Operation(summary = "공지사항 전체 조회 API") + @GetMapping + GetAllNoticeByPageResponse getAllNotices( + GetAllNoticeByPageRequest request + ); + + @Operation(summary = "공지사항 상세 조회 API") + @GetMapping("/{noticeId}") + NoticeResponse getNoticeDetail(@PathVariable Long noticeId); +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/NoticeApiController.java b/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/NoticeApiController.java index f9eec965..eb2858ca 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/NoticeApiController.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/NoticeApiController.java @@ -1,31 +1,31 @@ package ddingdong.ddingdongBE.domain.notice.controller; -import ddingdong.ddingdongBE.domain.notice.controller.dto.response.DetailNoticeResponse; +import ddingdong.ddingdongBE.domain.notice.api.NoticeApi; +import ddingdong.ddingdongBE.domain.notice.controller.dto.request.GetAllNoticeByPageRequest; +import ddingdong.ddingdongBE.domain.notice.controller.dto.response.GetAllNoticeByPageResponse; import ddingdong.ddingdongBE.domain.notice.controller.dto.response.NoticeResponse; +import ddingdong.ddingdongBE.domain.notice.entity.Notice; import ddingdong.ddingdongBE.domain.notice.service.NoticeService; - import java.util.List; import lombok.RequiredArgsConstructor; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/server/notices") @RequiredArgsConstructor -public class NoticeApiController { +public class NoticeApiController implements NoticeApi { private final NoticeService noticeService; - @GetMapping - public List getAllNotices() { - return noticeService.getAllNotices(); + public GetAllNoticeByPageResponse getAllNotices(GetAllNoticeByPageRequest request) { + List notices = noticeService.getAllNotices( + request.getPage(), + request.getLimit() + ); + + return GetAllNoticeByPageResponse.from(notices); } - @GetMapping("/{noticeId}") - public DetailNoticeResponse getNotice(@PathVariable Long noticeId) { + public NoticeResponse getNoticeDetail(Long noticeId) { return noticeService.getNotice(noticeId); } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/request/GetAllNoticeByPageRequest.java b/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/request/GetAllNoticeByPageRequest.java new file mode 100644 index 00000000..2263d53e --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/request/GetAllNoticeByPageRequest.java @@ -0,0 +1,22 @@ +package ddingdong.ddingdongBE.domain.notice.controller.dto.request; + +import io.swagger.v3.oas.annotations.Parameter; +import lombok.Getter; +import org.springdoc.api.annotations.ParameterObject; + +@Getter +@ParameterObject +public class GetAllNoticeByPageRequest { + + @Parameter(description = "현재 페이지 수") + private int page; + + @Parameter(description = "조회할 페이지 크기", example = "10") + private Integer limit; + + public GetAllNoticeByPageRequest(int page, Integer limit) { + this.page = page; + this.limit = (limit == null) ? 10 : limit; + } +} + diff --git a/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/response/DetailNoticeResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/response/DetailNoticeResponse.java deleted file mode 100644 index d36428f8..00000000 --- a/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/response/DetailNoticeResponse.java +++ /dev/null @@ -1,38 +0,0 @@ -package ddingdong.ddingdongBE.domain.notice.controller.dto.response; - -import ddingdong.ddingdongBE.domain.notice.entity.Notice; -import ddingdong.ddingdongBE.file.dto.FileResponse; -import java.time.LocalDateTime; -import java.util.List; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class DetailNoticeResponse { - - private String title; - - private String content; - - private LocalDateTime createdAt; - - private List imageUrls; - - private List fileUrls; - - public DetailNoticeResponse(String title, String content, LocalDateTime createdAt, List imageUrls, - List fileUrls) { - this.title = title; - this.content = content; - this.createdAt = createdAt; - this.imageUrls = imageUrls; - this.fileUrls = fileUrls; - } - - public static DetailNoticeResponse of(Notice notice, List imageUrls, List fileUrls) { - return new DetailNoticeResponse(notice.getTitle(), notice.getContent(), notice.getCreatedAt(), imageUrls, fileUrls); - } - -} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/response/GetAllNoticeByPageResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/response/GetAllNoticeByPageResponse.java new file mode 100644 index 00000000..fe0c54de --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/response/GetAllNoticeByPageResponse.java @@ -0,0 +1,43 @@ +package ddingdong.ddingdongBE.domain.notice.controller.dto.response; + +import ddingdong.ddingdongBE.domain.notice.entity.Notice; +import java.time.LocalDateTime; +import java.util.List; +import lombok.Builder; + +@Builder +public record GetAllNoticeByPageResponse( + List notices +) { + + public static GetAllNoticeByPageResponse from(List notices) { + List noticeResponses = notices.stream() + .map(NoticeResponseDto::from) + .toList(); + + return GetAllNoticeByPageResponse + .builder() + .notices(noticeResponses) + .build(); + } + + @Builder + public record NoticeResponseDto( + Long id, + String title, + LocalDateTime createdAt + ) { + + public static NoticeResponseDto from(Notice notice) { + return NoticeResponseDto + .builder() + .id(notice.getId()) + .title(notice.getTitle()) + .createdAt(notice.getCreatedAt()) + .build(); + } + + } + +} + diff --git a/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/response/NoticeResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/response/NoticeResponse.java index 42887c99..f6d33c88 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/response/NoticeResponse.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/notice/controller/dto/response/NoticeResponse.java @@ -1,7 +1,9 @@ package ddingdong.ddingdongBE.domain.notice.controller.dto.response; import ddingdong.ddingdongBE.domain.notice.entity.Notice; +import ddingdong.ddingdongBE.file.dto.FileResponse; import java.time.LocalDateTime; +import java.util.List; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -10,20 +12,30 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) public class NoticeResponse { - private Long id; - private String title; + private String content; + private LocalDateTime createdAt; - private NoticeResponse(Long id, String title, LocalDateTime createdAt) { - this.id = id; + private List imageUrls; + + private List fileUrls; + + public NoticeResponse(String title, String content, LocalDateTime createdAt, + List imageUrls, + List fileUrls) { this.title = title; + this.content = content; this.createdAt = createdAt; + this.imageUrls = imageUrls; + this.fileUrls = fileUrls; } - public static NoticeResponse from(Notice notice) { - return new NoticeResponse(notice.getId(), notice.getTitle(), notice.getCreatedAt()); + public static NoticeResponse of(Notice notice, List imageUrls, + List fileUrls) { + return new NoticeResponse(notice.getTitle(), notice.getContent(), notice.getCreatedAt(), + imageUrls, fileUrls); } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/notice/repository/NoticeRepository.java b/src/main/java/ddingdong/ddingdongBE/domain/notice/repository/NoticeRepository.java index 953ae35a..0c4a20c7 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/notice/repository/NoticeRepository.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/notice/repository/NoticeRepository.java @@ -1,10 +1,24 @@ package ddingdong.ddingdongBE.domain.notice.repository; import ddingdong.ddingdongBE.domain.notice.entity.Notice; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @Repository public interface NoticeRepository extends JpaRepository { + @Query( + value = """ + SELECT * + FROM notice AS n + ORDER BY n.id DESC + LIMIT :limit + OFFSET :offsetValue + """, + nativeQuery = true + ) + List findAllByPage(int limit, int offsetValue); + } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/notice/service/NoticeService.java b/src/main/java/ddingdong/ddingdongBE/domain/notice/service/NoticeService.java index 289f9d21..b8801717 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/notice/service/NoticeService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/notice/service/NoticeService.java @@ -1,28 +1,24 @@ package ddingdong.ddingdongBE.domain.notice.service; -import static ddingdong.ddingdongBE.common.exception.ErrorMessage.*; -import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileTypeCategory.*; +import static ddingdong.ddingdongBE.common.exception.ErrorMessage.NO_SUCH_NOTICE; import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileDomainCategory.NOTICE; +import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileTypeCategory.FILE; +import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileTypeCategory.IMAGE; import ddingdong.ddingdongBE.domain.fileinformation.entity.FileInformation; import ddingdong.ddingdongBE.domain.fileinformation.repository.FileInformationRepository; import ddingdong.ddingdongBE.domain.fileinformation.service.FileInformationService; import ddingdong.ddingdongBE.domain.notice.controller.dto.request.RegisterNoticeRequest; import ddingdong.ddingdongBE.domain.notice.controller.dto.request.UpdateNoticeRequest; -import ddingdong.ddingdongBE.domain.notice.controller.dto.response.DetailNoticeResponse; import ddingdong.ddingdongBE.domain.notice.controller.dto.response.NoticeResponse; import ddingdong.ddingdongBE.domain.notice.entity.Notice; import ddingdong.ddingdongBE.domain.notice.repository.NoticeRepository; import ddingdong.ddingdongBE.domain.user.entity.User; import ddingdong.ddingdongBE.file.FileStore; import ddingdong.ddingdongBE.file.dto.FileResponse; - import java.util.List; import java.util.NoSuchElementException; -import java.util.stream.Collectors; - import lombok.RequiredArgsConstructor; - import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -44,21 +40,20 @@ public Long register(User user, RegisterNoticeRequest request) { } @Transactional(readOnly = true) - public List getAllNotices() { - return noticeRepository.findAll().stream() - .map(NoticeResponse::from) - .collect(Collectors.toList()); + public List getAllNotices(int page, int limit) { + int offset = (page - 1) * limit; + return noticeRepository.findAllByPage(limit, offset); } @Transactional(readOnly = true) - public DetailNoticeResponse getNotice(Long noticeId) { + public NoticeResponse getNotice(Long noticeId) { Notice notice = noticeRepository.findById(noticeId) .orElseThrow(() -> new NoSuchElementException(NO_SUCH_NOTICE.getText())); List imageUrls = fileInformationService.getImageUrls(IMAGE.getFileType() + NOTICE.getFileDomain() + noticeId); List fileUrls = fileInformationService.getFileUrls(FILE.getFileType() + NOTICE.getFileDomain() + noticeId); - return DetailNoticeResponse.of(notice, imageUrls, fileUrls); + return NoticeResponse.of(notice, imageUrls, fileUrls); } public void update(Long noticeId, UpdateNoticeRequest request) {