[TIL] 240722: PostgreSQL Geometry 매핑 에러

최근에 MySQL에서 PostgreSQL로 데이터베이스를 이관하는 작업을 진행했다. 이 과정에서 geometry 데이터 타입을 사용하는 주소 클래스의 매핑중 오류가 발생했다.
기존에 MySQL에서는 Hibernate Spatial을 사용하여 JPA에서 Geometry 객체를 손쉽게 매핑할 수 있었지만, PostgreSQL에서는 몇 가지 추가 작업이 필요했다.

예시 클래스: AddressEntity

AddressEntity는 임베디드 타입으로 주소 정보를 저장하는 데 사용된다. 클래스는 다음과 같은 필드를 포함한다.

@Getter
@Embeddable
@NoArgsConstructor
public class AddressEntity {    
    @Column(name = "address_1", nullable = false)    
    @Comment("기본주소")    
    private String address1;    

    @Column(name = "address_2")
    @Comment("상세주소")    
    private String address2; 

    @Column(name = "address_location")
    @Comment("위치")    
    private Point location;    

    @Column(name = "address_time_zone")    
    @Comment("시간대")    
    private ZoneId timeZoneId;
}

여기서 문제가 발생했던 곳은 location 필드로, Point 타입을 사용하여 공간 정보를 저장한다.

문제의 핵심: PostGIS 설치

PostGIS는 PostgreSQL에 공간 및 지리적 데이터 타입을 추가하여 복잡한 공간 쿼리를 가능하게 하는 확장 프로그램이다.PostgreSQL에서 Point 객체와 같은 공간 데이터 타입을 처리하기 위해서는 PostGIS 확장이 필수였기 때문에, 매핑 에러가 발생한 것이었다.🥲

PostGIS 설치 방법 (macOS 기준)

macOS에서는 Homebrew를 사용하여 PostGIS를 설치할 수 있다. 다음 명령어로 설치한다.

brew install postgis

설치가 완료된 후, PostgreSQL 데이터베이스에 접속하여 PostGIS 확장을 활성화한다.

CREATE EXTENSION postgis;

이 명령은 데이터베이스 내에서 PostGIS 기능을 활성화시켜 geometry 타입 등의 공간 데이터 처리를 가능하게 한다.

결론

지금까지 MySQL -> PostgreSQL DB 이관에 따라 발생한 공간 데이터 매핑 문제에 대해서 살펴보았다. 이전 공간 데이터 사용시 Double의 형태로 longitude, latitude를 저장했더라면 문제가 발생하지 않았겠지만, Point 객체를 사용함으로써 PostGIS를 추가적으로 설치해야해야했다. 혹시나 PostgreSQL 이관시 에러가 발생한다면 공간 데이터 타입이 존재하는지, PostGIS는 설치되어있는지 체크해보는 것이 좋을 것 같다!

[TIL] 240722: PostgreSQL Geometry 매핑 에러

댓글 남기기

Scroll to top