From 18b90dc58f9a6a28c5ffe30824b5a32ef02f59fe Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Wed, 13 Aug 2025 01:55:38 +0900 Subject: [PATCH 01/12] =?UTF-8?q?[fix]=20=EC=B1=85=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?api=EC=97=90=20flag=20request=20isFinalized=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../konkuk/thip/book/adapter/in/web/BookQueryController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/konkuk/thip/book/adapter/in/web/BookQueryController.java b/src/main/java/konkuk/thip/book/adapter/in/web/BookQueryController.java index 37b99f167..1d872ed94 100644 --- a/src/main/java/konkuk/thip/book/adapter/in/web/BookQueryController.java +++ b/src/main/java/konkuk/thip/book/adapter/in/web/BookQueryController.java @@ -42,8 +42,9 @@ public class BookQueryController { public BaseResponse showBookSearchList( @Parameter(description = "검색 키워드", example = "해리포터") @RequestParam final String keyword, @Parameter(description = "페이지 번호 (1부터 시작)", example = "1") @RequestParam final int page, + @Parameter(description = "사용자가 검색어 입력을 '확정'했는지 여부 (입력 중: false, 입력 확정: true)", example = "false") @RequestParam(name = "isFinalized") final boolean isFinalized, @Parameter(hidden = true) @UserId final Long userId) { - return BaseResponse.ok(BookSearchListResponse.of(bookSearchUseCase.searchBooks(keyword, page,userId), page)); + return BaseResponse.ok(BookSearchListResponse.of(bookSearchUseCase.searchBooks(keyword, page, userId, isFinalized), page)); } //책 상세검색 결과 조회 From 146a2a7a372d5f4f424ac01745f2179f572049d2 Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Wed, 13 Aug 2025 01:56:12 +0900 Subject: [PATCH 02/12] =?UTF-8?q?[fix]=20=EC=B1=85=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?api=20service=20=EC=88=98=EC=A0=95=20(#204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 검색 완료일 경우에만 키워드가 최근 검색어로 저장되도록 수정 --- .../application/service/BookSearchService.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/konkuk/thip/book/application/service/BookSearchService.java b/src/main/java/konkuk/thip/book/application/service/BookSearchService.java index d1826a244..255a1c884 100644 --- a/src/main/java/konkuk/thip/book/application/service/BookSearchService.java +++ b/src/main/java/konkuk/thip/book/application/service/BookSearchService.java @@ -45,7 +45,7 @@ public class BookSearchService implements BookSearchUseCase { @Override @Transactional - public NaverBookParseResult searchBooks(String keyword, int page, Long userId) { + public NaverBookParseResult searchBooks(String keyword, int page, Long userId, boolean isFinalized) { if (keyword == null || keyword.isBlank()) { throw new BusinessException(BOOK_KEYWORD_REQUIRED); @@ -65,13 +65,15 @@ public NaverBookParseResult searchBooks(String keyword, int page, Long userId) { throw new BusinessException(BOOK_SEARCH_PAGE_OUT_OF_RANGE); } - //최근검색어 추가 - RecentSearch recentSearch = RecentSearch.builder() - .searchTerm(keyword) - .type(BOOK_SEARCH) - .userId(userId) - .build(); - recentSearchCommandPort.save(recentSearch); + // 검색완료일 경우에 최근검색어 추가 + if (isFinalized) { + RecentSearch recentSearch = RecentSearch.builder() + .searchTerm(keyword) + .type(BOOK_SEARCH) + .userId(userId) + .build(); + recentSearchCommandPort.save(recentSearch); + } return result; } From c06a484564cdc834ce7cbef837d06987fbbb01da Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Wed, 13 Aug 2025 01:56:22 +0900 Subject: [PATCH 03/12] =?UTF-8?q?[fix]=20=EC=B1=85=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?api=20=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95=20(#204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/book/application/port/in/BookSearchUseCase.java | 4 ++-- .../thip/book/adapter/in/web/BookQueryControllerTest.java | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/konkuk/thip/book/application/port/in/BookSearchUseCase.java b/src/main/java/konkuk/thip/book/application/port/in/BookSearchUseCase.java index 462f32d75..4f7cdfed9 100644 --- a/src/main/java/konkuk/thip/book/application/port/in/BookSearchUseCase.java +++ b/src/main/java/konkuk/thip/book/application/port/in/BookSearchUseCase.java @@ -5,6 +5,6 @@ public interface BookSearchUseCase { - NaverBookParseResult searchBooks(String keyword, int page,Long userId); - BookDetailSearchResult searchDetailBooks(String isbn,Long userId); + NaverBookParseResult searchBooks(String keyword, int page, Long userId, boolean isFinalized); + BookDetailSearchResult searchDetailBooks(String isbn, Long userId); } diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java index 0c38d9537..52467e26f 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java @@ -94,6 +94,7 @@ void searchBooks_success() throws Exception { .header("Authorization", "Bearer " + testToken) .param("keyword", keyword) .param("page", String.valueOf(page)) + .param("isFinalized", String.valueOf(false)) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.isSuccess").value(true)) @@ -115,6 +116,7 @@ void searchBooks_pageOutOfRange() throws Exception { .header("Authorization", "Bearer " + testToken) .param("keyword", keyword) .param("page", String.valueOf(page)) + .param("isFinalized", String.valueOf(false)) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.isSuccess").value(false)) @@ -136,6 +138,7 @@ void searchBooks_keywordMissing_badRequest() throws Exception { .header("Authorization", "Bearer " + testToken) .param("keyword", keyword) .param("page", String.valueOf(page)) + .param("isFinalized", String.valueOf(false)) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.code").value(ErrorCode.BOOK_KEYWORD_REQUIRED.getCode())) @@ -155,6 +158,7 @@ void searchBooks_pageInvalid_badRequest() throws Exception { .header("Authorization", "Bearer " + testToken) .param("keyword", keyword) .param("page", String.valueOf(page)) + .param("isFinalized", String.valueOf(false)) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.code").value(ErrorCode.BOOK_PAGE_NUMBER_INVALID.getCode())) @@ -175,6 +179,7 @@ void searchBooks_savesRecentSearch() throws Exception { .header("Authorization", "Bearer " + testToken) .param("keyword", keyword) .param("page", String.valueOf(page)) + .param("isFinalized", String.valueOf(true)) // 검색 완료일 경우 : 최근검색어로 저장된다 .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); From 36aa1c7dbf0dd1c973c1ce9e41915c5951b77f55 Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Wed, 13 Aug 2025 02:01:04 +0900 Subject: [PATCH 04/12] =?UTF-8?q?[fix]=20=EB=B0=A9=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?api=EC=97=90=20flag=20request=20isFinalized=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../konkuk/thip/room/adapter/in/web/RoomQueryController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/konkuk/thip/room/adapter/in/web/RoomQueryController.java b/src/main/java/konkuk/thip/room/adapter/in/web/RoomQueryController.java index e1b55a560..62df3c146 100644 --- a/src/main/java/konkuk/thip/room/adapter/in/web/RoomQueryController.java +++ b/src/main/java/konkuk/thip/room/adapter/in/web/RoomQueryController.java @@ -33,7 +33,7 @@ public class RoomQueryController { @Operation( summary = "방 검색", - description = "키워드, 카테고리, 정렬 방식, 페이지 번호를 기준으로 방을 검색합니다." + description = "키워드, 카테고리, 정렬 방식, 페이지 번호를 기준으로 방을 검색합니다. 아직 수정중입니다. 일단 request param 만 수정한 상태입니다." ) @ExceptionDescription(ROOM_SEARCH) @GetMapping("/rooms/search") @@ -41,9 +41,10 @@ public BaseResponse searchRooms( @Parameter(description = "검색 키워드 (책 이름 or 방 이름", example = "해리") @RequestParam(value = "keyword", required = false, defaultValue = "") final String keyword, @Parameter(description = "모임방 카테고리", example = "문학") @RequestParam(value = "category", required = false, defaultValue = "") final String category, @Parameter(description = "정렬 방식 (마감 임박 : deadline, 신청 인원 : memberCount)", example = "deadline") @RequestParam("sort") final String sort, + @Parameter(description = "사용자가 검색어 입력을 '확정'했는지 여부 (입력 중: false, 입력 확정: true)", example = "false") @RequestParam(name = "isFinalized") final boolean isFinalized, @Parameter(description = "페이지 번호", example = "1") @RequestParam("page") final int page ) { - return BaseResponse.ok(roomSearchUseCase.searchRoom(keyword, category, sort, page)); + return BaseResponse.ok(roomSearchUseCase.searchRoom(keyword, category, sort, page, isFinalized)); } @Operation( From 05b9a57349627095c2bedbdc7127fdb613ae1e2e Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Wed, 13 Aug 2025 02:01:46 +0900 Subject: [PATCH 05/12] =?UTF-8?q?[fix]=20=EB=B0=A9=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?api=20service=20=EC=88=98=EC=A0=95=20(#204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/room/application/port/in/RoomSearchUseCase.java | 2 +- .../thip/room/application/service/RoomSearchService.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/konkuk/thip/room/application/port/in/RoomSearchUseCase.java b/src/main/java/konkuk/thip/room/application/port/in/RoomSearchUseCase.java index d7ae4c94c..11c767e81 100644 --- a/src/main/java/konkuk/thip/room/application/port/in/RoomSearchUseCase.java +++ b/src/main/java/konkuk/thip/room/application/port/in/RoomSearchUseCase.java @@ -4,5 +4,5 @@ public interface RoomSearchUseCase { - RoomSearchResponse searchRoom(String keyword, String category, String sort, int page); + RoomSearchResponse searchRoom(String keyword, String category, String sort, int page, boolean isFinalized); } diff --git a/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java b/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java index 488dd9df1..4f7cf6e51 100644 --- a/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java +++ b/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java @@ -27,7 +27,7 @@ public class RoomSearchService implements RoomSearchUseCase { @Override @Transactional(readOnly = true) - public RoomSearchResponse searchRoom(String keyword, String category, String sort, int page) { + public RoomSearchResponse searchRoom(String keyword, String category, String sort, int page, boolean isFinalized) { // 1. validation String sortVal = validateSort(sort); String categoryVal = validateCategory(category); @@ -39,6 +39,8 @@ public RoomSearchResponse searchRoom(String keyword, String category, String sor // 3. 방 검색 Page result = roomQueryPort.searchRoom(keyword, categoryVal, pageable); + // TODO 검색 완료일 경우, 최근 검색어로 저장되도록 + // 4. response 구성 return new RoomSearchResponse( result.getContent(), From e23c80510db3a5290bf305b3241d49485eec08ba Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Wed, 13 Aug 2025 02:01:54 +0900 Subject: [PATCH 06/12] =?UTF-8?q?[fix]=20=EB=B0=A9=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?api=20=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95=20(#204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java index 20a7733c7..380357b1f 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java @@ -184,6 +184,7 @@ void search_keyword_and_sort_deadline() throws Exception { .requestAttr("userId", 1L) .param("keyword", "과학") .param("sort", "deadline") + .param("isFinalized", String.valueOf(false)) .param("page", "1")); //then @@ -233,6 +234,7 @@ void search_keyword_and_sort_member_count() throws Exception { .requestAttr("userId", 1L) .param("keyword", "과학") .param("sort", "memberCount") + .param("isFinalized", String.valueOf(false)) .param("page", "1")); //then @@ -285,6 +287,7 @@ void search_category_and_sort_deadline() throws Exception { .requestAttr("userId", 1L) .param("category", "과학·IT") .param("sort", "deadline") + .param("isFinalized", String.valueOf(false)) .param("page", "1")); //then @@ -324,6 +327,7 @@ void search_sort_deadline() throws Exception { ResultActions result = mockMvc.perform(get("/rooms/search") .requestAttr("userId", 1L) .param("sort", "deadline") + .param("isFinalized", String.valueOf(false)) .param("page", "1")); //then @@ -366,6 +370,7 @@ void search_keyword_and_category() throws Exception { .param("keyword", "과학") .param("category", Category.SCIENCE_IT.getValue()) .param("sort", "deadline") + .param("isFinalized", String.valueOf(false)) .param("page", "1")); // then From fea49ffa07e1ef78a191cfdf6c495aa6146a1e7e Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Wed, 13 Aug 2025 02:09:51 +0900 Subject: [PATCH 07/12] =?UTF-8?q?[fix]=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20api=EC=97=90=20flag=20request=20isFinalize?= =?UTF-8?q?d=20=EC=B6=94=EA=B0=80=20=20(#204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../konkuk/thip/user/adapter/in/web/UserQueryController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/konkuk/thip/user/adapter/in/web/UserQueryController.java b/src/main/java/konkuk/thip/user/adapter/in/web/UserQueryController.java index de90725d8..c411e3107 100644 --- a/src/main/java/konkuk/thip/user/adapter/in/web/UserQueryController.java +++ b/src/main/java/konkuk/thip/user/adapter/in/web/UserQueryController.java @@ -120,9 +120,10 @@ public BaseResponse checkIsFollowing( @GetMapping("/users") public BaseResponse showSearchUsers( @Parameter(description = "검색어", example = "thip") @RequestParam @NotBlank(message = "검색어는 필수입니다.") final String keyword, + @Parameter(description = "사용자가 검색어 입력을 '확정'했는지 여부 (입력 중: false, 입력 확정: true)", example = "false") @RequestParam(name = "isFinalized") final boolean isFinalized, @Parameter(description = "단일 검색 결과 페이지 크기 (1~30) / default : 30", example = "30") @RequestParam(required = false, defaultValue = "30") @Min(1) @Max(30) final Integer size, @Parameter(hidden = true) @UserId final Long userId) { - return BaseResponse.ok(userSearchUsecase.searchUsers(UserSearchQuery.of(keyword, userId, size))); + return BaseResponse.ok(userSearchUsecase.searchUsers(UserSearchQuery.of(keyword, userId, size, isFinalized))); } @Operation( From 676aae623989f8fb7446233235d1dd3c3ad4849d Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Wed, 13 Aug 2025 02:10:11 +0900 Subject: [PATCH 08/12] =?UTF-8?q?[fix]=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20api=20service=20=EC=88=98=EC=A0=95=20(#204?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/user/application/port/in/dto/UserSearchQuery.java | 7 ++++--- .../thip/user/application/service/UserSearchService.java | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/konkuk/thip/user/application/port/in/dto/UserSearchQuery.java b/src/main/java/konkuk/thip/user/application/port/in/dto/UserSearchQuery.java index 17806ef8c..8fe66190e 100644 --- a/src/main/java/konkuk/thip/user/application/port/in/dto/UserSearchQuery.java +++ b/src/main/java/konkuk/thip/user/application/port/in/dto/UserSearchQuery.java @@ -3,9 +3,10 @@ public record UserSearchQuery( String keyword, Long userId, - Integer size + Integer size, + boolean isFinalized ) { - public static UserSearchQuery of(String keyword, Long userId, Integer size) { - return new UserSearchQuery(keyword, userId, size); + public static UserSearchQuery of(String keyword, Long userId, Integer size, boolean isFinalized) { + return new UserSearchQuery(keyword, userId, size, isFinalized); } } diff --git a/src/main/java/konkuk/thip/user/application/service/UserSearchService.java b/src/main/java/konkuk/thip/user/application/service/UserSearchService.java index e2aed557e..9aad81fca 100644 --- a/src/main/java/konkuk/thip/user/application/service/UserSearchService.java +++ b/src/main/java/konkuk/thip/user/application/service/UserSearchService.java @@ -29,8 +29,10 @@ public UserSearchResponse searchUsers(UserSearchQuery userSearchQuery) { userSearchQuery.size() )); - // 최근 검색어 저장 - recentSearchCreateManager.saveRecentSearchByUser(userSearchQuery.userId(), userSearchQuery.keyword(), RecentSearchType.USER_SEARCH); + // 검색 완료일 경우, 최근 검색어 저장 + if (userSearchQuery.isFinalized()) { + recentSearchCreateManager.saveRecentSearchByUser(userSearchQuery.userId(), userSearchQuery.keyword(), RecentSearchType.USER_SEARCH); + } return UserSearchResponse.of(userDtoList); } From faf2cb32a40470b9e9949e2bee752b4d98774227 Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Wed, 13 Aug 2025 02:10:18 +0900 Subject: [PATCH 09/12] =?UTF-8?q?[fix]=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20api=20=EA=B4=80=EB=A0=A8=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../konkuk/thip/user/adapter/in/web/UserSearchApiTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserSearchApiTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserSearchApiTest.java index 88d0f2fc8..fc563c0c0 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserSearchApiTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserSearchApiTest.java @@ -72,7 +72,7 @@ void searchUsersAndSaveRecentSearch() throws Exception { .param("keyword", keyword) .requestAttr("userId", currentUserId) .param("size", "10") - + .param("isFinalized", String.valueOf(true)) // 검색 완료 -> 최근 검색어 저장 ); // then: 검색 결과 검증 @@ -91,4 +91,4 @@ void searchUsersAndSaveRecentSearch() throws Exception { assertEquals(RecentSearchType.USER_SEARCH, saved.getType()); assertEquals(currentUserId, saved.getUserJpaEntity().getUserId()); } -} \ No newline at end of file +} From 4976f19c57f5ed0ab1e92eec2763e8f37bd0726e Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Wed, 13 Aug 2025 02:32:44 +0900 Subject: [PATCH 10/12] =?UTF-8?q?[hotfix]=20RecentSearchCreateManager=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=20(#204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/BookSearchService.java | 15 +++++---------- .../manager/RecentSearchCreateManager.java | 17 ++++++++++------- .../adapter/in/web/RoomQueryController.java | 5 +++-- .../application/port/in/RoomSearchUseCase.java | 2 +- .../application/service/RoomSearchService.java | 10 +++++++--- 5 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/main/java/konkuk/thip/book/application/service/BookSearchService.java b/src/main/java/konkuk/thip/book/application/service/BookSearchService.java index 255a1c884..3858d06aa 100644 --- a/src/main/java/konkuk/thip/book/application/service/BookSearchService.java +++ b/src/main/java/konkuk/thip/book/application/service/BookSearchService.java @@ -12,7 +12,7 @@ import konkuk.thip.common.exception.BusinessException; import konkuk.thip.feed.application.port.out.FeedQueryPort; import konkuk.thip.recentSearch.application.port.out.RecentSearchCommandPort; -import konkuk.thip.recentSearch.domain.RecentSearch; +import konkuk.thip.recentSearch.application.service.manager.RecentSearchCreateManager; import konkuk.thip.room.application.port.out.RoomQueryPort; import konkuk.thip.user.application.port.out.UserCommandPort; import konkuk.thip.user.application.port.out.UserQueryPort; @@ -43,6 +43,8 @@ public class BookSearchService implements BookSearchUseCase { private final UserCommandPort userCommandPort; private final BookRedisCommandPort bookRedisCommandPort; + private final RecentSearchCreateManager recentSearchCreateManager; + @Override @Transactional public NaverBookParseResult searchBooks(String keyword, int page, Long userId, boolean isFinalized) { @@ -65,15 +67,8 @@ public NaverBookParseResult searchBooks(String keyword, int page, Long userId, b throw new BusinessException(BOOK_SEARCH_PAGE_OUT_OF_RANGE); } - // 검색완료일 경우에 최근검색어 추가 - if (isFinalized) { - RecentSearch recentSearch = RecentSearch.builder() - .searchTerm(keyword) - .type(BOOK_SEARCH) - .userId(userId) - .build(); - recentSearchCommandPort.save(recentSearch); - } + // 최근 검색어 저장 + recentSearchCreateManager.saveRecentSearchByUser(userId, keyword, BOOK_SEARCH, isFinalized); return result; } diff --git a/src/main/java/konkuk/thip/recentSearch/application/service/manager/RecentSearchCreateManager.java b/src/main/java/konkuk/thip/recentSearch/application/service/manager/RecentSearchCreateManager.java index e74484e01..3c41bf10b 100644 --- a/src/main/java/konkuk/thip/recentSearch/application/service/manager/RecentSearchCreateManager.java +++ b/src/main/java/konkuk/thip/recentSearch/application/service/manager/RecentSearchCreateManager.java @@ -14,13 +14,16 @@ public class RecentSearchCreateManager { private final RecentSearchCommandPort recentSearchCommandPort; private final RecentSearchQueryPort recentSearchQueryPort; - public void saveRecentSearchByUser(Long userId, String keyword, RecentSearchType type) { + public void saveRecentSearchByUser(Long userId, String keyword, RecentSearchType type, boolean isFinalized) { + // 검색완료일 경우에 최근검색어 추가 + if (isFinalized) { + // 동일 조건 (userId + keyword + type) 검색 기록이 이미 있는지 확인 + recentSearchQueryPort.findRecentSearchByKeywordAndUserId(keyword, userId, type) + .ifPresentOrElse( + recentSearchCommandPort::touch, // 있으면 modifiedAt 갱신 + () -> recentSearchCommandPort.save(RecentSearch.withoutId(keyword, type, userId)) // 없으면 새로 저장 + ); + } - // 동일 조건 (userId + keyword + type) 검색 기록이 이미 있는지 확인 - recentSearchQueryPort.findRecentSearchByKeywordAndUserId(keyword, userId, type) - .ifPresentOrElse( - recentSearchCommandPort::touch, // 있으면 modifiedAt 갱신 - () -> recentSearchCommandPort.save(RecentSearch.withoutId(keyword, type, userId)) // 없으면 새로 저장 - ); } } diff --git a/src/main/java/konkuk/thip/room/adapter/in/web/RoomQueryController.java b/src/main/java/konkuk/thip/room/adapter/in/web/RoomQueryController.java index 62df3c146..bf75c21d4 100644 --- a/src/main/java/konkuk/thip/room/adapter/in/web/RoomQueryController.java +++ b/src/main/java/konkuk/thip/room/adapter/in/web/RoomQueryController.java @@ -42,9 +42,10 @@ public BaseResponse searchRooms( @Parameter(description = "모임방 카테고리", example = "문학") @RequestParam(value = "category", required = false, defaultValue = "") final String category, @Parameter(description = "정렬 방식 (마감 임박 : deadline, 신청 인원 : memberCount)", example = "deadline") @RequestParam("sort") final String sort, @Parameter(description = "사용자가 검색어 입력을 '확정'했는지 여부 (입력 중: false, 입력 확정: true)", example = "false") @RequestParam(name = "isFinalized") final boolean isFinalized, - @Parameter(description = "페이지 번호", example = "1") @RequestParam("page") final int page + @Parameter(description = "페이지 번호", example = "1") @RequestParam("page") final int page, + @Parameter(hidden = true) @UserId final Long userId ) { - return BaseResponse.ok(roomSearchUseCase.searchRoom(keyword, category, sort, page, isFinalized)); + return BaseResponse.ok(roomSearchUseCase.searchRoom(keyword, category, sort, page, isFinalized, userId)); } @Operation( diff --git a/src/main/java/konkuk/thip/room/application/port/in/RoomSearchUseCase.java b/src/main/java/konkuk/thip/room/application/port/in/RoomSearchUseCase.java index 11c767e81..d4231a8c0 100644 --- a/src/main/java/konkuk/thip/room/application/port/in/RoomSearchUseCase.java +++ b/src/main/java/konkuk/thip/room/application/port/in/RoomSearchUseCase.java @@ -4,5 +4,5 @@ public interface RoomSearchUseCase { - RoomSearchResponse searchRoom(String keyword, String category, String sort, int page, boolean isFinalized); + RoomSearchResponse searchRoom(String keyword, String category, String sort, int page, boolean isFinalized, Long userId); } diff --git a/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java b/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java index 4f7cf6e51..50bc49701 100644 --- a/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java +++ b/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java @@ -1,11 +1,13 @@ package konkuk.thip.room.application.service; import konkuk.thip.common.exception.BusinessException; +import konkuk.thip.recentSearch.adapter.out.jpa.RecentSearchType; +import konkuk.thip.recentSearch.application.service.manager.RecentSearchCreateManager; import konkuk.thip.room.adapter.in.web.response.RoomSearchResponse; -import konkuk.thip.room.domain.Category; import konkuk.thip.room.adapter.out.persistence.RoomSearchSortParam; import konkuk.thip.room.application.port.in.RoomSearchUseCase; import konkuk.thip.room.application.port.out.RoomQueryPort; +import konkuk.thip.room.domain.Category; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -14,7 +16,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import static konkuk.thip.common.exception.code.ErrorCode.CATEGORY_NOT_FOUND; import static konkuk.thip.common.exception.code.ErrorCode.INVALID_ROOM_SEARCH_SORT; @Service @@ -25,9 +26,11 @@ public class RoomSearchService implements RoomSearchUseCase { private final RoomQueryPort roomQueryPort; + private final RecentSearchCreateManager recentSearchCreateManager; + @Override @Transactional(readOnly = true) - public RoomSearchResponse searchRoom(String keyword, String category, String sort, int page, boolean isFinalized) { + public RoomSearchResponse searchRoom(String keyword, String category, String sort, int page, boolean isFinalized, Long userId) { // 1. validation String sortVal = validateSort(sort); String categoryVal = validateCategory(category); @@ -40,6 +43,7 @@ public RoomSearchResponse searchRoom(String keyword, String category, String sor Page result = roomQueryPort.searchRoom(keyword, categoryVal, pageable); // TODO 검색 완료일 경우, 최근 검색어로 저장되도록 + recentSearchCreateManager.saveRecentSearchByUser(userId, keyword, RecentSearchType.ROOM_SEARCH, isFinalized); // 4. response 구성 return new RoomSearchResponse( From bd95c8c827bcc3f84c01c5eb8f240b9d698c9c48 Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Wed, 13 Aug 2025 02:36:01 +0900 Subject: [PATCH 11/12] =?UTF-8?q?[hotfix]=20RecentSearchCreateManager=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=20(#204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/user/application/service/UserSearchService.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/konkuk/thip/user/application/service/UserSearchService.java b/src/main/java/konkuk/thip/user/application/service/UserSearchService.java index 9aad81fca..e9c9a6267 100644 --- a/src/main/java/konkuk/thip/user/application/service/UserSearchService.java +++ b/src/main/java/konkuk/thip/user/application/service/UserSearchService.java @@ -29,11 +29,8 @@ public UserSearchResponse searchUsers(UserSearchQuery userSearchQuery) { userSearchQuery.size() )); - // 검색 완료일 경우, 최근 검색어 저장 - if (userSearchQuery.isFinalized()) { - recentSearchCreateManager.saveRecentSearchByUser(userSearchQuery.userId(), userSearchQuery.keyword(), RecentSearchType.USER_SEARCH); - } - + recentSearchCreateManager.saveRecentSearchByUser(userSearchQuery.userId(), userSearchQuery.keyword(), RecentSearchType.USER_SEARCH, userSearchQuery.isFinalized()); + return UserSearchResponse.of(userDtoList); } } From 825075511119dad7784400cf05928bc2a3dbfe6e Mon Sep 17 00:00:00 2001 From: janghyunjun Date: Wed, 13 Aug 2025 02:37:09 +0900 Subject: [PATCH 12/12] =?UTF-8?q?[hotfix]=20=EB=B0=A9=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=B5=9C=EA=B7=BC=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20=ED=8A=B8=EB=9E=9C=EC=9E=AD?= =?UTF-8?q?=EC=85=98=20=EC=B6=94=EA=B0=80=20(#204)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../konkuk/thip/room/application/service/RoomSearchService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java b/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java index 50bc49701..9b5b8626a 100644 --- a/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java +++ b/src/main/java/konkuk/thip/room/application/service/RoomSearchService.java @@ -29,7 +29,7 @@ public class RoomSearchService implements RoomSearchUseCase { private final RecentSearchCreateManager recentSearchCreateManager; @Override - @Transactional(readOnly = true) + @Transactional // <- 최근 검색 저장으로 인한 트랜잭션 public RoomSearchResponse searchRoom(String keyword, String category, String sort, int page, boolean isFinalized, Long userId) { // 1. validation String sortVal = validateSort(sort);