Skip to content

Commit 9cb0dbc

Browse files
committed
refactor(search): 코드리뷰 사항 반영
- findDynamicField -> findDynamicFieldByCenterId 네이밍 수정 - recruitboard 조회 쿼리문 형식 수정 - elastic search 활성화 확인 어노테이션 생성 및 적용 - 검색 컨트롤러 else 제거 - elastic search 저장 scheduler 로직 순서 수정 (활성화 체크 우선) -
1 parent b9a1f57 commit 9cb0dbc

13 files changed

+83
-39
lines changed

src/main/java/com/somemore/domains/center/repository/center/CenterRepositoryImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,15 @@ public void deleteAllInBatch() {
6969

7070
@Override
7171
public String findNameById(UUID id) {
72-
return findDynamicField(id, center.name)
72+
return findDynamicFieldByCenterId(id, center.name)
7373
.orElse(null);
7474
}
7575

7676
private static BooleanExpression isNotDeleted() {
7777
return center.deleted.isFalse();
7878
}
7979

80-
private <T> Optional<T> findDynamicField(UUID id, Path<T> field) {
80+
private <T> Optional<T> findDynamicFieldByCenterId(UUID id, Path<T> field) {
8181

8282
return Optional.ofNullable(
8383
queryFactory
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.somemore.domains.search.annotation;
2+
3+
import org.springframework.context.annotation.Conditional;
4+
5+
import java.lang.annotation.Documented;
6+
import java.lang.annotation.ElementType;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.RetentionPolicy;
9+
import java.lang.annotation.Target;
10+
11+
@Retention(RetentionPolicy.RUNTIME)
12+
@Target({ElementType.TYPE, ElementType.METHOD})
13+
@Documented
14+
@Conditional(OnElasticSearchEnabledCondition.class)
15+
public @interface ConditionalOnElasticSearchEnabled {
16+
String propertyName() default "elastic.search.enabled";
17+
String havingValue() default "true";
18+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.somemore.domains.search.annotation;
2+
3+
import org.springframework.context.annotation.Condition;
4+
import org.springframework.context.annotation.ConditionContext;
5+
import org.springframework.core.type.AnnotatedTypeMetadata;
6+
import org.springframework.util.MultiValueMap;
7+
8+
public class OnElasticSearchEnabledCondition implements Condition {
9+
10+
@Override
11+
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
12+
MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(
13+
ConditionalOnElasticSearchEnabled.class.getName());
14+
String propertyName = (String) attrs.getFirst("propertyName");
15+
String havingValue = (String) attrs.getFirst("havingValue");
16+
17+
String propertyValue = context.getEnvironment().getProperty(propertyName);
18+
return havingValue.equals(propertyValue);
19+
}
20+
}

src/main/java/com/somemore/domains/search/config/ElasticsearchConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.somemore.domains.search.config;
22

3+
import com.somemore.domains.search.annotation.ConditionalOnElasticSearchEnabled;
34
import org.springframework.beans.factory.annotation.Value;
4-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
55
import org.springframework.context.annotation.Configuration;
66
import org.springframework.data.elasticsearch.client.ClientConfiguration;
77
import org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration;
88

99
@Configuration
10-
@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true", matchIfMissing = true)
10+
@ConditionalOnElasticSearchEnabled
1111
public class ElasticsearchConfig extends ElasticsearchConfiguration {
1212
@Value("${elastic.search.uri}")
1313
private String uri;

src/main/java/com/somemore/domains/search/controller/CommunityBoardSearchApiController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ public ApiResponse<Page<CommunityBoardResponseDto>> getCommunityBoardsBySearch(
3939
communityBoardDocumentUseCase.get().getCommunityBoardBySearch(keyword, pageable.getPageNumber()),
4040
"커뮤니티 게시글 검색 리스트 조회 성공"
4141
);
42-
} else {
43-
return ApiResponse.ok(
42+
}
43+
44+
return ApiResponse.ok(
4445
200,
4546
communityBoardQueryUseCase.getCommunityBoards(keyword, pageable.getPageNumber()),
4647
"커뮤니티 게시글 검색 리스트 조회 성공"
4748
);
48-
}
4949
}
5050
}

src/main/java/com/somemore/domains/search/controller/RecruitBoardSearchApiController.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,13 @@ public ApiResponse<Page<RecruitBoardWithCenterResponseDto>> getAllBySearch(
5757
recruitBoardDocumentUseCase.get().getRecruitBoardBySearch(condition),
5858
"봉사 활동 모집글 검색 조회 성공"
5959
);
60-
} else {
61-
return ApiResponse.ok(
62-
200,
63-
recruitBoardQueryUseCase.getAllWithCenter(condition),
64-
"봉사 활동 모집글 검색 조회 성공"
65-
);
6660
}
61+
62+
return ApiResponse.ok(
63+
200,
64+
recruitBoardQueryUseCase.getAllWithCenter(condition),
65+
"봉사 활동 모집글 검색 조회 성공"
66+
);
6767
}
6868

6969
@GetMapping("/recruit-boards/nearby")
@@ -91,13 +91,13 @@ public ApiResponse<Page<RecruitBoardDetailResponseDto>> getNearbyBySearch(
9191
recruitBoardDocumentUseCase.get().getRecruitBoardsNearbyWithKeyword(condition),
9292
"근처 봉사 활동 모집글 조회 성공"
9393
);
94-
} else {
95-
return ApiResponse.ok(
96-
200,
97-
recruitBoardQueryUseCase.getRecruitBoardsNearby(condition),
98-
"근처 봉사 활동 모집글 조회 성공"
99-
);
10094
}
95+
96+
return ApiResponse.ok(
97+
200,
98+
recruitBoardQueryUseCase.getRecruitBoardsNearby(condition),
99+
"근처 봉사 활동 모집글 조회 성공"
100+
);
101101
}
102102

103103
//TODO: 특정 기관 모집글 조회, 기관이 작성한 모집글 조회 추가
Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
package com.somemore.domains.search.repository;
22

3+
import com.somemore.domains.search.annotation.ConditionalOnElasticSearchEnabled;
34
import com.somemore.domains.search.domain.CommunityBoardDocument;
4-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
55
import org.springframework.data.elasticsearch.annotations.Query;
66
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
77

88
import java.util.List;
99

10-
@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true")
10+
@ConditionalOnElasticSearchEnabled
1111
public interface CommunityBoardDocumentRepository extends ElasticsearchRepository<CommunityBoardDocument, Long> {
1212
List<CommunityBoardDocument> findAll();
13-
@Query("{\"multi_match\": {\"query\": \"?0\", \"fields\": [\"title^3\", \"content^2\", \"writerNickname\"], \"fuzziness\": \"AUTO\"}}")
13+
@Query("""
14+
{
15+
"multi_match": {
16+
"query": "?0",
17+
"fields": ["title^3", "content^2", "writerNickname"],
18+
"fuzziness": "AUTO"
19+
}
20+
}
21+
""")
1422
List<CommunityBoardDocument> findDocumentsByTitleOrContentOrNicknameContaining(String keyword);
1523
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.somemore.domains.search.repository;
22

3+
import com.somemore.domains.search.annotation.ConditionalOnElasticSearchEnabled;
34
import com.somemore.domains.search.domain.RecruitBoardDocument;
4-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
55
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
66

7-
@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true")
7+
@ConditionalOnElasticSearchEnabled
88
public interface RecruitBoardDocumentRepository extends ElasticsearchRepository<RecruitBoardDocument, Long> {
99
}

src/main/java/com/somemore/domains/search/repository/SearchBoardRepositoryImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
import com.somemore.domains.recruitboard.domain.RecruitBoard;
1010
import com.somemore.domains.recruitboard.dto.condition.RecruitBoardNearByCondition;
1111
import com.somemore.domains.recruitboard.dto.condition.RecruitBoardSearchCondition;
12+
import com.somemore.domains.search.annotation.ConditionalOnElasticSearchEnabled;
1213
import com.somemore.domains.search.domain.CommunityBoardDocument;
1314
import com.somemore.domains.search.domain.RecruitBoardDocument;
1415
import com.somemore.domains.volunteer.usecase.VolunteerQueryUseCase;
1516
import lombok.RequiredArgsConstructor;
1617
import org.springframework.data.elasticsearch.client.elc.NativeQuery;
17-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1818
import org.springframework.data.domain.Page;
1919
import org.springframework.data.domain.Pageable;
2020
import co.elastic.clients.elasticsearch._types.query_dsl.Query;
@@ -31,7 +31,7 @@
3131

3232
@RequiredArgsConstructor
3333
@Repository
34-
@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true", matchIfMissing = true)
34+
@ConditionalOnElasticSearchEnabled
3535
public class SearchBoardRepositoryImpl implements SearchBoardRepository {
3636

3737
private final ElasticsearchOperations elasticsearchOperations;

src/main/java/com/somemore/domains/search/scheduler/CommunityBoardUpdateScheduler.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22

33
import com.somemore.domains.community.domain.CommunityBoard;
44
import com.somemore.domains.community.usecase.board.CommunityBoardQueryUseCase;
5+
import com.somemore.domains.search.annotation.ConditionalOnElasticSearchEnabled;
56
import com.somemore.domains.search.config.ElasticsearchHealthChecker;
67
import com.somemore.domains.search.usecase.CommunityBoardDocumentUseCase;
78
import lombok.RequiredArgsConstructor;
8-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
99
import org.springframework.scheduling.annotation.Scheduled;
1010
import org.springframework.stereotype.Component;
1111

1212
import java.util.List;
1313

1414
@Component
1515
@RequiredArgsConstructor
16-
@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true", matchIfMissing = true)
16+
@ConditionalOnElasticSearchEnabled
1717
public class CommunityBoardUpdateScheduler {
1818

1919
private final CommunityBoardQueryUseCase communityBoardQueryUseCase;
@@ -22,10 +22,9 @@ public class CommunityBoardUpdateScheduler {
2222

2323
@Scheduled(cron = "${spring.schedules.cron.updateCommunityBoardDocuments}")
2424
public void updateCommunityBoardDocuments() {
25-
List<CommunityBoard> communityBoards = communityBoardQueryUseCase.getAllCommunityBoards();
26-
2725
if (elasticsearchHealthChecker.isElasticsearchRunning()) {
26+
List<CommunityBoard> communityBoards = communityBoardQueryUseCase.getAllCommunityBoards();
2827
communityBoardDocumentUseCase.saveCommunityBoardDocuments(communityBoards);
2928
}
3029
}
31-
}
30+
}

0 commit comments

Comments
 (0)