망고플레이트 클론 코딩에 참고를 하기위해 모바일 앱을 확인하는데 거리순 정렬이 있어 구현하도록 해본다.
다행히 Restaurant 테이블에 위도 경도를 컬럼으로 가지도록 설계해놓았당
클라이언트 측에서 현재 스마트폰의 위치 좌표(위도,경도)를 파라미터로 보내면 그것과 가까운순으로 정렬을 하면되는데..
거리계산을 공식을 막 찾아보던중 개꿀함수를 발견했다. 현재 mariaDB를 dbms로 사용하고 있는데 mySQL 과 mariaDB에선 자체적으로 위도 경도를 파라미터로 넣어서 호출하면 거리를 계산해주는 함수가 존재하고있었다.
함수명은
ST_Distance_Sphere
이제 남은건 이걸 queryDSL에서 어떤 문법을 가지고 호출하냐만 남았다
private OrderSpecifier<?> sortStandard(MainParamDto mainParamDto) {
if("avg".equals(mainParamDto.getGubun())){
return review.rating.avg().desc().nullsLast();
}else if("distance".equals(mainParamDto.getGubun())){
return Expressions.stringTemplate("ST_Distance_Sphere({0}, {1})",
Expressions.stringTemplate("POINT({0}, {1})",
mainParamDto.getLongitude(),
mainParamDto.getLatitude()
),
Expressions.stringTemplate("POINT({0}, {1})",
restaurant.longitude,
restaurant.latitude
)).asc();
}
return review.rating.count().desc().nullsLast();
}
SQL 함수를 호출할땐 Expressions.stringTemplate을 이용하면 된다.
이렇게 현재 클라이언트측에서 받아온 위도,경도와 각 식당들의 위도경도를 계산하여 오름차순으로 정렬하면 가까운 식당부터 sorting이 된다. 아직까진 동적쿼리를 사용하여 하나의 로직으로 구성하고있지만 프로젝트가 진행됨에 따라 여러가지 어려움이있을거같다
'Project > MangoPlate Clone' 카테고리의 다른 글
간단한 logBack 설정 (0) | 2023.02.20 |
---|---|
메인 목록에 QueryDsl 필터링 추가 (0) | 2023.02.17 |
공통컴포넌트 및 유틸 (0) | 2023.02.14 |
JPA Setting 및 Test (0) | 2023.02.14 |
MyBatis Setting 및 Test (0) | 2023.02.14 |