데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      집 가고 싶은 출퇴근러의 백엔드 만들기 (FastAPI와 TMAP API, Koyeb)

      심재훈 24.06.14
      4,709 20 3
      DEVOTEE 요약
      출퇴근 시간의 교통 체증을 해결하기 위해 FastAPI와 TMAP API를 이용한 백엔드 서버를 개발하여 출발지와 도착지를 입력하면 시간 예측 정보를 제공하는 프로젝트입니다. FastAPI는 빠르고 문서화가 자동으로 되는 파이썬 기반 웹 프레임워크로, TMAP API로부터 경로와 소요 시간을 받아서 보여줍니다. 개발한 서버는 로컬뿐 아니라 Koyeb와 같은 플랫폼에 배포하여 외부에서도 사용할 수 있도록 합니다.
      DEVOTEE 추천 블로그

      출퇴근 시간대만 되면 오늘은 차가 안막힐지, 빨리 갈 수 있을지 걱정이 됩니다.


      만약 6시 정시에 퇴근을 하는데, 고속도로가 심한 정체라면 어떻게 할까요

      7시차를 타서 정체를 피해볼 수 있습니다!

      하지만 매번 TMAP을 켜고 얼마나 걸리는지 확인하기는 번거롭죠.

      TMAP API를 이용한다면 우리가 원하는 기능을 구현해볼 수 있습니다ㅎㅎ

      image.png


      1. 만들어볼 프로젝트 소개

      FastAPI로 TMAP API를 활용한 백엔드 서버를 만들어보려고 합니다.

      간단하게 출발지와 도착지를 입력하면, 시간이 어느정도 걸릴지 알려주는 API를 만들어 볼겁니다.

      매우 복잡한 로직은 TMAP API에 맡기고, 우리는 결과만 받아서 쓸겁니다~ (API 만능설..)


      본인 컴퓨터(로컬 서버)에서만 돌아가면, 외부에 공유하기 힘들겠죠? 계속 서버를 켜둬야 하기도 하고요.

      그래서 Koyeb 를 이용해 우리가 만든 서버를 배포할 겁니다. 배포가 끝나면 url를 이용해 백엔드 서버를 외부에 공유할 수 있어요.

      이렇게 만든 백엔드 서버는 홈페이지를 만들때 이용할 수도 있고, 카카오톡 이나 디스코드 같은 챗봇과 연계할 수도 있습니다.


      2. FastAPI 소개

      image.png

      자세한 설명은 다른 좋은 자료가 있습니다. 공식문서를 참고해봐도 됩니다.

      간단하게 소개드리자면 파이썬 기반의 가벼우면서도 빠르고, 문서기능이 훌륭한 웹 프레임워크입니다.

      Django와 Spring, React 와는 다르게 별다른 구조 없이도 서버가 동작합니다. Boilerplate가 없어도 main.py 파일 하나만 있어도 잘 동작합니다.

      그래서 배우기 쉽고, 시작이 빠릅니다. 그러면서도 코드만 작성하면 Swagger 와 같은 문서화가 자동으로 따라옵니다.

      Flask와 비슷하지만, 좀 더 현대적인 파이썬 문법을 이용하고 기능을 추가했습니다.


      3. Tmap API로 로컬에서 기능 구현

      3-1. get_poi_by_keyword

      먼저 키워드를 받아서 해당 키워드의 위경도 값을 받아보겠습니다.

      아래 엔드포인트를 이용하면 json 형태로 결과값을 받을 수 있습니다.

      https://apis.openapi.sk.com/tmap/pois


      키워드와 제일 유사한 위경도 값은 첫번째 자료에 있습니다.

      result['searchPoiInfo']['pois']['poi'][0]

      우리가 필요한건 latitude, longitude, name 값입니다. 이 데이터만 따로 딕셔너리로 반환해줍시다!

      longitude: 경도 x값, latitude: 위도 y값

      3-2. get_total_time

      키워드만 입력하면 위경도를 알아낼 수 있게 됐습니다. 이제 이 두 좌표를 입력해 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

      3-3 FastAPI main.py 작성

      # 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
      requests

      python -m pip install -r requirements.txt


      서버를 실행하고 접속합니다.

      uvicorn main:app --host 0.0.0.0 --port 8000

      http://127.0.0.1:8000/docs

      image.png


      4. Koyeb에 배포해보기

      로컬 서버까지 배포해봤습니다. 이제 클라우드에 배포해볼 차례입니다.

      Koyeb, Heroku, AWS 등 여러가지 플랫폼이 있지만 무료로 사용할 수 있고, 사용성이 간편한 Koyeb을 이용하고자 합니다.

      https://www.koyeb.com/

      회원가입하고, 위 파일들에서 Procfile만 작성하면 Koyeb에 FastAPI 서버를 배포할 수 있습니다.


      Procfile

      web: uvicorn main:app --port ${PORT:-8000} --host 0.0.0.0

      image.png

      https://free-stormy-jaehunsim-b464ad38.koyeb.app/docs

      (TMAP API를 사용하기 때문에.. 나중에 TMAP API를 입력해야 사용할 수 있도록 변경할 예정입니다)

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      심재훈 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기