최종 프로젝트

QueryDSL vs Elastic Search

phonebee 2025. 4. 23. 16:00

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를 이용하는 것이 좀 더 효과적인 것을 알 수 있다.