FastAPI를 사용하여 지도 서비스 구현하기

지도 서비스는 인터넷 상에서 위치 정보를 시각화해주는 서비스입니다. 이번 포스트에서는 FastAPI를 사용하여 간단한 지도 서비스를 구현하는 방법을 알아보겠습니다.

개요

이번 프로젝트에서는 FastAPI를 사용하여 RESTful API를 구현하고, 클라이언트에서 요청한 위치 정보를 응답으로 반환하는 서비스를 만들 것입니다. 구현할 기능은 다음과 같습니다.

  1. 사용자가 좌표를 입력하면 해당 좌표와 가까운 장소들을 응답으로 반환합니다.
  2. 응답으로 받은 장소들은 지도에 표시됩니다.

준비물

이번 프로젝트를 구현하기 위해 다음과 같은 준비물이 필요합니다.

프로젝트 구조

프로젝트를 구현하기 위해 다음과 같은 디렉토리 구조를 사용합니다.

project/
├── main.py
└── database.py

API 구현

먼저, API를 구현하기 위해 main.py 파일을 열고 다음과 같이 코드를 작성합니다.

from fastapi import FastAPI

app = FastAPI()

@app.get("/places")
def get_nearby_places(latitude: float, longitude: float, radius: int):
    # 주어진 좌표와 반경 내에 있는 장소들을 데이터베이스에서 가져옴
    places = get_places_from_database(latitude, longitude, radius)
    return {"places": places}

위 코드는 /places 엔드포인트를 생성하고, 클라이언트로부터 latitude, longitude, radius를 파라미터로 받아와 해당 조건에 맞는 장소들을 반환하는 함수를 정의합니다. 함수 get_places_from_database는 데이터베이스로부터 장소들을 가져오는 로직을 담당합니다.

다음으로, database.py 파일을 열고 다음과 같이 코드를 작성합니다.

import sqlite3

def get_places_from_database(latitude: float, longitude: float, radius: int):
    db_conn = sqlite3.connect("places.db")
    cursor = db_conn.cursor()
    cursor.execute("SELECT * FROM places WHERE latitude BETWEEN ? AND ? AND longitude BETWEEN ? AND ?", (
        latitude - radius, latitude + radius, longitude - radius, longitude + radius
    ))
    places = cursor.fetchall()
    cursor.close()
    db_conn.close()
    return places

위 코드는 places.db라는 SQLite 데이터베이스에 연결하고, 주어진 좌표와 반경 내에 있는 장소들을 조회하는 SQL 문을 실행합니다.

실행 및 테스트

이제 코드를 작성했으므로, 프로젝트를 실행하고 테스트해보겠습니다.

  1. 터미널에서 uvicorn main:app --reload 명령을 실행하여 FastAPI 앱을 실행합니다.
  2. 브라우저나 API 클라이언트를 사용하여 http://localhost:8000/places?latitude=37.5&longitude=-122.3&radius=10 주소로 요청을 보냅니다.
    • 위 예시는 위도 37.5, 경도 -122.3 위치에서 10km 반경 내의 장소들을 조회하는 예시입니다.
  3. API는 주어진 요청에 대한 응답으로 장소들을 반환합니다.

마무리

이번 포스트에서는 FastAPI를 사용하여 간단한 지도 서비스를 구현하는 방법을 알아보았습니다. FastAPI는 파이썬으로 빠르고 효율적인 RESTful API를 구현하기에 매우 유용한 도구입니다.

이제 여러분은 이 기본적인 예제를 바탕으로 더 복잡한 지도 서비스를 구현할 수 있을 것입니다. 좀 더 다양한 기능을 추가하거나 클라이언트 애플리케이션과 연동하는 등 여러 방향으로 확장할 수 있습니다.