postgreSQL에서 위치 정보 검색을 위해 Point 타입을 사용하려 했으나 엔터티 저장 과정에서 bytea로 해석되어 에러가 발생했다.
PointConverter를 구현하여 org.springframework.data.geo.Point 타입을 PGpoint로 변환하도록 작성했지만 같은 문제가 발생하여 이를 위해 Point 타입 대신 PostGIS 확장을 설치하고 Geometry 타입을 사용해 보기로 했다.
postgis 확장 설치
brew install postgis
PostgreSQL 재접속
brew services restart postgresql
적용하려는 데이터베이스 접속
\c {데이터베이스명}

적용
CREATE EXTENSION postgis;
ALTER TABLE p_user ALTER COLUMN lat_lng TYPE geometry(Point, 4326) USING ST_SetSRID(lat_lng::geometry, 4326);
엔터티 필드 수정
package com.sparta.temueats.user.entity;
import jakarta.persistence.*;
import jakarta.validation.constraints.*;
import lombok.*;
import org.locationtech.jts.geom.Point;
import java.util.Date;
@Entity(name="P_USER")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Builder
public class P_user {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
@Email
@Column(nullable = false, unique = true)
private String email;
@NotBlank
private String password;
@NotBlank
@Column(nullable = false, unique = true)
@Size(min = 2, max = 30, message = "닉네임은 2자 이상, 50자 이하이어야 합니다.")
private String nickname;
@NotBlank()
@Pattern(regexp = "^(010|011|016|017|018|019)-\\d{3,4}-\\d{4}$")
@Column(nullable = false)
private String phone;
@Past(message = "생년월일은 과거 날짜여야 합니다.")
@Temporal(TemporalType.DATE)
private Date birth;
@NotNull
private boolean use_yn;
@Size(max = 255, message = "이미지 URL은 최대 500자 이하이어야 합니다.")
private String imageProfile;
@NotNull
@Column(columnDefinition = "geometry(Point, 4326)")
private Point latLng;
@Size(max = 50, message = "주소는 최대 50자 이하이어야 합니다.")
private String address;
}
package com.sparta.temueats.user.service;
import com.sparta.temueats.user.dto.CreateUserRequest;
import com.sparta.temueats.user.entity.P_user;
import com.sparta.temueats.user.repository.UserRepository;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Point;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserRepository userRepository;
private final GeometryFactory geometryFactory = new GeometryFactory(); // GeometryFactory 인스턴스 생성
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void createUser(CreateUserRequest request) {
Point latLngPoint = geometryFactory.createPoint(new Coordinate(request.getLng(), request.getLat()));
P_user user = P_user.builder()
.email(request.getEmail())
.password(request.getPassword())
.nickname(request.getNickname())
.phone(request.getPhone())
.birth(request.getBirth())
.imageProfile(request.getImageProfile())
.latLng(latLngPoint)
.address(request.getAddress())
.use_yn(true)
.build();
userRepository.save(user);
}
}