From fb907cac06cb14a4bf38092e49d27c641840e9ac Mon Sep 17 00:00:00 2001 From: Zepelown Date: Sat, 1 Feb 2025 20:22:11 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=EB=8F=99=EC=95=84=EB=A6=AC=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84,=ED=83=9C=EA=B7=B8,=EC=86=8C=EA=B0=9C=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?issue#37?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../club/controller/ClubController.java | 10 +++++ .../dto/ClubInformationSearchProjection.java | 4 +- .../club/payload/dto/ClubSearchResult.java | 6 +-- .../ClubKeywordSearchRepository.java | 11 +++++ .../ClubKeywordSearchRepositoryImpl.java | 45 +++++++++++++++++++ .../club/service/ClubSearchFilterService.java | 2 +- .../club/service/ClubSearchService.java | 30 +++++++++++++ 7 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepository.java create mode 100644 backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepositoryImpl.java create mode 100644 backend/src/main/java/moadong/club/service/ClubSearchService.java diff --git a/backend/src/main/java/moadong/club/controller/ClubController.java b/backend/src/main/java/moadong/club/controller/ClubController.java index cc8d707..37d791e 100644 --- a/backend/src/main/java/moadong/club/controller/ClubController.java +++ b/backend/src/main/java/moadong/club/controller/ClubController.java @@ -10,6 +10,7 @@ import moadong.club.service.ClubCommandService; import moadong.club.service.ClubDetailedPageService; import moadong.club.service.ClubSearchFilterService; +import moadong.club.service.ClubSearchService; import moadong.global.payload.Response; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -30,6 +31,7 @@ public class ClubController { private final ClubCommandService clubCommandService; private final ClubDetailedPageService clubDetailedPageService; private final ClubSearchFilterService clubSearchFilterService; + private final ClubSearchService clubSearchService; @PostMapping("/") @Operation(summary = "클럽 생성", description = "클럽을 생성합니다.") @@ -60,4 +62,12 @@ public ResponseEntity getClubsByFilter( ClubSearchResponse clubSearchResponse = clubSearchFilterService.getClubsByFilter(availability, classification, division); return Response.ok(clubSearchResponse); } + + @GetMapping("/search/") + public ResponseEntity searchClubsByKeyword( + @RequestParam(value = "keyword", required = true) String keyword + ){ + ClubSearchResponse clubSearchResponse = clubSearchService.searchClubsByKeyword(keyword); + return Response.ok(clubSearchResponse); + } } diff --git a/backend/src/main/java/moadong/club/payload/dto/ClubInformationSearchProjection.java b/backend/src/main/java/moadong/club/payload/dto/ClubInformationSearchProjection.java index 1246070..93ca1c1 100644 --- a/backend/src/main/java/moadong/club/payload/dto/ClubInformationSearchProjection.java +++ b/backend/src/main/java/moadong/club/payload/dto/ClubInformationSearchProjection.java @@ -2,7 +2,7 @@ public interface ClubInformationSearchProjection { String getLogo(); - String getDescription(); + String getIntroduction(); static ClubInformationSearchProjection empty() { return new ClubInformationSearchProjection() { @@ -12,7 +12,7 @@ public String getLogo() { } @Override - public String getDescription() { + public String getIntroduction() { return ""; } }; diff --git a/backend/src/main/java/moadong/club/payload/dto/ClubSearchResult.java b/backend/src/main/java/moadong/club/payload/dto/ClubSearchResult.java index 75c843b..4c749eb 100644 --- a/backend/src/main/java/moadong/club/payload/dto/ClubSearchResult.java +++ b/backend/src/main/java/moadong/club/payload/dto/ClubSearchResult.java @@ -11,7 +11,7 @@ public record ClubSearchResult( String state, String classification, String division, - String description + String introduction ) { public static ClubSearchResult createClubSearchResult( String id, @@ -21,7 +21,7 @@ public static ClubSearchResult createClubSearchResult( String state, String classification, String division, - String description + String introduction ){ return ClubSearchResult.builder() .id(id) @@ -31,7 +31,7 @@ public static ClubSearchResult createClubSearchResult( .state(state) .classification(classification) .division(division) - .description(description) + .introduction(introduction) .build(); } } diff --git a/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepository.java b/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepository.java new file mode 100644 index 0000000..e1c5fd2 --- /dev/null +++ b/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepository.java @@ -0,0 +1,11 @@ +package moadong.club.repository; + +import moadong.club.entity.Club; +import moadong.club.payload.dto.ClubSearchResult; +import moadong.club.payload.response.ClubSearchResponse; + +import java.util.List; + +public interface ClubKeywordSearchRepository { + List searchResult(String keyword); +} diff --git a/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepositoryImpl.java b/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepositoryImpl.java new file mode 100644 index 0000000..a86fb48 --- /dev/null +++ b/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepositoryImpl.java @@ -0,0 +1,45 @@ +package moadong.club.repository; + +import lombok.AllArgsConstructor; +import moadong.club.entity.Club; +import moadong.club.payload.dto.ClubSearchResult; +import moadong.club.payload.response.ClubSearchResponse; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.Aggregation; +import org.springframework.data.mongodb.core.aggregation.AggregationResults; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@AllArgsConstructor +public class ClubKeywordSearchRepositoryImpl implements ClubKeywordSearchRepository { + private final MongoTemplate mongoTemplate; + @Override + public List searchResult(String keyword) { + Aggregation aggregation = Aggregation.newAggregation( + Aggregation.lookup("club_information", "_id", "clubId", "club_info"), + Aggregation.lookup("club_tags", "_id", "clubId", "club_tags"), + Aggregation.match(new Criteria().orOperator( + Criteria.where("name").regex(keyword, "i"), + Criteria.where("club_info.description").regex(keyword, "i"), + Criteria.where("club_tags.tag").regex(keyword, "i") + )), + Aggregation.unwind("club_tags", true), + Aggregation.group("_id") + .first("name").as("name") + .first("state").as("state") + .first("classification").as("classification") + .first("division").as("division") + .first("club_info").as("club_info") + .push("club_tags.tag").as("tags"), + Aggregation.project("name", "state", "classification", "division") + .and("club_info.introduction").as("introduction") + .and("club_info.logo").as("logo") + .and("tags").as("tags") + ); + AggregationResults results = mongoTemplate.aggregate(aggregation, "club", ClubSearchResult.class); + return results.getMappedResults(); + } +} diff --git a/backend/src/main/java/moadong/club/service/ClubSearchFilterService.java b/backend/src/main/java/moadong/club/service/ClubSearchFilterService.java index 1625173..4755559 100644 --- a/backend/src/main/java/moadong/club/service/ClubSearchFilterService.java +++ b/backend/src/main/java/moadong/club/service/ClubSearchFilterService.java @@ -55,7 +55,7 @@ public ClubSearchResponse getClubsByFilter( .state(String.valueOf(club.getState().getDesc())) .division(club.getDivision()) .classification(club.getClassification()) - .description(informationByClubId.getDescription()) + .introduction(informationByClubId.getIntroduction()) .build(); clubSearchResults.add(clubSearchResult); diff --git a/backend/src/main/java/moadong/club/service/ClubSearchService.java b/backend/src/main/java/moadong/club/service/ClubSearchService.java new file mode 100644 index 0000000..f1da044 --- /dev/null +++ b/backend/src/main/java/moadong/club/service/ClubSearchService.java @@ -0,0 +1,30 @@ +package moadong.club.service; + +import lombok.AllArgsConstructor; +import moadong.club.entity.Club; +import moadong.club.payload.dto.ClubInformationSearchProjection; +import moadong.club.payload.dto.ClubSearchResult; +import moadong.club.payload.dto.ClubTagProjection; +import moadong.club.payload.response.ClubSearchResponse; +import moadong.club.repository.*; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@Service +@AllArgsConstructor +public class ClubSearchService { + private final ClubKeywordSearchRepository clubKeywordSearchRepository; + private final ClubInformationRepository clubInformationRepository; + private final ClubTagRepository clubTagRepository; + + public ClubSearchResponse searchClubsByKeyword(String keyword){ + List clubSearchResults = clubKeywordSearchRepository.searchResult(keyword); + + return ClubSearchResponse.builder() + .clubs(clubSearchResults) + .build(); + } +} From c279d87999f5c192c271b802854fb7a39389a3d7 Mon Sep 17 00:00:00 2001 From: Zepelown Date: Sat, 1 Feb 2025 22:58:14 +0900 Subject: [PATCH 2/3] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../club/repository/ClubKeywordSearchRepository.java | 2 -- .../repository/ClubKeywordSearchRepositoryImpl.java | 3 +-- .../java/moadong/club/service/ClubSearchService.java | 11 ++++------- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepository.java b/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepository.java index e1c5fd2..f530392 100644 --- a/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepository.java +++ b/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepository.java @@ -1,8 +1,6 @@ package moadong.club.repository; -import moadong.club.entity.Club; import moadong.club.payload.dto.ClubSearchResult; -import moadong.club.payload.response.ClubSearchResponse; import java.util.List; diff --git a/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepositoryImpl.java b/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepositoryImpl.java index a86fb48..9145de5 100644 --- a/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepositoryImpl.java +++ b/backend/src/main/java/moadong/club/repository/ClubKeywordSearchRepositoryImpl.java @@ -1,9 +1,7 @@ package moadong.club.repository; import lombok.AllArgsConstructor; -import moadong.club.entity.Club; import moadong.club.payload.dto.ClubSearchResult; -import moadong.club.payload.response.ClubSearchResponse; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationResults; @@ -16,6 +14,7 @@ @AllArgsConstructor public class ClubKeywordSearchRepositoryImpl implements ClubKeywordSearchRepository { private final MongoTemplate mongoTemplate; + @Override public List searchResult(String keyword) { Aggregation aggregation = Aggregation.newAggregation( diff --git a/backend/src/main/java/moadong/club/service/ClubSearchService.java b/backend/src/main/java/moadong/club/service/ClubSearchService.java index f1da044..ab26dd5 100644 --- a/backend/src/main/java/moadong/club/service/ClubSearchService.java +++ b/backend/src/main/java/moadong/club/service/ClubSearchService.java @@ -1,16 +1,13 @@ package moadong.club.service; import lombok.AllArgsConstructor; -import moadong.club.entity.Club; -import moadong.club.payload.dto.ClubInformationSearchProjection; import moadong.club.payload.dto.ClubSearchResult; -import moadong.club.payload.dto.ClubTagProjection; import moadong.club.payload.response.ClubSearchResponse; -import moadong.club.repository.*; +import moadong.club.repository.ClubInformationRepository; +import moadong.club.repository.ClubKeywordSearchRepository; +import moadong.club.repository.ClubTagRepository; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; @Service @@ -20,7 +17,7 @@ public class ClubSearchService { private final ClubInformationRepository clubInformationRepository; private final ClubTagRepository clubTagRepository; - public ClubSearchResponse searchClubsByKeyword(String keyword){ + public ClubSearchResponse searchClubsByKeyword(String keyword) { List clubSearchResults = clubKeywordSearchRepository.searchResult(keyword); return ClubSearchResponse.builder() From 9e460aea86f065df9b570fc9a779a9ba045180b1 Mon Sep 17 00:00:00 2001 From: Zepelown Date: Sat, 1 Feb 2025 22:59:15 +0900 Subject: [PATCH 3/3] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/moadong/club/service/ClubSearchService.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/backend/src/main/java/moadong/club/service/ClubSearchService.java b/backend/src/main/java/moadong/club/service/ClubSearchService.java index ab26dd5..0d47f05 100644 --- a/backend/src/main/java/moadong/club/service/ClubSearchService.java +++ b/backend/src/main/java/moadong/club/service/ClubSearchService.java @@ -3,9 +3,7 @@ import lombok.AllArgsConstructor; import moadong.club.payload.dto.ClubSearchResult; import moadong.club.payload.response.ClubSearchResponse; -import moadong.club.repository.ClubInformationRepository; import moadong.club.repository.ClubKeywordSearchRepository; -import moadong.club.repository.ClubTagRepository; import org.springframework.stereotype.Service; import java.util.List; @@ -14,9 +12,6 @@ @AllArgsConstructor public class ClubSearchService { private final ClubKeywordSearchRepository clubKeywordSearchRepository; - private final ClubInformationRepository clubInformationRepository; - private final ClubTagRepository clubTagRepository; - public ClubSearchResponse searchClubsByKeyword(String keyword) { List clubSearchResults = clubKeywordSearchRepository.searchResult(keyword);