본문 바로가기

IT/Python

[GeoCoding/GCP] DB(RDS)의 주소값을 위도,경도값으로 변경하여 삽입하기

 

이번에 하고 있는 공모전에서 살짝 문제가 생겼다.

클라이언트단(React native)에서 사용할 수 있는 google Map API를 이용했는데 파라미터가 무조건 경도 위도 값이어야 지도에 나타낼 수 있었다.

그래서 백에서 처리를 해서 값을 전달하려고 했으나 값이 이상하게 None 밖에 안 나오고 5시간 정도 진행했지만 해결이 안 됐다.

옆에서 안타깝게 보고 있던 언니가 클라이언트단에서 해결하겠다고 해서 언니한테 부탁했다.

 

그런데 클라이언트단에서 한글 주소 값을 받아 지도에 뿌려주는 것은 성공했으나 변환 시 속도가 느려 앱이 작동되는데 30초가 넘게 걸리는 문제가 생겼다.

 

해당 문제를 해결하기 위해 두 가지 방법을 생각했다.

첫 번째 백에서 API를 이용해서 Request가 있을 때마다 변환해서 클라이언트에 위도 경도 값을 전달하는 것.

두 번째 그냥 주소 값에 따른 위도 경도 칼럼을 만들어서 집어넣고 클라이언트에서 부를 때마다 그냥 DB에 값을 전달하는 것.

 

일단 나는 두 번째 방법을 선택했다.

이유는 첫 번째 방법의 경우 클라이언트 단과 똑같은 문제가 발생하였다.

속도가 빠르지 않았다. 그래서 현재 위치에 맞게 10개를 받아와서 뿌릴까 생각도 했지만 그것도 진짜 느릿느릿 작동되고 현재 위치에서 주변 10개를 찾는 것은 시간이 더 오래 걸릴 것이라 예상됐다.

 

그럼 두 번째 방법을 통해 DB에 저장해놓고 원할 때마다 Request 하기로 정했다.

그러면 두 번째 방법을 실행하기 위해서는 어떻게 해야 할까? 일일이 다 DB에 집어넣기? 컴퓨터과학과인 나는 자동으로 DB에 넣는 코드를 짜기로 결정했다.

 

그래서 쓰게 될 API는 Google Maps 중 GeoCoding API이다.

 

Google Maps Platform 시작하기  |  Google Developers

이 페이지에서는 Google Maps Platform의 API 및 SDK를 사용하기 위한 기본 필수 단계를 설명합니다. 빠른 시작 Google Cloud Console을 사용하여 결제 계정 또는 프로젝트를 만든 적이 없는 경우 아래의 시작

developers.google.com

 

1. GeoCoding 이란?

GeoCoding이란 주소를 경도 위도로 변환하거나 다른 어떠한 속성(지리적 좌표)들로 변환할 수 있는 프로세스로 이를 통해 지도에 마커를 찍거나 하는 데 사용할 수 있다.

 

Reverse GeoCoding은 역으로 지리적 좌표를 사람이 읽을 수 있는 주소로 변환하는 프로세스를 말합니다.

 

자세한 내용은 아래의 링크를 통해 볼 수 있다.

 

Get Started  |  Geocoding API  |  Google Developers

Geocoding converts addresses into geographic coordinates to be placed on a map. Reverse Geocoding finds an address based on geographic coordinates or place IDs.

developers.google.com

 

 

2. 사용 방법

*DB로는 Amazon에 RDS(Maria DB)를 사용하고 언어는 Python 사용할 예정이다.(DB는 아무거나 사용해도 상관없다)

테이블은 이런 식으로 구성되어있고 location칼럼의 값을 API를 사용하여 latitude와 longitude의 위도 경도 값으로 변경하려고 한다.

 

1) GCP에서 새 프로젝트를 생성한다. 

이름은 아무거나 적당히 정해준다.

 

2) Geocoding API를 찾아 사용을 누른다.

 

3) 사용자 인증 정보에서 Geocoding API에 관란 API 키를 만든다.

 

그럼 아래와 같이 API 키가 생성된다.

이제부터 해당 키를 사용하면 되고 API 설정은 끝났다!

 

4) 평소 사용하는 에디터를 켜고 콘솔 창에 명령어를 적어 패키지를 설치한다.

 

pip install -U googlemaps

 

5) 아래의 해당 코드를 적고 실행시킨다.

 

import googlemaps
import mysql.connector
import boto3
import os

ENDPOINT="DB의 엔드 포인트"
PORT="포트"
USR="유저 이름"
REGION="리전"
DBNAME="DB이름"
PWD="본인 비밀번호"
os.environ['LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN'] = '1'

session = boto3.Session(profile_name='default')
client = session.client('rds')

token = client.generate_db_auth_token(DBHostname=ENDPOINT, Port=PORT, DBUsername=USR, Region=REGION)
gmaps = googlemaps.Client(key='본인 키')

try:
    conn =  mysql.connector.connect(host=ENDPOINT, user=USR, passwd=PWD, port=PORT, database=DBNAME)
    cur = conn.cursor()
    cur.execute("select location from trash")#SQL문 실행
    query_results1 = cur.fetchall()
    for i in range(len(query_results1)):
        reverse_geocode_result = gmaps.geocode((query_results1[i][0]), language='ko')
        sql="update `trash` set `latitude`=%s where `id`=%s"
        cur.execute(sql,(reverse_geocode_result[0]['geometry']['location']['lat'],i+1))
        sql="update `trash` set `longitude`=%s where `id`=%s"
        cur.execute(sql,(reverse_geocode_result[0]['geometry']['location']['lng'],i+1))
        conn.commit()
        
except Exception as e:
    print("Database connection failed due to {}".format(e))

 

해당 코드를 실행시키면 저절로 값을 변환하여 DB에 저장시켜준다. 그럼 끝!!!

 

위도 경도가 잘 저장된 결과물을 볼 수 있다! 

 

 

오늘 느낀 것은 앞으로 어떤 노가다를 하든 컴퓨터 과학과답게 해결할 수 있는 방법을 찾아보자!!!