From 4ff7efdd12657006a09d4cc092890ca02e9e474a Mon Sep 17 00:00:00 2001 From: huncozyboy Date: Wed, 13 Aug 2025 22:04:16 +0900 Subject: [PATCH 1/7] =?UTF-8?q?refactor=20:=20=EA=B5=90=EC=9C=A1=EC=9E=90?= =?UTF-8?q?=EB=A3=8C=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=EC=97=90?= =?UTF-8?q?=EC=84=9C=EB=8F=84=20Part=EB=B3=84=20=ED=95=84=ED=84=B0?= =?UTF-8?q?=EB=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/usecase/PostUseCaseImpl.java | 11 +++--- .../application/usecase/PostUsecase.java | 2 +- .../domain/repository/PostRepository.java | 36 ++++++++++++++++--- .../board/domain/service/PostFindService.java | 18 +++++----- .../board/presentation/PostController.java | 4 +-- 5 files changed, 50 insertions(+), 21 deletions(-) diff --git a/src/main/java/leets/weeth/domain/board/application/usecase/PostUseCaseImpl.java b/src/main/java/leets/weeth/domain/board/application/usecase/PostUseCaseImpl.java index b62887fb..7ea5e28f 100644 --- a/src/main/java/leets/weeth/domain/board/application/usecase/PostUseCaseImpl.java +++ b/src/main/java/leets/weeth/domain/board/application/usecase/PostUseCaseImpl.java @@ -125,22 +125,21 @@ public Slice findPartPosts(PartPostDTO dto, int pageNumber, } @Override - public Slice findEducationPosts(Long userId, Integer cardinalNumber, int pageNumber, int pageSize) { + public Slice findEducationPosts(Long userId, Part part, Integer cardinalNumber, int pageNumber, int pageSize) { User user = userGetService.find(userId); + Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.DESC, "id")); if (user.hasRole(Role.ADMIN)) { - return postFindService.findByCategory(Category.Education, pageNumber, pageSize) + return postFindService.findByCategory(part, Category.Education, pageNumber, pageSize) .map(post -> mapper.toEducationAll(post, checkFileExistsByPost(post.getId()))); } - Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.DESC, "id")); - if (cardinalNumber != null) { if (userCardinalGetService.notContains(user, cardinalGetService.findByUserSide(cardinalNumber))) { return new SliceImpl<>(Collections.emptyList(), pageable, false); } - Slice posts = postFindService.findEducationByCardinal(cardinalNumber, pageable); + Slice posts = postFindService.findEducationByCardinal(part, cardinalNumber, pageable); return posts.map(post -> mapper.toEducationAll(post, checkFileExistsByPost(post.getId()))); } @@ -148,7 +147,7 @@ public Slice findEducationPosts(Long userId, Integ if (userCardinals.isEmpty()) { return new SliceImpl<>(Collections.emptyList(), pageable, false); } - Slice posts = postFindService.findEducationByCardinals(userCardinals, pageable); + Slice posts = postFindService.findEducationByCardinals(part, userCardinals, pageable); return posts.map(post -> mapper.toEducationAll(post, checkFileExistsByPost(post.getId()))); } diff --git a/src/main/java/leets/weeth/domain/board/application/usecase/PostUsecase.java b/src/main/java/leets/weeth/domain/board/application/usecase/PostUsecase.java index fbf3ced6..f7c583db 100644 --- a/src/main/java/leets/weeth/domain/board/application/usecase/PostUsecase.java +++ b/src/main/java/leets/weeth/domain/board/application/usecase/PostUsecase.java @@ -19,7 +19,7 @@ public interface PostUsecase { Slice findPartPosts(PartPostDTO dto, int pageNumber, int pageSize); - Slice findEducationPosts(Long userId, Integer cardinalNumber, int pageNumber, int pageSize); + Slice findEducationPosts(Long userId, Part part, Integer cardinalNumber, int pageNumber, int pageSize); PostDTO.ResponseStudyNames findStudyNames(Part part); diff --git a/src/main/java/leets/weeth/domain/board/domain/repository/PostRepository.java b/src/main/java/leets/weeth/domain/board/domain/repository/PostRepository.java index 2fe86f81..bdf1921f 100644 --- a/src/main/java/leets/weeth/domain/board/domain/repository/PostRepository.java +++ b/src/main/java/leets/weeth/domain/board/domain/repository/PostRepository.java @@ -38,18 +38,46 @@ public interface PostRepository extends JpaRepository { """) Slice findByPartAndOptionalFilters(@Param("part") Part part, @Param("category") Category category, @Param("cardinal") Integer cardinal, @Param("studyName") String studyName, @Param("week") Integer week, Pageable pageable); - Slice findByCategoryAndCardinalNumber(Category category, Integer cardinalNumber, Pageable pageable); + @Query(""" + SELECT p + FROM Post p + WHERE p.category = :category + AND ( + :partName = 'ALL' + OR FUNCTION('FIND_IN_SET', :partName, FUNCTION('REPLACE', p.parts, ' ', '')) > 0 + OR FUNCTION('FIND_IN_SET', 'ALL', FUNCTION('REPLACE', p.parts, ' ', '')) > 0 + ) + ORDER BY p.id DESC + """) + Slice findByCategoryWithPart(@Param("partName") String partName, @Param("category") Category category, Pageable pageable); @Query(""" SELECT p FROM Post p WHERE p.category = :category - AND p.cardinalNumber IN :cardinals + AND p.cardinalNumber = :cardinal + AND ( + :partName = 'ALL' + OR FUNCTION('FIND_IN_SET', :partName, FUNCTION('REPLACE', p.parts, ' ', '')) > 0 + OR FUNCTION('FIND_IN_SET', 'ALL', FUNCTION('REPLACE', p.parts, ' ', '')) > 0 + ) ORDER BY p.id DESC """) - Slice findByCategoryAndCardinalIn(@Param("category") Category category, @Param("cardinals") Collection cardinals, Pageable pageable); + Slice findByCategoryAndCardinalNumberWithPart(@Param("partName") String partName, @Param("category") Category category, @Param("cardinal") Integer cardinal, Pageable pageable); - Slice findByCategory(Category category, Pageable pageable); + @Query(""" + SELECT p + FROM Post p + WHERE p.category = :category + AND p.cardinalNumber IN :cardinals + AND ( + :partName = 'ALL' + OR FUNCTION('FIND_IN_SET', :partName, FUNCTION('REPLACE', p.parts, ' ', '')) > 0 + OR FUNCTION('FIND_IN_SET', 'ALL', FUNCTION('REPLACE', p.parts, ' ', '')) > 0 + ) + ORDER BY p.id DESC + """) + Slice findByCategoryAndCardinalInWithPart(@Param("partName") String partName, @Param("category") Category category, @Param("cardinals") Collection cardinals, Pageable pageable); Slice findByTitleContainingOrContentContainingIgnoreCase(String keyword1, String keyword2, Pageable pageable); } diff --git a/src/main/java/leets/weeth/domain/board/domain/service/PostFindService.java b/src/main/java/leets/weeth/domain/board/domain/service/PostFindService.java index f8565f6f..03e8579c 100644 --- a/src/main/java/leets/weeth/domain/board/domain/service/PostFindService.java +++ b/src/main/java/leets/weeth/domain/board/domain/service/PostFindService.java @@ -46,24 +46,26 @@ public Slice findByPartAndOptionalFilters(Part part, Category category, In ); } - public Slice findEducationByCardinals(Collection cardinals, Pageable pageable) { + public Slice findEducationByCardinals(Part part, Collection cardinals, Pageable pageable) { if (cardinals == null || cardinals.isEmpty()) { return new SliceImpl<>(Collections.emptyList(), pageable, false); } - return postRepository.findByCategoryAndCardinalIn(Category.Education, cardinals, pageable); + String partName = (part != null ? part.name() : Part.ALL.name()); + + return postRepository.findByCategoryAndCardinalInWithPart(partName, Category.Education, cardinals, pageable); } - public Slice findEducationByCardinal(int cardinalNumber, Pageable pageable) { + public Slice findEducationByCardinal(Part part, int cardinalNumber, Pageable pageable) { + String partName = (part != null ? part.name() : Part.ALL.name()); - return postRepository.findByCategoryAndCardinalNumber( - Category.Education, cardinalNumber, pageable - ); + return postRepository.findByCategoryAndCardinalNumberWithPart(partName, Category.Education, cardinalNumber, pageable); } - public Slice findByCategory(Category category, int pageNumber, int pageSize) { + public Slice findByCategory(Part part, Category category, int pageNumber, int pageSize) { Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.DESC, "id")); + String partName = (part != null ? part.name() : Part.ALL.name()); - return postRepository.findByCategory(category, pageable); + return postRepository.findByCategoryWithPart(partName, category, pageable); } public Slice search(String keyword, Pageable pageable) { diff --git a/src/main/java/leets/weeth/domain/board/presentation/PostController.java b/src/main/java/leets/weeth/domain/board/presentation/PostController.java index 77d07316..589133e4 100644 --- a/src/main/java/leets/weeth/domain/board/presentation/PostController.java +++ b/src/main/java/leets/weeth/domain/board/presentation/PostController.java @@ -65,9 +65,9 @@ public CommonResponse> findPartPosts(@ModelAttribute @GetMapping("/education") @Operation(summary="교육자료 조회 [무한스크롤]") - public CommonResponse> findEducationMaterials(@RequestParam(required = false) Integer cardinalNumber, @RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize, @Parameter(hidden = true) @CurrentUser Long userId) { + public CommonResponse> findEducationMaterials(@RequestParam Part part, @RequestParam(required = false) Integer cardinalNumber, @RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize, @Parameter(hidden = true) @CurrentUser Long userId) { - return CommonResponse.createSuccess(POST_EDU_FIND_SUCCESS.getMessage(), postUsecase.findEducationPosts(userId, cardinalNumber, pageNumber, pageSize)); + return CommonResponse.createSuccess(POST_EDU_FIND_SUCCESS.getMessage(), postUsecase.findEducationPosts(userId, part, cardinalNumber, pageNumber, pageSize)); } @GetMapping("/{boardId}") From f45c5aabad193e29977c0bdd60e056a3d264e499 Mon Sep 17 00:00:00 2001 From: huncozyboy Date: Wed, 13 Aug 2025 22:08:41 +0900 Subject: [PATCH 2/7] =?UTF-8?q?refactor=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20REPLACE=20=EC=A0=9C=EA=B1=B0=ED=95=B4=EC=84=9C=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EA=B0=84=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/domain/repository/PostRepository.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/leets/weeth/domain/board/domain/repository/PostRepository.java b/src/main/java/leets/weeth/domain/board/domain/repository/PostRepository.java index bdf1921f..766486aa 100644 --- a/src/main/java/leets/weeth/domain/board/domain/repository/PostRepository.java +++ b/src/main/java/leets/weeth/domain/board/domain/repository/PostRepository.java @@ -44,8 +44,8 @@ public interface PostRepository extends JpaRepository { WHERE p.category = :category AND ( :partName = 'ALL' - OR FUNCTION('FIND_IN_SET', :partName, FUNCTION('REPLACE', p.parts, ' ', '')) > 0 - OR FUNCTION('FIND_IN_SET', 'ALL', FUNCTION('REPLACE', p.parts, ' ', '')) > 0 + OR FUNCTION('FIND_IN_SET', :partName, p.parts) > 0 + OR FUNCTION('FIND_IN_SET', 'ALL', p.parts) > 0 ) ORDER BY p.id DESC """) @@ -58,8 +58,8 @@ OR FUNCTION('FIND_IN_SET', 'ALL', FUNCTION('REPLACE', p.parts, ' ', '')) > 0 AND p.cardinalNumber = :cardinal AND ( :partName = 'ALL' - OR FUNCTION('FIND_IN_SET', :partName, FUNCTION('REPLACE', p.parts, ' ', '')) > 0 - OR FUNCTION('FIND_IN_SET', 'ALL', FUNCTION('REPLACE', p.parts, ' ', '')) > 0 + OR FUNCTION('FIND_IN_SET', :partName, p.parts) > 0 + OR FUNCTION('FIND_IN_SET', 'ALL', p.parts) > 0 ) ORDER BY p.id DESC """) @@ -72,8 +72,8 @@ OR FUNCTION('FIND_IN_SET', 'ALL', FUNCTION('REPLACE', p.parts, ' ', '')) > 0 AND p.cardinalNumber IN :cardinals AND ( :partName = 'ALL' - OR FUNCTION('FIND_IN_SET', :partName, FUNCTION('REPLACE', p.parts, ' ', '')) > 0 - OR FUNCTION('FIND_IN_SET', 'ALL', FUNCTION('REPLACE', p.parts, ' ', '')) > 0 + OR FUNCTION('FIND_IN_SET', :partName, p.parts) > 0 + OR FUNCTION('FIND_IN_SET', 'ALL', p.parts) > 0 ) ORDER BY p.id DESC """) From edc2e57b7a80cd03ec4dd8950ae8a5ae11c399a0 Mon Sep 17 00:00:00 2001 From: huncozyboy Date: Wed, 13 Aug 2025 23:02:20 +0900 Subject: [PATCH 3/7] =?UTF-8?q?refactor=20:=20=ED=8C=8C=ED=8A=B8=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20/=20=EA=B5=90=EC=9C=A1=EC=9E=90?= =?UTF-8?q?=EB=A3=8C=20=EA=B2=80=EC=83=89=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/board/presentation/PostController.java | 15 ++++++++++++--- .../board/presentation/ResponseMessage.java | 5 ++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/leets/weeth/domain/board/presentation/PostController.java b/src/main/java/leets/weeth/domain/board/presentation/PostController.java index 589133e4..9908980d 100644 --- a/src/main/java/leets/weeth/domain/board/presentation/PostController.java +++ b/src/main/java/leets/weeth/domain/board/presentation/PostController.java @@ -1,11 +1,13 @@ package leets.weeth.domain.board.presentation; +import static leets.weeth.domain.board.presentation.ResponseMessage.EDUCATION_SEARCH_SUCCESS; import static leets.weeth.domain.board.presentation.ResponseMessage.POST_CREATED_SUCCESS; import static leets.weeth.domain.board.presentation.ResponseMessage.POST_DELETED_SUCCESS; import static leets.weeth.domain.board.presentation.ResponseMessage.POST_EDU_FIND_SUCCESS; import static leets.weeth.domain.board.presentation.ResponseMessage.POST_FIND_ALL_SUCCESS; import static leets.weeth.domain.board.presentation.ResponseMessage.POST_FIND_BY_ID_SUCCESS; import static leets.weeth.domain.board.presentation.ResponseMessage.POST_PART_FIND_ALL_SUCCESS; +import static leets.weeth.domain.board.presentation.ResponseMessage.POST_SEARCH_SUCCESS; import static leets.weeth.domain.board.presentation.ResponseMessage.POST_UPDATED_SUCCESS; import io.swagger.v3.oas.annotations.Operation; @@ -83,11 +85,18 @@ public CommonResponse findStudyNames(@RequestParam P return CommonResponse.createSuccess(ResponseMessage.POST_STUDY_NAMES_FIND_SUCCESS.getMessage(), postUsecase.findStudyNames(part)); } - @GetMapping("/search") - @Operation(summary="게시글 검색 [무한스크롤]") + @GetMapping("/search/part") + @Operation(summary="파트 게시글 검색 [무한스크롤]") public CommonResponse> findPost(@RequestParam String keyword, @RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize) { - return CommonResponse.createSuccess(POST_FIND_BY_ID_SUCCESS.getMessage(),postUsecase.searchPost(keyword, pageNumber, pageSize)); + return CommonResponse.createSuccess(POST_SEARCH_SUCCESS.getMessage(),postUsecase.searchPost(keyword, pageNumber, pageSize)); + } + + @GetMapping("/search/education") + @Operation(summary="교육자료 검색 [무한스크롤]") + public CommonResponse> findEducation(@RequestParam String keyword, @RequestParam("pageNumber") int pageNumber, + @RequestParam("pageSize") int pageSize) { + return CommonResponse.createSuccess(EDUCATION_SEARCH_SUCCESS.getMessage(),postUsecase.searchEducation(keyword, pageNumber, pageSize)); } @PatchMapping(value = "/{boardId}/part") diff --git a/src/main/java/leets/weeth/domain/board/presentation/ResponseMessage.java b/src/main/java/leets/weeth/domain/board/presentation/ResponseMessage.java index f4c2bf5b..58eb4ad8 100644 --- a/src/main/java/leets/weeth/domain/board/presentation/ResponseMessage.java +++ b/src/main/java/leets/weeth/domain/board/presentation/ResponseMessage.java @@ -12,6 +12,7 @@ public enum ResponseMessage { //NoticeController 관련 NOTICE_FIND_ALL_SUCCESS("공지사항 목록이 성공적으로 조회되었습니다."), NOTICE_FIND_BY_ID_SUCCESS("공지사항이 성공적으로 조회되었습니다."), + NOTICE_SEARCH_SUCCESS("공지사항 검색 결과가 성공적으로 조회되었습니다."), //PostController 관련 POST_CREATED_SUCCESS("게시글이 성공적으로 생성되었습니다."), POST_UPDATED_SUCCESS("파트 게시글이 성공적으로 수정되었습니다."), @@ -19,7 +20,9 @@ public enum ResponseMessage { POST_FIND_ALL_SUCCESS("게시글 목록이 성공적으로 조회되었습니다."), POST_PART_FIND_ALL_SUCCESS("파트별 게시글 목록이 성공적으로 조회되었습니다."), POST_EDU_FIND_SUCCESS("교육 게시글 목록이 성공적으로 조회되었습니다."), - POST_FIND_BY_ID_SUCCESS("게시글이 성공적으로 조회되었습니다."), + POST_FIND_BY_ID_SUCCESS("파트 게시글이 성공적으로 조회되었습니다."), + POST_SEARCH_SUCCESS("파트 게시글 검색 결과가 성공적으로 조회되었습니다."), + EDUCATION_SEARCH_SUCCESS("교육 자료 검색 결과가 성공적으로 조회되었습니다."), POST_STUDY_NAMES_FIND_SUCCESS("스터디 이름 목록이 성공적으로 조회되었습니다."), EDUCATION_UPDATED_SUCCESS("교육자료가 성공적으로 수정되었습니다."); From f0dab3616fc531af1214fd165240644f7cb6607b Mon Sep 17 00:00:00 2001 From: huncozyboy Date: Wed, 13 Aug 2025 23:02:47 +0900 Subject: [PATCH 4/7] =?UTF-8?q?refactor=20:=20=ED=8C=8C=ED=8A=B8=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EB=B0=98=ED=99=98=20DTO=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leets/weeth/domain/board/application/dto/PostDTO.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/leets/weeth/domain/board/application/dto/PostDTO.java b/src/main/java/leets/weeth/domain/board/application/dto/PostDTO.java index aa27c830..ced6270e 100644 --- a/src/main/java/leets/weeth/domain/board/application/dto/PostDTO.java +++ b/src/main/java/leets/weeth/domain/board/application/dto/PostDTO.java @@ -79,6 +79,7 @@ public record Response( public record ResponseAll( Long id, String name, + Part part, Position position, Role role, String title, From 65da2b805ea04879a7e95211d074c7195d2662cc Mon Sep 17 00:00:00 2001 From: huncozyboy Date: Wed, 13 Aug 2025 23:03:02 +0900 Subject: [PATCH 5/7] =?UTF-8?q?refactor=20:=20=ED=8C=8C=ED=8A=B8=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EA=B2=80=EC=83=89,=20=EA=B5=90?= =?UTF-8?q?=EC=9C=A1=EC=9E=90=EB=A3=8C=20=EA=B2=80=EC=83=89=20=EB=B9=84?= =?UTF-8?q?=EC=A6=88=EB=8B=88=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/usecase/PostUseCaseImpl.java | 16 +++++++ .../application/usecase/PostUsecase.java | 2 + .../domain/repository/PostRepository.java | 44 +++++++++++++++++-- .../board/domain/service/PostFindService.java | 30 ++++++++----- 4 files changed, 78 insertions(+), 14 deletions(-) diff --git a/src/main/java/leets/weeth/domain/board/application/usecase/PostUseCaseImpl.java b/src/main/java/leets/weeth/domain/board/application/usecase/PostUseCaseImpl.java index 7ea5e28f..4ba68201 100644 --- a/src/main/java/leets/weeth/domain/board/application/usecase/PostUseCaseImpl.java +++ b/src/main/java/leets/weeth/domain/board/application/usecase/PostUseCaseImpl.java @@ -175,6 +175,22 @@ public Slice searchPost(String keyword, int pageNumber, int return posts.map(post->mapper.toAll(post, checkFileExistsByPost(post.id))); } + @Override + public Slice searchEducation(String keyword, int pageNumber, int pageSize) { + validatePageNumber(pageNumber); + + keyword = keyword.strip(); + + Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.DESC, "id")); + Slice posts = postFindService.searchEducation(keyword, pageable); + + if(posts.isEmpty()){ + throw new NoSearchResultException(); + } + + return posts.map(post->mapper.toEducationAll(post, checkFileExistsByPost(post.id))); + } + @Override @Transactional public void update(Long postId, PostDTO.Update dto, Long userId) { diff --git a/src/main/java/leets/weeth/domain/board/application/usecase/PostUsecase.java b/src/main/java/leets/weeth/domain/board/application/usecase/PostUsecase.java index f7c583db..c2acb2e4 100644 --- a/src/main/java/leets/weeth/domain/board/application/usecase/PostUsecase.java +++ b/src/main/java/leets/weeth/domain/board/application/usecase/PostUsecase.java @@ -30,4 +30,6 @@ public interface PostUsecase { void delete(Long postId, Long userId) throws UserNotMatchException; Slice searchPost(String keyword, int pageNumber, int pageSize); + + Slice searchEducation(String keyword, int pageNumber, int pageSize); } diff --git a/src/main/java/leets/weeth/domain/board/domain/repository/PostRepository.java b/src/main/java/leets/weeth/domain/board/domain/repository/PostRepository.java index 766486aa..3070876d 100644 --- a/src/main/java/leets/weeth/domain/board/domain/repository/PostRepository.java +++ b/src/main/java/leets/weeth/domain/board/domain/repository/PostRepository.java @@ -14,7 +14,47 @@ public interface PostRepository extends JpaRepository { - Slice findPageBy(Pageable page); + @Query(""" + SELECT p FROM Post p + WHERE p.category IN ( + leets.weeth.domain.board.domain.entity.enums.Category.StudyLog, + leets.weeth.domain.board.domain.entity.enums.Category.Article + ) + ORDER BY p.id DESC + """) + Slice findRecentPart(Pageable pageable); + + @Query(""" + SELECT p FROM Post p + WHERE p.category = leets.weeth.domain.board.domain.entity.enums.Category.Education + ORDER BY p.id DESC + """) + Slice findRecentEducation(Pageable pageable); + + @Query(""" + SELECT p FROM Post p + WHERE p.category IN ( + leets.weeth.domain.board.domain.entity.enums.Category.StudyLog, + leets.weeth.domain.board.domain.entity.enums.Category.Article + ) + AND ( + LOWER(p.title) LIKE LOWER(CONCAT('%', :kw, '%')) + OR LOWER(p.content) LIKE LOWER(CONCAT('%', :kw, '%')) + ) + ORDER BY p.id DESC + """) + Slice searchPart(@Param("kw") String kw, Pageable pageable); + + @Query(""" + SELECT p FROM Post p + WHERE p.category = leets.weeth.domain.board.domain.entity.enums.Category.Education + AND ( + LOWER(p.title) LIKE LOWER(CONCAT('%', :kw, '%')) + OR LOWER(p.content) LIKE LOWER(CONCAT('%', :kw, '%')) + ) + ORDER BY p.id DESC + """) + Slice searchEducation(@Param("kw") String kw, Pageable pageable); @Query(""" SELECT DISTINCT p.studyName @@ -78,6 +118,4 @@ OR FUNCTION('FIND_IN_SET', 'ALL', p.parts) > 0 ORDER BY p.id DESC """) Slice findByCategoryAndCardinalInWithPart(@Param("partName") String partName, @Param("category") Category category, @Param("cardinals") Collection cardinals, Pageable pageable); - - Slice findByTitleContainingOrContentContainingIgnoreCase(String keyword1, String keyword2, Pageable pageable); } diff --git a/src/main/java/leets/weeth/domain/board/domain/service/PostFindService.java b/src/main/java/leets/weeth/domain/board/domain/service/PostFindService.java index 03e8579c..4576d04e 100644 --- a/src/main/java/leets/weeth/domain/board/domain/service/PostFindService.java +++ b/src/main/java/leets/weeth/domain/board/domain/service/PostFindService.java @@ -36,7 +36,25 @@ public List findByPart(Part part) { } public Slice findRecentPosts(Pageable pageable) { - return postRepository.findPageBy(pageable); + return postRepository.findRecentPart(pageable); + } + + public Slice findRecentEducationPosts(Pageable pageable) { + return postRepository.findRecentEducation(pageable); + } + + public Slice search(String keyword, Pageable pageable) { + if(keyword == null || keyword.isEmpty()){ + return findRecentPosts(pageable); + } + return postRepository.searchPart(keyword.strip(), pageable); + } + + public Slice searchEducation(String keyword, Pageable pageable) { + if(keyword == null || keyword.isEmpty()){ + return findRecentEducationPosts(pageable); + } + return postRepository.searchEducation(keyword.strip(), pageable); } public Slice findByPartAndOptionalFilters(Part part, Category category, Integer cardinalNumber, String studyName, Integer week, Pageable pageable) { @@ -67,14 +85,4 @@ public Slice findByCategory(Part part, Category category, int pageNumber, return postRepository.findByCategoryWithPart(partName, category, pageable); } - - public Slice search(String keyword, Pageable pageable) { - if(keyword == null || keyword.isEmpty()){ - return findRecentPosts(pageable); - } - else{ - return postRepository.findByTitleContainingOrContentContainingIgnoreCase(keyword, keyword, pageable); - } - } - } From 4a5e65a3275a8ce7c51adcac6bee9cbac59a6d90 Mon Sep 17 00:00:00 2001 From: huncozyboy Date: Wed, 13 Aug 2025 23:14:41 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat=20:=20=EA=B3=B5=EC=A7=80=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EA=B2=80=EC=83=89=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/presentation/NoticeController.java | 16 +++++++++++++--- .../board/presentation/PostController.java | 7 +++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/leets/weeth/domain/board/presentation/NoticeController.java b/src/main/java/leets/weeth/domain/board/presentation/NoticeController.java index efa4c224..fa2fb70a 100644 --- a/src/main/java/leets/weeth/domain/board/presentation/NoticeController.java +++ b/src/main/java/leets/weeth/domain/board/presentation/NoticeController.java @@ -3,6 +3,7 @@ import static leets.weeth.domain.board.presentation.ResponseMessage.NOTICE_FIND_ALL_SUCCESS; import static leets.weeth.domain.board.presentation.ResponseMessage.NOTICE_FIND_BY_ID_SUCCESS; +import static leets.weeth.domain.board.presentation.ResponseMessage.NOTICE_SEARCH_SUCCESS; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -11,7 +12,11 @@ import leets.weeth.global.common.response.CommonResponse; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Slice; -import org.springframework.web.bind.annotation.*; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; @Tag(name = "NOTICE", description = "공지사항 API") @@ -24,8 +29,7 @@ public class NoticeController { @GetMapping @Operation(summary="공지사항 목록 조회 [무한스크롤]") - public CommonResponse> findNotices(@RequestParam("pageNumber") int pageNumber, - @RequestParam("pageSize") int pageSize) { + public CommonResponse> findNotices(@RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize) { return CommonResponse.createSuccess(NOTICE_FIND_ALL_SUCCESS.getMessage(), noticeUsecase.findNotices(pageNumber, pageSize)); } @@ -34,4 +38,10 @@ public CommonResponse> findNotices(@RequestParam("p public CommonResponse findNoticeById(@PathVariable Long noticeId) { return CommonResponse.createSuccess(NOTICE_FIND_BY_ID_SUCCESS.getMessage(), noticeUsecase.findNotice(noticeId)); } + + @GetMapping("/search") + @Operation(summary="공지사항 검색 [무한스크롤]") + public CommonResponse> findNotice(@RequestParam String keyword, @RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize) { + return CommonResponse.createSuccess(NOTICE_SEARCH_SUCCESS.getMessage(), noticeUsecase.searchNotice(keyword, pageNumber, pageSize)); + } } diff --git a/src/main/java/leets/weeth/domain/board/presentation/PostController.java b/src/main/java/leets/weeth/domain/board/presentation/PostController.java index 9908980d..05714ed6 100644 --- a/src/main/java/leets/weeth/domain/board/presentation/PostController.java +++ b/src/main/java/leets/weeth/domain/board/presentation/PostController.java @@ -75,7 +75,7 @@ public CommonResponse> findEducationMaterial @GetMapping("/{boardId}") @Operation(summary="특정 게시글 조회") public CommonResponse findPost(@PathVariable Long boardId) { - return CommonResponse.createSuccess(POST_FIND_BY_ID_SUCCESS.getMessage(),postUsecase.findPost(boardId)); + return CommonResponse.createSuccess(POST_FIND_BY_ID_SUCCESS.getMessage(), postUsecase.findPost(boardId)); } @GetMapping("/part/studies") @@ -89,14 +89,14 @@ public CommonResponse findStudyNames(@RequestParam P @Operation(summary="파트 게시글 검색 [무한스크롤]") public CommonResponse> findPost(@RequestParam String keyword, @RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize) { - return CommonResponse.createSuccess(POST_SEARCH_SUCCESS.getMessage(),postUsecase.searchPost(keyword, pageNumber, pageSize)); + return CommonResponse.createSuccess(POST_SEARCH_SUCCESS.getMessage(), postUsecase.searchPost(keyword, pageNumber, pageSize)); } @GetMapping("/search/education") @Operation(summary="교육자료 검색 [무한스크롤]") public CommonResponse> findEducation(@RequestParam String keyword, @RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize) { - return CommonResponse.createSuccess(EDUCATION_SEARCH_SUCCESS.getMessage(),postUsecase.searchEducation(keyword, pageNumber, pageSize)); + return CommonResponse.createSuccess(EDUCATION_SEARCH_SUCCESS.getMessage(), postUsecase.searchEducation(keyword, pageNumber, pageSize)); } @PatchMapping(value = "/{boardId}/part") @@ -114,5 +114,4 @@ public CommonResponse delete(@PathVariable Long boardId, @Parameter(hidd postUsecase.delete(boardId, userId); return CommonResponse.createSuccess(POST_DELETED_SUCCESS.getMessage()); } - } From 306f4655c09ab7661fcae22dadcedacb19110696 Mon Sep 17 00:00:00 2001 From: huncozyboy Date: Wed, 13 Aug 2025 23:14:55 +0900 Subject: [PATCH 7/7] =?UTF-8?q?feat=20:=20=EA=B3=B5=EC=A7=80=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EA=B2=80=EC=83=89=20=EB=B9=84=EC=A6=88=EB=8B=88?= =?UTF-8?q?=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/usecase/NoticeUsecase.java | 1 + .../usecase/NoticeUsecaseImpl.java | 31 ++++++++++++++++--- .../domain/repository/NoticeRepository.java | 9 ++++++ .../domain/service/NoticeFindService.java | 11 +++++-- 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/main/java/leets/weeth/domain/board/application/usecase/NoticeUsecase.java b/src/main/java/leets/weeth/domain/board/application/usecase/NoticeUsecase.java index 104292a2..00f20557 100644 --- a/src/main/java/leets/weeth/domain/board/application/usecase/NoticeUsecase.java +++ b/src/main/java/leets/weeth/domain/board/application/usecase/NoticeUsecase.java @@ -17,4 +17,5 @@ public interface NoticeUsecase { void delete(Long noticeId, Long userId) throws UserNotMatchException; + Slice searchNotice(String keyword, int pageNumber, int pageSize); } diff --git a/src/main/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImpl.java b/src/main/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImpl.java index 1de01a88..a04c3bc8 100644 --- a/src/main/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImpl.java +++ b/src/main/java/leets/weeth/domain/board/application/usecase/NoticeUsecaseImpl.java @@ -1,6 +1,11 @@ package leets.weeth.domain.board.application.usecase; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import leets.weeth.domain.board.application.dto.NoticeDTO; +import leets.weeth.domain.board.application.exception.NoSearchResultException; import leets.weeth.domain.board.application.exception.PageNotFoundException; import leets.weeth.domain.board.application.mapper.NoticeMapper; import leets.weeth.domain.board.domain.entity.Notice; @@ -28,11 +33,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - @Service @RequiredArgsConstructor public class NoticeUsecaseImpl implements NoticeUsecase { @@ -85,6 +85,22 @@ public Slice findNotices(int pageNumber, int pageSize) { return notices.map(notice->mapper.toAll(notice, checkFileExistsByNotice(notice.id))); } + @Override + public Slice searchNotice(String keyword, int pageNumber, int pageSize) { + validatePageNumber(pageNumber); + + keyword = keyword.strip(); + + Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.DESC, "id")); + Slice notices = noticeFindService.search(keyword, pageable); + + if (notices.isEmpty()){ + throw new NoSearchResultException(); + } + + return notices.map(notice -> mapper.toAll(notice, checkFileExistsByNotice(notice.id))); + } + @Override @Transactional public void update(Long noticeId, NoticeDTO.Update dto, Long userId) { @@ -150,4 +166,9 @@ private CommentDTO.Response mapToDtoWithChildren(Comment comment, Map { Slice findPageBy(Pageable page); + @Query(""" + SELECT n FROM Notice n + WHERE (LOWER(n.title) LIKE LOWER(CONCAT('%', :kw, '%')) + OR LOWER(n.content) LIKE LOWER(CONCAT('%', :kw, '%'))) + ORDER BY n.id DESC + """) + Slice search(@Param("kw") String kw, Pageable pageable); } diff --git a/src/main/java/leets/weeth/domain/board/domain/service/NoticeFindService.java b/src/main/java/leets/weeth/domain/board/domain/service/NoticeFindService.java index fa2efa58..0640ec81 100644 --- a/src/main/java/leets/weeth/domain/board/domain/service/NoticeFindService.java +++ b/src/main/java/leets/weeth/domain/board/domain/service/NoticeFindService.java @@ -1,15 +1,14 @@ package leets.weeth.domain.board.domain.service; +import java.util.List; +import leets.weeth.domain.board.application.exception.NoticeNotFoundException; import leets.weeth.domain.board.domain.entity.Notice; import leets.weeth.domain.board.domain.repository.NoticeRepository; -import leets.weeth.domain.board.application.exception.NoticeNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; -import java.util.List; - @Service @RequiredArgsConstructor public class NoticeFindService { @@ -30,4 +29,10 @@ public Slice findRecentNotices(Pageable pageable) { return noticeRepository.findPageBy(pageable); } + public Slice search(String keyword, Pageable pageable) { + if(keyword == null || keyword.isEmpty()){ + return findRecentNotices(pageable); + } + return noticeRepository.search(keyword.strip(), pageable); + } }