본문 바로가기

Slack 채널 정리

[JPA]Point 타입 DB 저장 처리

위,경도 좌표값을 이용한 거리 계산 등을 위해 mariaDB 에서 Point 타입을 적용해보다가 JPA  코딩 단에서 또 장벽. Hibernate Spatial 을 사용한다면 된다고들 하는데( https://www.baeldung.com/hibernate-spatial ) 별 짓 다해봤지만 'Cannot get geometry object from data you send to the GEOMETRY field.' 에러만 계속 난다. SQL 직접 안쓰려 했지만 결국 소스처럼 nativeQuery 사용하니 되긴된다.
1.  위경도 값을 Point 타입으로 변환하려면 위 링크 글에 있듯 Well-known text 형태를 WKTReader 로 파싱해서 사용하는 방법도 있지만 GeometryFactory 의 createPoint 메서드 사용하는게 좀 더 깔끔한 듯 하여 그걸 사용했다. 성능 차이나 그런건 아직 잘 모르겠음.
2. insert 쿼리에서 INSERT INTO ... SET 식으로 사용해야 한다고 한다.  INSERT INTO ... VALUES(...) 쓰면 에러난다는 글 봤는데 진짜 그런지는 테스트해보지 않았다.

#### Service Java
import com.vividsolutions.jts.geom.*;

private Point createPoint(double lng, double lat) {
    GeometryFactory gf = new GeometryFactory();
    return gf.createPoint(new Coordinate(lng, lat));
}

void saveEvtMachPosHst(EvtMachPosHst machPos) throws ParseException {
    Point p = createPoint(machPos.getPosLon(), machPos.getPosLat());
    MachPosRepository.savePoint(machPos.getMachId(), p.toString());
}

#### Repository
String insertPointQuery = "INSERT INTO mach_pos SET mach_id = :machId, mach_point = ST_GEOMFROMTEXT(:point, 4326)";

@Modifying
@Transactional
@Query(nativeQuery = true, value = insertPointQuery)
int savePoint(String machId, String point);