MVP 개발에 제작한 QueryDSL을 사용한 검색 기능과 Elastic Search를 활용한 검색 기능의 성능 비교를 해보았다.
▶ 조건
10000건의 경매 검색
<성능 테스트 코드>
@SpringBootTest
@ActiveProfiles("test")
public class AuctionSearchBenchmarkTest {
@Autowired
private AuctionRepository auctionRepository;
@Autowired
private AuctionSearchRepository auctionSearchRepository;
@Autowired
private ProductRepository productRepository;
@Autowired
private UserRepository userRepository;
@Autowired
private AuctionSearchService auctionSearchService;
@BeforeEach
void cleanUp(){
auctionRepository.deleteAll();
auctionSearchRepository.deleteAll();
productRepository.deleteAll();
}
@Test
@Transactional
public void generateDummyAuctions(){
User user = userRepository.findAll().stream().findFirst()
.orElseThrow(()-> new RuntimeException("No user found"));
for(int i=0; i<10000; i++){
Product product = new Product(
user,
"Test Product "+i,
"content",
ProductCategory.SHOES
);
productRepository.save(product);
Auction auction = new Auction(
product,
1000L + i,
LocalDateTime.now().plusHours(i),
60L
);
auctionRepository.save(auction);
auctionSearchRepository.save(AuctionMapper.toDucument(auction));
}
System.out.println("10000건의 더미 경매가 생성되었습니다.");
}
@Test
public void benchmarkSearch() {
Pageable pageable = PageRequest.of(0, 10);
String keyword = "testproduct";
String category = "SHOES";
//QueryDSL을 사용한 검색 기능
long startTime1 = System.currentTimeMillis();
auctionRepository.findBySearch(keyword, category, pageable);
long endTime1 = System.currentTimeMillis();
System.out.println("QueryDSL 검색 소요 시간: "+(endTime1-startTime1)+"ms");
//Elastic Search를 사용한 검색 기능
long startTime2 = System.currentTimeMillis();
auctionSearchService.searchAuctions(keyword, category, pageable);
long endTime2 = System.currentTimeMillis();
System.out.println("Elastic Search 검색 소요 시간: "+(endTime2-startTime2)+"ms");
}
}
우선 10000건의 더미 데이터를 생성한 후 benchmarkSearch()메서드를 실행하였다.
▶ 결과
QueryDSL 검색 소요 시간: 380ms
Elastic Search 검색 소요 시간: 228ms
Elastic Search를 활용한 검색 기능의 속도가 더 빠른 것을 알 수 있었다.
▶ 원인 분석
어째서 QueryDSL이 Elastic Search 보다 느렸는가?
● QueryDSL
- DB에서 전체 데이터를 조회 + 정렬 + 필터링하는 방식
- 데이터량이 많아질수록 → 정렬/조건/조인 처리 비용이 증가
● Elastic Search
- 검색에 최적화된 인덱스 구조 덕분에 문자열 검색 속도가 매우 빠름
- 내부적으로 역색인(inverted index) 구조를 쓰기 때문에 텍스트 기반 검색에 강함
즉, 검색어가 많고 데이터량이 많을수록 검색 소요 시간의 차이가 점점 더 커지게 된다.
특히 이 차이를 쉽게 알 수 있던게 바로 더미 데이터를 적용하기 전의 성능 비교이다.
QueryDSL 검색 소요 시간: 506ms
Elastic Search 검색 소요 시간: 514ms
이처럼 더미 데이터를 적용하기 전 소량의 검색에는 오히려 QueryDSL이 앞선 것을 알 수 있다.
하지만 대량의 데이터 처리를 진행할 경우에는 Elastic Search를 이용하는 것이 좀 더 효과적인 것을 알 수 있다.
'최종 프로젝트' 카테고리의 다른 글
| AWS OpenSearch를 활용한 검색 기능 구축기 (0) | 2025.04.25 |
|---|---|
| QueryDSL vs 로컬 Elastic Search vs Open Search(AWS 퍼블릭) (0) | 2025.04.25 |
| 로컬 elastic search와 AWS에서 제공하는 Amazon OpenSearch Service를 사용한 elastic search의 차이점 (0) | 2025.04.23 |
| 벤치 마크를 사용하여 성능 비교 (1) | 2025.04.18 |
| 경매 서비스 성능 개선을 위한 Redis 활용 (0) | 2025.04.14 |