Spring Boot

[spring] 위도 경도를 받아서 Point형으로 db에 저장하기(Mysql 위치데이터)

뇌장하드 2022. 3. 20. 12:11

 

 

현재 프로젝트를 하던중에 위치서비스를 구현하려고 프론트에서 현재 사용자의 위치정보를 보내면 db에 저장을 하는 로직이 있습니다.

 

위치정보는 처음 다뤄보는경우이기 떄문에 먼저 리엑트네이티브에서 어떤식으로 보내는지를 살펴보았습니다.

Geolocation.getCurrentPosition함수를 사용하면 

{
      coords:
        {
            accuracy:5,
            altitude:0,
            altitudeAccuracy:-1,
            heading:-1,
            latitude:37.55,
            longitude:127.0165,
            speed:-1,}
        ,timestamp:1597336350546.098,
    }

이런식으로 결과값을 보내는것을 확인하고 그럼 프론트에서 는 위도,경도만 파싱후에 보내줄거라고 생각을 했습니다.

@Data
public class CapsuleRequest {
    String title;
    String content;
    String nickname;
    Long recipient;
    Long duration;
    //위도
    Double latitude;
    //경도
    Double longitude;

    public Capsule toCapsule(Account account, LocalDateTime currentDate) {
        Capsule capsule=new Capsule();
        capsule.addAccount(account);
        capsule.setCapsuleTitle(title);
        capsule.setCapsuleContent(content);
        capsule.setNickname(nickname);
        capsule.setRecipient(recipient);
        capsule.setDuration(currentDate.plusDays(duration));
        capsule.setIsOpened(false);
        capsule.setLocation(capsule.setLocationFunc(latitude,longitude));
        capsule.setSenderId(account.getKakaoId());
        return capsule;
    }
}

컨트롤러에서 받을 dto을 만들어주고 double 형으로 받아줍니다.

 

 

{
"title" : "캡슐 제목", "content" : "캡슐 내용", 
"nickname" : "벼락맞은 대추나무","recipient" : "111111111", 
"duration" : "3",
"latitude":  "37.411599560478315 ", 
"longitude" : "127.12879328580749"
}

위에 json은 위치과 경도를 프론트에서 보낸다고 예상을 하고 만들어본것입니다.

 

이제 들어온 double형의 위도 경도를 위치 정보인 Point형으로 변환을 해보겠습니다.

    public Point setLocationFunc(double latitude, double longitude){
        Point now=new Point();
        log.info("위도: {}, 경도 {}",latitude,longitude);
        now.setLocation(latitude,longitude);
        log.info("----------------------------");
        log.info("Point 변환후 좌표 :{}",now.toString());
        return now;
    }

이렇게 함수를 만들고 postman으로 테스트를 해보았습니다.

잉? 왜 소수점이 다 날라가버렸지?

결과 값을 보고 소수점이 싹다 날라가고 37,127 만 띡 나와버렸습니다.

순간 "위치에는 완전 자세한 소수점이 필요없나?" 라고 생각을 하고  위치를 찍어봤습니다.

예상한 위치(야탑역)
결과로 받은 위치(평택의 어느곳)

이걸보고 소수점은 무저건 필요하구나 라고 생각을 하고 구글리을 해본결과 

    public Point2D.Double setLocationFunc(double latitude, double longitude){
        Point2D.Double now=new Point2D.Double();
        log.info("위도: {}, 경도 {}",latitude,longitude);
        now.setLocation(latitude,longitude);
        log.info("----------------------------");
        log.info("Point 변환후 좌표 :{}",now.toString());
        return now;
    }

Point2D형에 double로 해주면 될거 같아서 적용을 해보니

 제가 원하는 소수점 까지 저장이 되었습니다.

db에는 point형으로 잘 저장이 된것을 확인할수 있습니다.

location에 잘저장이 되었다.

그래서 위치 정보를 저장하려면 

Point형이 아닌 Point2D형중에서 double,float이나 등등 원하는 형태로 저장이 가능하고 Point를 사용해서 두점 사이의 거리 이러한 기능들을 써보아서 기준점 기준으로 반경을 구해서 db에 저장을 하는 방식을 추가적으로 구현 하려고 합니다.