해당 포스팅은 사이드 프로젝트 진행 중 겪은 크고 작은 이슈들에 대한 기록입니다.
기존의 거리 기반 매장 탐색 방식을 개선하고자 Hibernate Spatial을 사용하기로 함
기존보다 성능이 나은지를 기대하고 테스트를 진행
기존 조회 방식
기대한 이유
목적
기댓값
구분
테스트 데이터
Geolatte
로 결정하였다.import org.geolatte.geom.G2D;
import org.geolatte.geom.Geometry;
import org.locationtech.jts.io.ParseException;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface StoreRepository extends JpaRepository<Store, Long>, StoreRepositoryCustom {
/*
범위 내의 모든 데이터 조회
*/
@Query("select s from Store s " +
"left outer join fetch s.file " +
"where s.id < :range")
List<Store> findAllStoresLt(@Param("range") Long range);
/*
MBCContains
*/
@Query("select s from Store s " +
"left outer join fetch s.file " +
"where mbrcontains(:lineString, s.point) = true and s.id < 20000000")
List<Store> getStoresByMbrContains(@Param("lineString") Geometry<G2D> lineString) throws ParseException;
/*
ST_Contains (Polygon)
*/
@Query("select s from Store s " +
"left outer join fetch s.file " +
"where st_contains(:polygon, s.point) = true and s.id < 20000000")
List<Store> getStoresBySTContains(@Param("polygon") Geometry<G2D> polygon) throws ParseException;
}
위의 기능들을 사용(JPQL)했으며, Geometry를 만드는 코드는 1부에 있으므로 별도로 첨부하지 않았다.
범위 내 모든 데이터 조회의 경우, 테스트 단에서 별도의 거리 계산 메소드가 따로 존재한다.
위에 조건으로 주어진 store_id의 범위만 조정하면서 테스트를 진행할 예정이다.
조회된 결과의 개수까지 구한 후 테스트 종료.
Out Of Memory 에러 발생
로컬에서도 에러가 발생하면 이보다 열악한 EC2 환경(가용 메모리 1GB)에서 무조건 OOM이 발생할 것이다.
이렇게 데이터가 많을 땐 사실상 사용할 수가 없는 방법.
잘 보면 쿼리 자체는 수행이 됐다.
OOM을 해결하기 위한 방법을 추가적으로 공부해봐야겠다.