🍋 기존 검색 기능과 Haversine의 한계

Harversine을 사용하면 직접 Java 코드를 작성하고, 이를 위해 모든 호텔 데이터를 서버로 가져온 후 계산해야 하기 때문에 구조적인 문제가 있다고 판단했다. 또 서버에서 거리 계산, 정렬과 페이징, 필터링을 하기 때문에 데이터가 증가하면 성능이 급격히 저하되는 문제가 있었다. 이 문제를 해결하기 위해서 MySQL의 ST_Distance_Sphere()를 사용해 DB에서 이 모든 것들을 처리하도록 했다.

🍋 ST_Distance_Sphere()란?

🍋 해결되지 않은 문제

처음에는 단순히 ST_Distnace_Sphere만 도입해서 거리 계산을 서버가 아니라 DB에서 하도록 수정했다. 하지만 여전히 모든 호텔 행에 대해 거리 계산을 수행해야 했고, 성능 문제가 여전히 남아있다는 것을 깨달았다.

그래서 모든 호텔 행을 계산하는 대신, 위도와 경도를 활용한 Bounding Box와 인덱스로 후보군을 줄이고, 훨씬 적은 수의 호텔에 대해서만 ST_Distnace_Sphere를 적용하는 방식으로 문제를 해결했다.

🍋 Bounding Box + (Longitude, Latidude) 인덱스 + ST_Distance_Sphere() 를 사용하면 성능을 크게 개선할 수 있다

Haversine vs.ST_Distance_Sphere