Skip to content

Commit

Permalink
refactor(search): 코드리뷰 사항 반영
Browse files Browse the repository at this point in the history
- findDynamicField -> findDynamicFieldByCenterId 네이밍 수정
- recruitboard 조회 쿼리문 형식 수정
- elastic search 활성화 확인 어노테이션 생성 및 적용
- 검색 컨트롤러 else 제거
- elastic search 저장 scheduler 로직 순서 수정 (활성화 체크 우선)
-
  • Loading branch information
ayoung-dev committed Feb 4, 2025
1 parent b9a1f57 commit 9cb0dbc
Show file tree
Hide file tree
Showing 13 changed files with 83 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,15 +69,15 @@ public void deleteAllInBatch() {

@Override
public String findNameById(UUID id) {
return findDynamicField(id, center.name)
return findDynamicFieldByCenterId(id, center.name)
.orElse(null);
}

private static BooleanExpression isNotDeleted() {
return center.deleted.isFalse();
}

private <T> Optional<T> findDynamicField(UUID id, Path<T> field) {
private <T> Optional<T> findDynamicFieldByCenterId(UUID id, Path<T> field) {

return Optional.ofNullable(
queryFactory
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
}
Original file line number Diff line number Diff line change
@@ -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<String, Object> 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);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,12 @@ public ApiResponse<Page<CommunityBoardResponseDto>> getCommunityBoardsBySearch(
communityBoardDocumentUseCase.get().getCommunityBoardBySearch(keyword, pageable.getPageNumber()),
"커뮤니티 게시글 검색 리스트 조회 성공"
);
} else {
return ApiResponse.ok(
}

return ApiResponse.ok(
200,
communityBoardQueryUseCase.getCommunityBoards(keyword, pageable.getPageNumber()),
"커뮤니티 게시글 검색 리스트 조회 성공"
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,13 @@ public ApiResponse<Page<RecruitBoardWithCenterResponseDto>> getAllBySearch(
recruitBoardDocumentUseCase.get().getRecruitBoardBySearch(condition),
"봉사 활동 모집글 검색 조회 성공"
);
} else {
return ApiResponse.ok(
200,
recruitBoardQueryUseCase.getAllWithCenter(condition),
"봉사 활동 모집글 검색 조회 성공"
);
}

return ApiResponse.ok(
200,
recruitBoardQueryUseCase.getAllWithCenter(condition),
"봉사 활동 모집글 검색 조회 성공"
);
}

@GetMapping("/recruit-boards/nearby")
Expand Down Expand Up @@ -91,13 +91,13 @@ public ApiResponse<Page<RecruitBoardDetailResponseDto>> getNearbyBySearch(
recruitBoardDocumentUseCase.get().getRecruitBoardsNearbyWithKeyword(condition),
"근처 봉사 활동 모집글 조회 성공"
);
} else {
return ApiResponse.ok(
200,
recruitBoardQueryUseCase.getRecruitBoardsNearby(condition),
"근처 봉사 활동 모집글 조회 성공"
);
}

return ApiResponse.ok(
200,
recruitBoardQueryUseCase.getRecruitBoardsNearby(condition),
"근처 봉사 활동 모집글 조회 성공"
);
}

//TODO: 특정 기관 모집글 조회, 기관이 작성한 모집글 조회 추가
Expand Down
Original file line number Diff line number Diff line change
@@ -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<CommunityBoardDocument, Long> {
List<CommunityBoardDocument> 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<CommunityBoardDocument> findDocumentsByTitleOrContentOrNicknameContaining(String keyword);
}
Original file line number Diff line number Diff line change
@@ -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<RecruitBoardDocument, Long> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@

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;

import java.util.List;

@Component
@RequiredArgsConstructor
@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnElasticSearchEnabled
public class CommunityBoardUpdateScheduler {

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

@Scheduled(cron = "${spring.schedules.cron.updateCommunityBoardDocuments}")
public void updateCommunityBoardDocuments() {
List<CommunityBoard> communityBoards = communityBoardQueryUseCase.getAllCommunityBoards();

if (elasticsearchHealthChecker.isElasticsearchRunning()) {
List<CommunityBoard> communityBoards = communityBoardQueryUseCase.getAllCommunityBoards();
communityBoardDocumentUseCase.saveCommunityBoardDocuments(communityBoards);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@

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;

import java.util.List;

@Component
@RequiredArgsConstructor
@ConditionalOnProperty(name = "elastic.search.enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnElasticSearchEnabled
public class RecruitBoardUpdateScheduler {

private final RecruitBoardQueryUseCase recruitBoardQueryUseCase;
Expand All @@ -22,9 +22,8 @@ public class RecruitBoardUpdateScheduler {

@Scheduled(cron = "${spring.schedules.cron.updateRecruitBoardDocuments}")
public void updateRecruitBoardDocuments() {
List<RecruitBoard> recruitBoards = recruitBoardQueryUseCase.getAllRecruitBoards();

if (elasticsearchHealthChecker.isElasticsearchRunning()) {
List<RecruitBoard> recruitBoards = recruitBoardQueryUseCase.getAllRecruitBoards();
recruitBoardDocumentUseCase.saveRecruitBoardDocuments(recruitBoards);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit 9cb0dbc

Please sign in to comment.