23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
출퇴근 시간대만 되면 오늘은 차가 안막힐지, 빨리 갈 수 있을지 걱정이 됩니다.
만약 6시 정시에 퇴근을 하는데, 고속도로가 심한 정체라면 어떻게 할까요
7시차를 타서 정체를 피해볼 수 있습니다!
하지만 매번 TMAP을 켜고 얼마나 걸리는지 확인하기는 번거롭죠.
TMAP API를 이용한다면 우리가 원하는 기능을 구현해볼 수 있습니다ㅎㅎ
FastAPI로 TMAP API를 활용한 백엔드 서버를 만들어보려고 합니다.
간단하게 출발지와 도착지를 입력하면, 시간이 어느정도 걸릴지 알려주는 API를 만들어 볼겁니다.
매우 복잡한 로직은 TMAP API에 맡기고, 우리는 결과만 받아서 쓸겁니다~ (API 만능설..)
본인 컴퓨터(로컬 서버)에서만 돌아가면, 외부에 공유하기 힘들겠죠? 계속 서버를 켜둬야 하기도 하고요.
그래서 Koyeb 를 이용해 우리가 만든 서버를 배포할 겁니다. 배포가 끝나면 url를 이용해 백엔드 서버를 외부에 공유할 수 있어요.
이렇게 만든 백엔드 서버는 홈페이지를 만들때 이용할 수도 있고, 카카오톡 이나 디스코드 같은 챗봇과 연계할 수도 있습니다.
자세한 설명은 다른 좋은 자료가 있습니다. 공식문서를 참고해봐도 됩니다.
간단하게 소개드리자면 파이썬 기반의 가벼우면서도 빠르고, 문서기능이 훌륭한 웹 프레임워크입니다.
Django와 Spring, React 와는 다르게 별다른 구조 없이도 서버가 동작합니다. Boilerplate가 없어도 main.py 파일 하나만 있어도 잘 동작합니다.
그래서 배우기 쉽고, 시작이 빠릅니다. 그러면서도 코드만 작성하면 Swagger 와 같은 문서화가 자동으로 따라옵니다.
Flask와 비슷하지만, 좀 더 현대적인 파이썬 문법을 이용하고 기능을 추가했습니다.
먼저 키워드를 받아서 해당 키워드의 위경도 값을 받아보겠습니다.
아래 엔드포인트를 이용하면 json 형태로 결과값을 받을 수 있습니다.
https://apis.openapi.sk.com/tmap/pois
키워드와 제일 유사한 위경도 값은 첫번째 자료에 있습니다.
result['searchPoiInfo']['pois']['poi'][0]
우리가 필요한건 latitude, longitude, name 값입니다. 이 데이터만 따로 딕셔너리로 반환해줍시다!
longitude: 경도 x값, latitude: 위도 y값
키워드만 입력하면 위경도를 알아낼 수 있게 됐습니다. 이제 이 두 좌표를 입력해 TMAP에게 도착시간을 물어보면 됩니다ㅎㅎ
이용할 API endpoint는 아래와 같습니다.
https://apis.openapi.sk.com/tmap/routes
출발지와 도착지의 위경도 값을 딕셔너리값으로 넣고 requests.post 호출을 해줍니다.
저희가 구하고자 하는 값은 result['features'][0]['properties']['totalTime'] 여기서 확인해볼 수 있습니다!
result['features'][0] 은 찾은 경로들의 첫번째 항목입니다. (여러가지 경로가 있을 수 있겠죠~ 그중에서 제일 최적이라고 보는 경로가 0번째!)
# tmap.py
import requests
import warnings
warnings.filterwarnings("ignore")
APP_KEY = 'YOUR_API_KEY' # https://openapi.sk.com/ 발급받으세요~
def get_total_time(start_poi, end_poi):
url = f'https://apis.openapi.sk.com/tmap/routes?version=1&appKey={APP_KEY}'
data = {
'startX': start_poi['longitude'],
'startY': start_poi['latitude'],
'endX': end_poi['longitude'],
'endY': end_poi['latitude']
}
response = requests.post(url, json=data, verify=False)
result = response.json()
total_time = result['features'][0]['properties']['totalTime']
return total_time
def get_poi_by_keyword(keyword):
"""
poi: points of interest
"""
url = f'https://apis.openapi.sk.com/tmap/pois?version=1&appKey={APP_KEY}&searchKeyword={keyword}'
response = requests.get(url, verify=False)
result = response.json()
first_poi = result['searchPoiInfo']['pois']['poi'][0]
latitude = first_poi['noorLat']
longitude = first_poi['noorLon']
name = first_poi['name']
poi = {
'latitude': latitude,
'longitude': longitude,
'name': name
}
return poi# main.py
from fastapi import FastAPI
import tmap
app = FastAPI()
@app.get("/hometime/")
async def hometime(start: str, end: str):
start_poi = tmap.get_poi_by_keyword(start)
end_poi = tmap.get_poi_by_keyword(end)
total_time = tmap.get_total_time(start_poi, end_poi)
return {"result": total_time}FastAPI의 query parameter 만 이용해서 구현해봤습니다.
API 사용자는 start, end 값만 문자열로 입력해주면 경로를 구할 수 있습니다.
이렇게 구현하는 방식을 Wrapping으로 볼수 있습니다.
사용자가 직접 TMAP API를 호출해서 구해볼 수 있지만, TMAP API를 학습해야 하죠.
컴팩트가 이를 재가공해서 API로 제공하면, 최소한의 노력으로 기능을 이용할 수 있습니다. 그저 직관적으로 출발지와 도착지만 입력하면 되죠~
예를 들면 챗봇에서 쓴다고 했을 때, UI, UX를 고려했을때 간단한 명령어만 소화할 수 있을겁니다. (챗봇 명령어 예시 @tmap SKT판교사옥 수지중학교)
requirements.txt 에 이용한 라이브러릴 입력하고 설치해줍니다.
fastapi
uvicorn
requestspython -m pip install -r requirements.txt
서버를 실행하고 접속합니다.
uvicorn main:app --host 0.0.0.0 --port 8000
로컬 서버까지 배포해봤습니다. 이제 클라우드에 배포해볼 차례입니다.
Koyeb, Heroku, AWS 등 여러가지 플랫폼이 있지만 무료로 사용할 수 있고, 사용성이 간편한 Koyeb을 이용하고자 합니다.
회원가입하고, 위 파일들에서 Procfile만 작성하면 Koyeb에 FastAPI 서버를 배포할 수 있습니다.
Procfile
web: uvicorn main:app --port ${PORT:-8000} --host 0.0.0.0https://free-stormy-jaehunsim-b464ad38.koyeb.app/docs
(TMAP API를 사용하기 때문에.. 나중에 TMAP API를 입력해야 사용할 수 있도록 변경할 예정입니다)
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.