diff --git a/src/main/java/com/somemore/domains/center/repository/center/CenterRepositoryImpl.java b/src/main/java/com/somemore/domains/center/repository/center/CenterRepositoryImpl.java index 2e57bccb..9e6f9a7d 100644 --- a/src/main/java/com/somemore/domains/center/repository/center/CenterRepositoryImpl.java +++ b/src/main/java/com/somemore/domains/center/repository/center/CenterRepositoryImpl.java @@ -69,7 +69,7 @@ public void deleteAllInBatch() { @Override public String findNameById(UUID id) { - return findDynamicField(id, center.name) + return findDynamicFieldByCenterId(id, center.name) .orElse(null); } @@ -77,7 +77,7 @@ private static BooleanExpression isNotDeleted() { return center.deleted.isFalse(); } - private Optional findDynamicField(UUID id, Path field) { + private Optional findDynamicFieldByCenterId(UUID id, Path field) { return Optional.ofNullable( queryFactory diff --git a/src/main/java/com/somemore/domains/search/annotation/ConditionalOnElasticSearchEnabled.java b/src/main/java/com/somemore/domains/search/annotation/ConditionalOnElasticSearchEnabled.java new file mode 100644 index 00000000..84c703b0 --- /dev/null +++ b/src/main/java/com/somemore/domains/search/annotation/ConditionalOnElasticSearchEnabled.java @@ -0,0 +1,18 @@ +package com.somemore.domains.search.annotation; + +import org.springframework.context.annotation.Conditional; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +@Documented +@Conditional(OnElasticSearchEnabledCondition.class) +public @interface ConditionalOnElasticSearchEnabled { + String propertyName() default "elastic.search.enabled"; + String havingValue() default "true"; +} \ No newline at end of file diff --git a/src/main/java/com/somemore/domains/search/annotation/OnElasticSearchEnabledCondition.java b/src/main/java/com/somemore/domains/search/annotation/OnElasticSearchEnabledCondition.java new file mode 100644 index 00000000..8efa2a21 --- /dev/null +++ b/src/main/java/com/somemore/domains/search/annotation/OnElasticSearchEnabledCondition.java @@ -0,0 +1,20 @@ +package com.somemore.domains.search.annotation; + +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; +import org.springframework.util.MultiValueMap; + +public class OnElasticSearchEnabledCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + MultiValueMap attrs = metadata.getAllAnnotationAttributes( + ConditionalOnElasticSearchEnabled.class.getName()); + String propertyName = (String) attrs.getFirst("propertyName"); + String havingValue = (String) attrs.getFirst("havingValue"); + + String propertyValue = context.getEnvironment().getProperty(propertyName); + return havingValue.equals(propertyValue); + } +} \ No newline at end of file diff --git a/src/main/java/com/somemore/domains/search/config/ElasticsearchConfig.java b/src/main/java/com/somemore/domains/search/config/ElasticsearchConfig.java index b80f34c2..0a1df62a 100644 --- a/src/main/java/com/somemore/domains/search/config/ElasticsearchConfig.java +++ b/src/main/java/com/somemore/domains/search/config/ElasticsearchConfig.java @@ -1,13 +1,13 @@ package com.somemore.domains.search.config; +import com.somemore.domains.search.annotation.ConditionalOnElasticSearchEnabled; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.client.ClientConfiguration; import org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration; @Configuration -@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnElasticSearchEnabled public class ElasticsearchConfig extends ElasticsearchConfiguration { @Value("${elastic.search.uri}") private String uri; diff --git a/src/main/java/com/somemore/domains/search/controller/CommunityBoardSearchApiController.java b/src/main/java/com/somemore/domains/search/controller/CommunityBoardSearchApiController.java index e080b4c4..1560cceb 100644 --- a/src/main/java/com/somemore/domains/search/controller/CommunityBoardSearchApiController.java +++ b/src/main/java/com/somemore/domains/search/controller/CommunityBoardSearchApiController.java @@ -39,12 +39,12 @@ public ApiResponse> getCommunityBoardsBySearch( communityBoardDocumentUseCase.get().getCommunityBoardBySearch(keyword, pageable.getPageNumber()), "커뮤니티 게시글 검색 리스트 조회 성공" ); - } else { - return ApiResponse.ok( + } + + return ApiResponse.ok( 200, communityBoardQueryUseCase.getCommunityBoards(keyword, pageable.getPageNumber()), "커뮤니티 게시글 검색 리스트 조회 성공" ); - } } } diff --git a/src/main/java/com/somemore/domains/search/controller/RecruitBoardSearchApiController.java b/src/main/java/com/somemore/domains/search/controller/RecruitBoardSearchApiController.java index 3aa99127..15c74728 100644 --- a/src/main/java/com/somemore/domains/search/controller/RecruitBoardSearchApiController.java +++ b/src/main/java/com/somemore/domains/search/controller/RecruitBoardSearchApiController.java @@ -57,13 +57,13 @@ public ApiResponse> getAllBySearch( recruitBoardDocumentUseCase.get().getRecruitBoardBySearch(condition), "봉사 활동 모집글 검색 조회 성공" ); - } else { - return ApiResponse.ok( - 200, - recruitBoardQueryUseCase.getAllWithCenter(condition), - "봉사 활동 모집글 검색 조회 성공" - ); } + + return ApiResponse.ok( + 200, + recruitBoardQueryUseCase.getAllWithCenter(condition), + "봉사 활동 모집글 검색 조회 성공" + ); } @GetMapping("/recruit-boards/nearby") @@ -91,13 +91,13 @@ public ApiResponse> getNearbyBySearch( recruitBoardDocumentUseCase.get().getRecruitBoardsNearbyWithKeyword(condition), "근처 봉사 활동 모집글 조회 성공" ); - } else { - return ApiResponse.ok( - 200, - recruitBoardQueryUseCase.getRecruitBoardsNearby(condition), - "근처 봉사 활동 모집글 조회 성공" - ); } + + return ApiResponse.ok( + 200, + recruitBoardQueryUseCase.getRecruitBoardsNearby(condition), + "근처 봉사 활동 모집글 조회 성공" + ); } //TODO: 특정 기관 모집글 조회, 기관이 작성한 모집글 조회 추가 diff --git a/src/main/java/com/somemore/domains/search/repository/CommunityBoardDocumentRepository.java b/src/main/java/com/somemore/domains/search/repository/CommunityBoardDocumentRepository.java index 805b2a23..a593608f 100644 --- a/src/main/java/com/somemore/domains/search/repository/CommunityBoardDocumentRepository.java +++ b/src/main/java/com/somemore/domains/search/repository/CommunityBoardDocumentRepository.java @@ -1,15 +1,23 @@ package com.somemore.domains.search.repository; +import com.somemore.domains.search.annotation.ConditionalOnElasticSearchEnabled; import com.somemore.domains.search.domain.CommunityBoardDocument; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.elasticsearch.annotations.Query; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import java.util.List; -@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true") +@ConditionalOnElasticSearchEnabled public interface CommunityBoardDocumentRepository extends ElasticsearchRepository { List findAll(); - @Query("{\"multi_match\": {\"query\": \"?0\", \"fields\": [\"title^3\", \"content^2\", \"writerNickname\"], \"fuzziness\": \"AUTO\"}}") + @Query(""" + { + "multi_match": { + "query": "?0", + "fields": ["title^3", "content^2", "writerNickname"], + "fuzziness": "AUTO" + } + } + """) List findDocumentsByTitleOrContentOrNicknameContaining(String keyword); } diff --git a/src/main/java/com/somemore/domains/search/repository/RecruitBoardDocumentRepository.java b/src/main/java/com/somemore/domains/search/repository/RecruitBoardDocumentRepository.java index 3e121204..82a34da9 100644 --- a/src/main/java/com/somemore/domains/search/repository/RecruitBoardDocumentRepository.java +++ b/src/main/java/com/somemore/domains/search/repository/RecruitBoardDocumentRepository.java @@ -1,9 +1,9 @@ package com.somemore.domains.search.repository; +import com.somemore.domains.search.annotation.ConditionalOnElasticSearchEnabled; import com.somemore.domains.search.domain.RecruitBoardDocument; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; -@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true") +@ConditionalOnElasticSearchEnabled public interface RecruitBoardDocumentRepository extends ElasticsearchRepository { } diff --git a/src/main/java/com/somemore/domains/search/repository/SearchBoardRepositoryImpl.java b/src/main/java/com/somemore/domains/search/repository/SearchBoardRepositoryImpl.java index dadadc09..4c7a129d 100644 --- a/src/main/java/com/somemore/domains/search/repository/SearchBoardRepositoryImpl.java +++ b/src/main/java/com/somemore/domains/search/repository/SearchBoardRepositoryImpl.java @@ -9,12 +9,12 @@ import com.somemore.domains.recruitboard.domain.RecruitBoard; import com.somemore.domains.recruitboard.dto.condition.RecruitBoardNearByCondition; import com.somemore.domains.recruitboard.dto.condition.RecruitBoardSearchCondition; +import com.somemore.domains.search.annotation.ConditionalOnElasticSearchEnabled; import com.somemore.domains.search.domain.CommunityBoardDocument; import com.somemore.domains.search.domain.RecruitBoardDocument; import com.somemore.domains.volunteer.usecase.VolunteerQueryUseCase; import lombok.RequiredArgsConstructor; import org.springframework.data.elasticsearch.client.elc.NativeQuery; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import co.elastic.clients.elasticsearch._types.query_dsl.Query; @@ -31,7 +31,7 @@ @RequiredArgsConstructor @Repository -@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnElasticSearchEnabled public class SearchBoardRepositoryImpl implements SearchBoardRepository { private final ElasticsearchOperations elasticsearchOperations; diff --git a/src/main/java/com/somemore/domains/search/scheduler/CommunityBoardUpdateScheduler.java b/src/main/java/com/somemore/domains/search/scheduler/CommunityBoardUpdateScheduler.java index a29e0e32..dd629b6b 100644 --- a/src/main/java/com/somemore/domains/search/scheduler/CommunityBoardUpdateScheduler.java +++ b/src/main/java/com/somemore/domains/search/scheduler/CommunityBoardUpdateScheduler.java @@ -2,10 +2,10 @@ import com.somemore.domains.community.domain.CommunityBoard; import com.somemore.domains.community.usecase.board.CommunityBoardQueryUseCase; +import com.somemore.domains.search.annotation.ConditionalOnElasticSearchEnabled; import com.somemore.domains.search.config.ElasticsearchHealthChecker; import com.somemore.domains.search.usecase.CommunityBoardDocumentUseCase; import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -13,7 +13,7 @@ @Component @RequiredArgsConstructor -@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnElasticSearchEnabled public class CommunityBoardUpdateScheduler { private final CommunityBoardQueryUseCase communityBoardQueryUseCase; @@ -22,10 +22,9 @@ public class CommunityBoardUpdateScheduler { @Scheduled(cron = "${spring.schedules.cron.updateCommunityBoardDocuments}") public void updateCommunityBoardDocuments() { - List communityBoards = communityBoardQueryUseCase.getAllCommunityBoards(); - if (elasticsearchHealthChecker.isElasticsearchRunning()) { + List communityBoards = communityBoardQueryUseCase.getAllCommunityBoards(); communityBoardDocumentUseCase.saveCommunityBoardDocuments(communityBoards); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/somemore/domains/search/scheduler/RecruitBoardUpdateScheduler.java b/src/main/java/com/somemore/domains/search/scheduler/RecruitBoardUpdateScheduler.java index ee43bc38..92133f9a 100644 --- a/src/main/java/com/somemore/domains/search/scheduler/RecruitBoardUpdateScheduler.java +++ b/src/main/java/com/somemore/domains/search/scheduler/RecruitBoardUpdateScheduler.java @@ -2,10 +2,10 @@ import com.somemore.domains.recruitboard.domain.RecruitBoard; import com.somemore.domains.recruitboard.usecase.RecruitBoardQueryUseCase; +import com.somemore.domains.search.annotation.ConditionalOnElasticSearchEnabled; import com.somemore.domains.search.config.ElasticsearchHealthChecker; import com.somemore.domains.search.usecase.RecruitBoardDocumentUseCase; import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -13,7 +13,7 @@ @Component @RequiredArgsConstructor -@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnElasticSearchEnabled public class RecruitBoardUpdateScheduler { private final RecruitBoardQueryUseCase recruitBoardQueryUseCase; @@ -22,9 +22,8 @@ public class RecruitBoardUpdateScheduler { @Scheduled(cron = "${spring.schedules.cron.updateRecruitBoardDocuments}") public void updateRecruitBoardDocuments() { - List recruitBoards = recruitBoardQueryUseCase.getAllRecruitBoards(); - if (elasticsearchHealthChecker.isElasticsearchRunning()) { + List recruitBoards = recruitBoardQueryUseCase.getAllRecruitBoards(); recruitBoardDocumentUseCase.saveRecruitBoardDocuments(recruitBoards); } } diff --git a/src/main/java/com/somemore/domains/search/service/CommunityBoardDocumentService.java b/src/main/java/com/somemore/domains/search/service/CommunityBoardDocumentService.java index 54e104bc..23c4029f 100644 --- a/src/main/java/com/somemore/domains/search/service/CommunityBoardDocumentService.java +++ b/src/main/java/com/somemore/domains/search/service/CommunityBoardDocumentService.java @@ -2,11 +2,11 @@ import com.somemore.domains.community.domain.CommunityBoard; import com.somemore.domains.community.dto.response.CommunityBoardResponseDto; +import com.somemore.domains.search.annotation.ConditionalOnElasticSearchEnabled; import com.somemore.domains.search.domain.CommunityBoardDocument; import com.somemore.domains.search.repository.SearchBoardRepository; import com.somemore.domains.search.usecase.CommunityBoardDocumentUseCase; import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -17,7 +17,7 @@ @RequiredArgsConstructor @Service -@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnElasticSearchEnabled public class CommunityBoardDocumentService implements CommunityBoardDocumentUseCase { private final SearchBoardRepository searchBoardRepository; diff --git a/src/main/java/com/somemore/domains/search/service/RecruitBoardDocumentService.java b/src/main/java/com/somemore/domains/search/service/RecruitBoardDocumentService.java index b39196d5..d4065abd 100644 --- a/src/main/java/com/somemore/domains/search/service/RecruitBoardDocumentService.java +++ b/src/main/java/com/somemore/domains/search/service/RecruitBoardDocumentService.java @@ -5,11 +5,11 @@ import com.somemore.domains.recruitboard.dto.condition.RecruitBoardSearchCondition; import com.somemore.domains.recruitboard.dto.response.RecruitBoardDetailResponseDto; import com.somemore.domains.recruitboard.dto.response.RecruitBoardWithCenterResponseDto; +import com.somemore.domains.search.annotation.ConditionalOnElasticSearchEnabled; import com.somemore.domains.search.domain.RecruitBoardDocument; import com.somemore.domains.search.repository.SearchBoardRepository; import com.somemore.domains.search.usecase.RecruitBoardDocumentUseCase; import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,7 +18,7 @@ @RequiredArgsConstructor @Service -@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnElasticSearchEnabled public class RecruitBoardDocumentService implements RecruitBoardDocumentUseCase { private final SearchBoardRepository searchBoardRepository;