[프로젝트] 00. API 분석

손아현·2025년 7월 7일

MS DataSchool

목록 보기
5/8
post-thumbnail

프로젝트 실습을 하다 보면 거의 무조건 등장하는 단어, 바로 API다.

API가 뭐냐고 물어보면…
"기능이든 데이터든 불러오게 해주는 뭔가?" 라고 대답하긴 하는데,
막상 정확히 설명하려면 잘 모르겠다.

그래서 이번 글에서는 API가 도대체 뭔지, 왜 필요한지, 어떻게 쓰는지
그리고 내가 직접 써본 SerpApi – Google Flights Price Insights 예시를 통해
실전 감각까지 정리해보려 한다.

1. API 이론

개념 이해 (왜 필요한가)

API는 Application Programming Interface의 약어로,
결국엔 Interface! 즉, 어떤 대상들 간의 소통 창구 역할을 하는 것이다.

아래 영상이 아주 쉽게 설명하고 있다.
참고자료) https://youtu.be/Jg3FFBLyhK0?si=rm8Zs67eKfOxgGDI

  • 인터페이스란?

    • 어떤 대상들 간의 소통 창구를 하는 것일텐데
    • 그 대상이 "사람-기계/기계-기계"가 될 수 도 있다.
  • 흔히 얘기하는 UI(User Interface)는 "사람-기계"를 연결하는 인터페이스를 의미하는 것이다.

    • ex) 사용자가 배달 어플의 "주문하기" 버튼을 눌러서 요청을 하는 과정에서의 '버튼 역할'
  • 반면에, API(Application Programming Interface)는 "Application"이기 때문에, "기계(앱)-기계" 간의 인터페이스에 해당하는 것이다.

즉, UI는 사용자용, API는 앱끼리 소통하는 접점이라 할 수 있겠다.

실제로 API가 쓰이는 방식

추가로, 아래는 함께 자주 쓰이는 용어들인데, 이들은 곧 사용하는 과정들 중 일부에 대한 의미를 가지고 있다.

  • REST API란?
    👉 주소(URL)와 규칙을 따라 요청/응답을 주고받는 방식

  • JSON이란?
    👉 대부분의 API가 주고받는 데이터 포맷. 응답은 대부분 JSON이라는 형식으로 온다.

요약하자면…

용어한 줄 설명
API프로그램끼리 대화하기 위한 규칙
REST API주소(URL) 기반으로 주고받는 API
JSON데이터를 주고받는 데 쓰이는 표준 형식

2. 실습


나는 MS Datashcool에서 실시간 데이터를 분석하는 커리큘럼을 배우고 있고, 이제 실제로 프로젝트를 하기 위해
실시간으로 데이터를 불러올 수 있는 API를 찾고 있었다.

그 중
https://serpapi.com/google-flights-api
를 알게 되어 소개 및 분석해보고자 한다.

SerpApi 란?

SerpApi는 Google, Apple, Amazon, Ebay, Naver, Youtube 등 주요 웹들이란 웹들을 모두 대상으로,
UI를 자동으로 분석해서 데이터를 추출해주는 사이트이다.

가격 플랜이 있지만, 나는 늘 그렇듯..^^ free plan
무료 플랜으로도 월 100회 호출이 가능해서
작은 프로젝트에는 딱 적당하다.

✈️Google_Flights_Price Insights API

나는 SerpApi가 제공하는 수많은 api들 중에서도
실시간 항공권 정보를 제공하는 Google Flights API를 사용해보고자 한다.
https://serpapi.com/google-flights-price-insights

응답(JSON) 데이터 구조

  1. lowest_price

    • 형식: Integer
    • 설명: 반환된 항공편 중에서 가장 저렴한 가격
    • ex) "lowest_price": 350
  2. price_level

    • 형식: String
    • 설명: 가장 저렴한 가격의 수준(low, medium, high)
    • ex) "price_level": "low"
  3. typical_price_range

    • 형식: Array
    • 설명: 항공권의 일반적인 가격 범위
    • ex) "typical_price_range": [150, 450]
  4. price_history

    • 형식: Array
    • 설명: 가격 변동 이력
    • ex) 타임스탬프와 해당 시점의 가격(price)
      "price_history":
      [[1691013600, 250],
      [1691100000, 270],
      [1691196400, 300]]

API 사용 흐름 예시

📍 Step 1. GET 요청 (브라우저나 Python 코드로)

GET https://serpapi.com/search.json?engine=google_flights&departure_id=CDG&arrival_id=AUS&outbound_date=2025-07-08&return_date=2025-07-14&currency=EUR&hl=en

📍 Step 2. Python 코드

  • 원하는 조건(출발/도착지, 날짜 등)을 딕셔너리로 정의해서, 이걸 SerpApi 서버에 넘기면 해당 조건의 항공권 정보를 가져와준다.
  • 📌 공항 코드는 IATA 코드 사용 (예: ICN, LAX, NRT 등)
from serpapi import GoogleSearch

params = {
  "engine": "google_flights",
  "departure_id": "CDG",
  "arrival_id": "AUS",
  "outbound_date": "2025-07-08",
  "return_date": "2025-07-14",
  "currency": "EUR",
  "hl": "en",
  "api_key": "YOUR_API_KEY"
}

# 위에서 정의한 params 조건을 기반으로 검색 객체 생성
search = GoogleSearch(params)

# SerpApi에 실제 요청을 보내고,
결과를 파이썬 딕셔너리 형태로 응답받음 (JSON → dict)
results = search.get_dict()
price_info = results["price_insights"]

마지막 줄 코드
price_info = results["price_insights"]
우리가 불러오고자 했던 가격 정보가 "price_insights" 블록에 있으므로,
거기서만 필요한 정보만 꺼내서 변수에 저장한 거다.

📍 Step 3. JSON 응답 예시

"price_insights": {
  "lowest_price": 1339,
  "price_level": "high",
  "typical_price_range": [570, 1050],
  "price_history": [
    [1691013600, 575],
    [1696197600, 1339]
  ]
}

❇️ 활용 - 다양한 항공편의 price insights를 한번에 수집

지금은 params에
"departure_id": "CDG",
"arrival_id": "AUS",
와 같이 특정 출발지와 도착지를 설정하도록 되어 있는데,

우리 프로젝트에서는 다양한 경로의 항공권 가격을 알려줘서, 이를 보고 사용자가 해외여행지를 선택하도록 하는 것이 목적이기 때문에

다양한 출발지 → 도착지 항공편의 price insights를 한 번에 수집해야 한다.

최대한 효율적으로 보여줄 수 있는 방법을 고민하다가
아래 3가지 방식을 정리해봤다.

요청 방식 3가지

1. 사용자가 출발지/도착지를 직접 선택 (단일 요청)

  • 사용자가 출발/도착 공항을 직접 입력했을 때, 결과 보이도록 함
  • 특정 노선만 요청되므로
    API 호출 수는 요청마다 1회 ⇒ 프로젝트가 데모 정도이므로, 호출 수는 충분
  • 단, 사용자 UX 상 직관성이 떨어질 수 있음 (무슨 공항 코드를 입력해야 하지?)

2. '출발지 × 도착지' 조합으로 모든 노선 요청 (조합 방식)

departure_list = ["ICN", "NRT", "LAX"]
arrival_list = ["NYC", "CDG", "SYD"]
  • 출발지 리스트 × 도착지 리스트의 모든 조합에 대해 반복 호출
  • 위 예시의 경우, 3 × 3 = 9회 / 더 늘어나면 호출량 급증
  • 비용 및 시간 부담 큼
  • Free Plan 제한(월 100회) 쉽게 도달
  1. 미리 정해둔 인기 노선 리스트 기반 호출 ✨
popular_routes = [
    ("ICN", "TYO"),
    ("ICN", "CDG"),
    ("ICN", "SYD"),
    ("ICN", "LAX"),
    ("ICN", "NYC"),
    ("ICN", "BKK")
]
  • 실제로 많이 검색되는 인기 노선만 미리 지정
  • 간단한 loop로 호출 가능
  • 사용자에게 직관적인 화면 제공 가능
  • 호출 수 관리 쉬움 (Free Plan 내 충분)

💡 결론

⇒ 지금은 3번으로 시작하고, 확장 여지는 1번으로!

  • 초기 MVP 단계에선 3번 방식(인기 노선 리스트 기반)이 가장 효율적
  • 추후엔 필터 UI를 만들어 사용자가 직접 출발지/도착지를 선택해 요청하는 구조(1번)로 확장 가능

최종 요청 코드

추가로 날짜(기간) 역시 defalut 값은 있되, 사용자가 다른 값을 선택하면 그 값을 반영하도록 했다.

from serpapi import GoogleSearch
from datetime import datetime, timedelta
from time import sleep

# 사용자 입력 
### 출발지, 도착지 - 사용자가 필터 걸었을 경우 예시
departure_list = ["ICN", "NRT", "LAX"]
arrival_list = ["NYC", "CDG", "SYD"]
### 여행 기간 - default 값으로 10일 설정(사용자 선택에 따라 변경 가능)
days = 7

# 날짜 계산 (오늘 날짜 기준 + 여행 기간 설정)
today = datetime.today()
outbound_date = (today + timedelta(days=7)).strftime('%Y-%m-%d')  # 기본 출국일 (7일 뒤)
return_date = (today + timedelta(days=7 + days)).strftime('%Y-%m-%d')  # 기본 귀국일 (7일 + 사용자가 선택한 기간)

API_KEY = "YOUR_API_KEY"
CURRENCY = "KRW"  # 원화
LANGUAGE = "ko"  # 한국어

# 인기 노선 리스트 설정 - 사전에 정의
popular_routes = [
    ("ICN", "TYO"),
    ("ICN", "CDG"),
    ("ICN", "SYD"),
    ("ICN", "LAX"),
    ("ICN", "NYC"),
    ("ICN", "BKK")
]

# 요청 URL 설정 (이 부분은 SerpApi에서 자동으로 처리)
for dep, arr in popular_routes:
    params = {
        "engine": "google_flights",
        "departure_id": dep,
        "arrival_id": arr,
        "outbound_date": outbound_date,  # 사용자가 선택한 출국일
        "return_date": return_date,      # 사용자가 선택한 귀국일
        "currency": CURRENCY,            # 원화
        "hl": LANGUAGE,                  # 한국어
        "api_key": API_KEY               # SerpApi API 키
    }

    try:
        search = GoogleSearch(params)  # GoogleSearch 객체 생성
        result = search.get_dict()     # 응답 받기

        if "price_insights" in result:  # price_insights가 포함되었을 때
            info = result["price_insights"]
            
            ## 기본 가격 정보
            print(f"{dep} → {arr}: {info['lowest_price']} 원 | 가격 수준: {info['price_level']}")
            
            ## "상세 보기"에 활용할 정보
            # typical_price_range (일반적인 가격 범위)
            typical_price_range = info.get("typical_price_range", "정보 없음")
            print(f"일반적인 가격 범위: {typical_price_range[0]}원 ~ {typical_price_range[1]}원")
            
            # price_history (가격 변동 이력)
            price_history = info.get("price_history", [])
            if price_history:
                print("가격 변동 이력:")
                for timestamp, price in price_history:
                    date = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
                    print(f"날짜: {date}, 가격: {price}원")
            else:
                print("가격 변동 이력: 정보 없음")
            
        else:
            print(f"{dep} → {arr}: 가격 정보 없음")

    except Exception as e:
        print(f"Error on {dep} → {arr}: {e}")

    sleep(2)  # 호출 제한 방지 (Rate Limiting)

❇️ Azure와 연결하면?

이제 이 데이터를 Azure Function으로 주기적으로 수집하도록 설정하는 과정을 정리해보겠다.

  1. Azure Portal에서 Function App을 생성
  2. Function App 내에서 HTTP Trigger를 생성하여 API 호출을 설정
  3. 항공 가격 API(SerpApi)를 호출하는 Python 코드를 작성 (function_app.py)

이후에는
Azure Data Factory로 저장/정제하고,
Power BI로 시각화해서
구현해볼 수 있겠다!

profile
서비스기획/.AI/데이터분석

0개의 댓글