아래의 repository 메서드를 실행하자 예외가 발생하였고, 엔터티 구조도 아래와 같습니다.
org.springframework.orm.jpa.JpaSystemException: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize
문제는 Restaurant.Address.location 의 Point 를 deserialize 하지 못 하는 것으로 보입니다.
이 문제를 해결하기 위해서 3가지를 해주었습니다.
좌표 정보를 사용하기 위해서는 dependency 에 Hibernate-spatial 을 추가해야 한다고 하는데, 저는 이를 하지 않고 있었습니다. 그래서 해당 의존성을 추가해주었습니다.
그 이후 dialect 설정을 해주었습니다.
spring.jpa.database-platform=org.hibernate.spatial.dialect.mysql.MySQL8SpatialDialect
위 Address
도메인 클래스를 보면 저는 org.springframework.data.geo.Point
를 사용하고 있는 것을 볼 수 있습니다. 하지만 org.locationtech.jts.geom.Point
를 사용해주어야 한다고 합니다. 그래서 아래와 같이 수정하였습니다.
createPoint
메서드 안에서 GeometryFactory
클래스가 메서드가 호출될 때마다 계속 생성되어서 다소 비효율적으로 보일 수 있으나, Restaurant
, Address
도메인 클래스는 처음 데이터 초기화 시에 데이터베이스에 모든 데이터가 초기화 되고 해당 메서드 들은 테스트 혹은 특정 상황에서만 사용되는 것이어서 큰 문제는 없습니다.
org.springframework.data.geo.Point
을 사용하였는데 어떻게 되었는지 모르겠음.