Skip to content

Commit fb8282e

Browse files
authored
refact : 검색 API ES 대신 임시 코드로 대체 (#197)
- 우선은 검색어 자동완성 기능을 비활성화하고, 문제 검색 기능은 제목과 설명만 포함되도록 함 - ES 비활성화 테스트를 위한 임시방편이므로 추후 추가적인 작업 필요
1 parent 79aa8ea commit fb8282e

File tree

6 files changed

+76
-52
lines changed

6 files changed

+76
-52
lines changed

src/main/java/org/ezcode/codetest/application/problem/dto/response/ProblemSearchResponse.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44

5+
import org.ezcode.codetest.domain.problem.model.entity.Problem;
56
import org.ezcode.codetest.domain.problem.model.entity.ProblemSearchDocument;
67

78
import lombok.Builder;
@@ -36,4 +37,17 @@ public static ProblemSearchResponse from(ProblemSearchDocument document) {
3637
.score(document.getScore())
3738
.build();
3839
}
40+
41+
public static ProblemSearchResponse from(Problem problem) {
42+
43+
return ProblemSearchResponse.builder()
44+
.id(problem.getId())
45+
.title(problem.getTitle())
46+
.category(null) // TODO: 카테고리 입력해줘야 함
47+
.difficulty(problem.getDifficulty().getDifficulty())
48+
.reference(problem.getReference().toString())
49+
.description(problem.getDescription())
50+
.score(problem.getScore())
51+
.build();
52+
}
3953
}
Lines changed: 8 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
package org.ezcode.codetest.application.problem.service;
22

3-
import java.util.Collection;
43
import java.util.List;
5-
import java.util.Optional;
64
import java.util.Set;
7-
import java.util.stream.Collectors;
8-
import java.util.stream.Stream;
95

106
import org.ezcode.codetest.application.problem.dto.response.ProblemSearchResponse;
11-
import org.ezcode.codetest.domain.problem.model.entity.ProblemSearchDocument;
127
import org.ezcode.codetest.domain.problem.service.ProblemSearchDomainService;
8+
import org.springframework.cache.annotation.Cacheable;
139
import org.springframework.stereotype.Service;
1410

1511
import lombok.RequiredArgsConstructor;
@@ -20,48 +16,18 @@ public class ProblemSearchService {
2016

2117
private final ProblemSearchDomainService searchDomainService;
2218

19+
// Redis 캐시 적용 (Cache Name: suggestions, Key: keyword)
20+
@Cacheable(value = "suggestions", key = "#keyword", unless = "#result.isEmpty()")
2321
public Set<String> getProblemSuggestions(String keyword) {
2422

25-
return searchDomainService
26-
.getSuggestionsByKeyword(keyword)
27-
.stream()
28-
.flatMap(doc -> {
29-
Stream.Builder<String> searchedKeyword = Stream.builder();
30-
31-
Optional.ofNullable(doc.getTitle()).ifPresent(searchedKeyword::add);
32-
Optional.ofNullable(doc.getReference())
33-
.map(Enum::toString)
34-
.ifPresent(searchedKeyword::add);
35-
Optional.ofNullable(doc.getDifficulty())
36-
.ifPresent(searchedKeyword::add);
37-
Optional.ofNullable(doc.getDescription())
38-
.ifPresent(searchedKeyword::add);
39-
Optional.ofNullable(doc.getDifficultyEn())
40-
.map(Enum::toString)
41-
.ifPresent(searchedKeyword::add);
42-
Optional.ofNullable(doc.getReferenceKor())
43-
.ifPresent(searchedKeyword::add);
44-
45-
Optional.ofNullable(doc.getCategories())
46-
.stream()
47-
.flatMap(Collection::stream)
48-
.forEach(searchedKeyword::add);
49-
50-
Optional.ofNullable(doc.getCategoriesKor())
51-
.stream()
52-
.flatMap(Collection::stream)
53-
.forEach(searchedKeyword::add);
54-
55-
return searchedKeyword.build();
56-
})
57-
.map(String::toUpperCase)
58-
.collect(Collectors.toSet());
23+
return null;
5924
}
6025

6126
public List<ProblemSearchResponse> getProblemSearchResult(String keyword) {
6227

63-
List<ProblemSearchDocument> results = searchDomainService.searchByKeywordMatch(keyword);
64-
65-
return results.stream().map(ProblemSearchResponse::from).toList();
28+
return searchDomainService.searchByKeywordMatch(keyword)
29+
.stream()
30+
.map(ProblemSearchResponse::from)
31+
.toList();
6632
}
6733
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.ezcode.codetest.domain.problem.repository;
2+
3+
import java.util.List;
4+
5+
import org.ezcode.codetest.domain.problem.model.entity.Problem;
6+
7+
public interface ProblemSearchRepository {
8+
9+
// 검색용 (검색 전용 DTO 또는 엔티티 리턴)
10+
List<Problem> searchProblems(String keyword);
11+
}
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package org.ezcode.codetest.domain.problem.service;
22

3+
import java.util.HashSet;
34
import java.util.List;
45
import java.util.Set;
56

6-
import org.ezcode.codetest.domain.problem.model.entity.ProblemSearchDocument;
7-
import org.ezcode.codetest.domain.problem.repository.ProblemDocumentRepository;
7+
import org.ezcode.codetest.domain.problem.model.entity.Problem;
8+
import org.ezcode.codetest.domain.problem.repository.ProblemSearchRepository;
89
import org.springframework.stereotype.Service;
910

1011
import lombok.RequiredArgsConstructor;
@@ -13,15 +14,11 @@
1314
@RequiredArgsConstructor
1415
public class ProblemSearchDomainService {
1516

16-
private final ProblemDocumentRepository searchRepository;
17+
// private final ProblemDocumentRepository searchRepository;
18+
private final ProblemSearchRepository searchRepository;
1719

18-
public Set<ProblemSearchDocument> getSuggestionsByKeyword(String keyword) {
20+
public List<Problem> searchByKeywordMatch(String keyword) {
1921

20-
return searchRepository.findDocumentContainingKeyword(keyword);
21-
}
22-
23-
public List<ProblemSearchDocument> searchByKeywordMatch(String keyword) {
24-
25-
return searchRepository.findProblemsByKeyword(keyword);
22+
return searchRepository.searchProblems(keyword);
2623
}
2724
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.ezcode.codetest.infrastructure.persistence.repository.problem;
2+
3+
import java.util.List;
4+
5+
import org.ezcode.codetest.domain.problem.model.entity.Problem;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Query;
8+
import org.springframework.data.repository.query.Param;
9+
10+
public interface ProblemSearchJpaRepository extends JpaRepository<Problem, Long> {
11+
12+
// TODO: FULLTEXT 인덱스 추가
13+
@Query(value = "SELECT * FROM problem WHERE title LIKE CONCAT('%', :keyword, '%') OR description LIKE CONCAT('%', :keyword, '%')", nativeQuery = true)
14+
List<Problem> searchByKeyword(@Param("keyword") String keyword);
15+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.ezcode.codetest.infrastructure.persistence.repository.problem;
2+
3+
import java.util.List;
4+
5+
import org.ezcode.codetest.domain.problem.model.entity.Problem;
6+
import org.ezcode.codetest.domain.problem.repository.ProblemSearchRepository;
7+
import org.springframework.stereotype.Repository;
8+
9+
import lombok.RequiredArgsConstructor;
10+
11+
@Repository
12+
@RequiredArgsConstructor
13+
public class ProblemSearchRepositoryImpl implements ProblemSearchRepository {
14+
15+
private final ProblemSearchJpaRepository searchJpaRepository;
16+
17+
@Override
18+
public List<Problem> searchProblems(String keyword) {
19+
return searchJpaRepository.searchByKeyword(keyword);
20+
}
21+
}

0 commit comments

Comments
 (0)