
프로젝트 실습을 하다 보면 거의 무조건 등장하는 단어, 바로 API다.
API가 뭐냐고 물어보면…
"기능이든 데이터든 불러오게 해주는 뭔가?" 라고 대답하긴 하는데,
막상 정확히 설명하려면 잘 모르겠다.
그래서 이번 글에서는 API가 도대체 뭔지, 왜 필요한지, 어떻게 쓰는지
그리고 내가 직접 써본 SerpApi – Google Flights Price Insights 예시를 통해
실전 감각까지 정리해보려 한다.
API는 Application Programming Interface의 약어로,
결국엔 Interface! 즉, 어떤 대상들 간의 소통 창구 역할을 하는 것이다.
아래 영상이 아주 쉽게 설명하고 있다.
참고자료) https://youtu.be/Jg3FFBLyhK0?si=rm8Zs67eKfOxgGDI
인터페이스란?
흔히 얘기하는 UI(User Interface)는 "사람-기계"를 연결하는 인터페이스를 의미하는 것이다.
반면에, API(Application Programming Interface)는 "Application"이기 때문에, "기계(앱)-기계" 간의 인터페이스에 해당하는 것이다.
즉, UI는 사용자용, API는 앱끼리 소통하는 접점이라 할 수 있겠다.
추가로, 아래는 함께 자주 쓰이는 용어들인데, 이들은 곧 사용하는 과정들 중 일부에 대한 의미를 가지고 있다.
REST API란?
👉 주소(URL)와 규칙을 따라 요청/응답을 주고받는 방식
JSON이란?
👉 대부분의 API가 주고받는 데이터 포맷. 응답은 대부분 JSON이라는 형식으로 온다.
요약하자면…
| 용어 | 한 줄 설명 |
|---|---|
| API | 프로그램끼리 대화하기 위한 규칙 |
| REST API | 주소(URL) 기반으로 주고받는 API |
| JSON | 데이터를 주고받는 데 쓰이는 표준 형식 |
나는 MS Datashcool에서 실시간 데이터를 분석하는 커리큘럼을 배우고 있고, 이제 실제로 프로젝트를 하기 위해
실시간으로 데이터를 불러올 수 있는 API를 찾고 있었다.
그 중
https://serpapi.com/google-flights-api
를 알게 되어 소개 및 분석해보고자 한다.
SerpApi는 Google, Apple, Amazon, Ebay, Naver, Youtube 등 주요 웹들이란 웹들을 모두 대상으로,
UI를 자동으로 분석해서 데이터를 추출해주는 사이트이다.

가격 플랜이 있지만, 나는 늘 그렇듯..^^ free plan
무료 플랜으로도 월 100회 호출이 가능해서
작은 프로젝트에는 딱 적당하다.
나는 SerpApi가 제공하는 수많은 api들 중에서도
실시간 항공권 정보를 제공하는 Google Flights API를 사용해보고자 한다.
https://serpapi.com/google-flights-price-insights
lowest_price
price_level
typical_price_range
price_history
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¤cy=EUR&hl=en
- 원하는 조건(출발/도착지, 날짜 등)을 딕셔너리로 정의해서, 이걸 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" 블록에 있으므로,
거기서만 필요한 정보만 꺼내서 변수에 저장한 거다.
"price_insights": {
"lowest_price": 1339,
"price_level": "high",
"typical_price_range": [570, 1050],
"price_history": [
[1691013600, 575],
[1696197600, 1339]
]
}
지금은 params에
"departure_id": "CDG",
"arrival_id": "AUS",
와 같이 특정 출발지와 도착지를 설정하도록 되어 있는데,
우리 프로젝트에서는 다양한 경로의 항공권 가격을 알려줘서, 이를 보고 사용자가 해외여행지를 선택하도록 하는 것이 목적이기 때문에
다양한 출발지 → 도착지 항공편의 price insights를 한 번에 수집해야 한다.
최대한 효율적으로 보여줄 수 있는 방법을 고민하다가
아래 3가지 방식을 정리해봤다.
1. 사용자가 출발지/도착지를 직접 선택 (단일 요청)
2. '출발지 × 도착지' 조합으로 모든 노선 요청 (조합 방식)
departure_list = ["ICN", "NRT", "LAX"]
arrival_list = ["NYC", "CDG", "SYD"]
popular_routes = [
("ICN", "TYO"),
("ICN", "CDG"),
("ICN", "SYD"),
("ICN", "LAX"),
("ICN", "NYC"),
("ICN", "BKK")
]
💡 결론
⇒ 지금은 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 Function으로 주기적으로 수집하도록 설정하는 과정을 정리해보겠다.
이후에는
Azure Data Factory로 저장/정제하고,
Power BI로 시각화해서
구현해볼 수 있겠다!