DB에 저장된 (x, y) 좌표, 반올림 되는 문제

Alex·2024년 8월 4일
0

Seoul_Nolgoat

목록 보기
9/11

문제 상황

SeoulNolgoat은 서울의 1차, 2차, 3차 회식 조합을 추천해준다. 이때, 추천 기준 중 하나가 현재 이용자와의 거리다. 실제 거리가 어느정도로 떨어져 있는지 확인하려면 TMapi API를 호출해서 보행자 거리와 시간을 확인해야 한다.

그런데, API를 호출했을 때 에러가 발생했다.

"{ "error":{ "id":"400", "category":"tmap", "code":"1007", "message":"사용할 수 없는 좌표계입니다. 사용 가능한 좌표계를 확인해주세요.([badrequest]waypoints are too near. 100)" }}

후술하겠지만, DB에 들어갔던 가게들의 (x,y)좌표가 반올림되면서 가게들의 좌표가 동일해졌기 때문에 발생한 문제였다. 그래서, 거리가 너무 가깝다는 에러가 계속 반환됐던 것이다.

원인 분석

우선, TMap에서 제공하는 에러코드에 대한 설명을 확인했다.

별다른 단서를 찾을 수 없었다.
API 호출되는 부분을 해봤다. 더 자세한 내용을 확인할 수 있었다.

좌표들이 너무 가깝다

왜 이런 에러가 나는지 확인하기 위해서

TMap API를 호출할 때 어떤 가게들이 매개변수로 들어가는지 알아봤다.
예전에 이런 에러가 났을 때 확인해보니 한 가게가 중복돼서 들어간 탓에 가게1에서부터 가게1까지의 보행자 거리를 구해달라는 요청을 보내게됐고, 그 탓에 "가게가 너무 가깝다"라는 에러가 반환됐기 때문이다.

다만, 확인해봐도 1차 2차 3차 가게들 모두 서로 다른 가게였다.

가게 이름만 봐서는 문제의 원인을 파악할 수 없어서
좀더 상세하게 정보를 로그로 남겼다.

try~catch 구문을 활용해서 예외가 발생했을 때 그 가게들의 이름과 좌표를 출력하도록 한 것이다.

좌표를 보니 경유지1과 경유지2의 x, y좌표가 동일했다.

경유지1과 경유지2에 동일한 가게인 상황일 수도 있다.
Tmap 호출 전 모든 조합들의 가게 이름을 로그로 남겼다.

조합 중에 중복되는 가게는 없었다.
원인은 다른 곳에 있다.

TMap API 호출 과정의 로그를 더 자세하게 찍었다.

원인을 찾았다.

[김춘기 꽃삼겹, 생활맥주, 명오뎅빠, 코끼리등갈비]

[유목원, 어게인]

이 가게들은 다른 가게임에도 (x, y)좌표가 동일했다.

두 가지 가설

생각해볼 수 있는 가설은 크게 두 가지다.

1)db에 데이터가 잘못 들어갔다.

2)가게가 너무 가까워서 동일한 좌표로 찍히는 가게다.

1번 가설을 확인해보기 위해서 우선 DB에서 가게들을 조회하고
이 가게들의 주소를 카카오Map API에서 다시 호출해서 좌표를 확인했다.

(우리는 처음에 서울시에서 제공하는 공공데이터를 받아서, 각각의 가게들을 카카오맵 API를 활용해서 좌표를 변환해주었다. 공공데이터에서는 중부원점 TM 좌표계를 사용하고, 카카오맵 API에서는 WGS84 좌표계를 사용했기 때문에 공공데이터의 좌표와 카카오데이터의 좌표가 완전히 일치하지 않았다. 카카오맵에서는 가게의 추가 정보를 가져오고, TMap을 통해서는 가게간의 보행자거리를 계산했는데 이 두개 모두 WGS84 좌표계를 사용했기 때문에 이러한 변환 과정이 필요했다)

가게들을 하나씩 확인해보니 카카오맵에서 제공하는 좌표와 DB에 들어간 좌표가 달랐다. 자세히 보니 8~9번째 자리에서 반올림이 됐다.

코드에 어떤 문제가 있었나? 싶어서 확인해봤는데 원인이 파악되지는 않았다. DB 데이터를 지우고 데이터를 넣는 코드를 다시 작동시켰을 때는 반올림되지 않았다.

찝찝해서 구글링해서 원인을 찾아봤다.

근사치를 갖고서 계산을 한다는 게 문제이지 않을까?

혹시 몰라 스택오버플로우도 확인해봤따.

좀더 찾아보니 double이 근사치를 담는다는 게 문제가 될 수도 있을 거 같다.

즉, 3.4를 넣으려고 해도
3.4000000303234 이런식으로 데이터가 담기니까 그 과정에서 round가 된 게 아닐까? 그런데, 처음에는 반올림됐는데 그 이후에는 반올림이 안 된 이유가 궁금하다. 다음부터는 이런 문제가 발생하지 않도록 DECIMAL 컬럼을 이용해야겠다.

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글