Flask를 사용해서 위에서 정의한 카드 콜렉션 자료구조의 CRUD 및 검색 기능을 제공하는 간단한 RESTful API 서버 샘플을 만들어볼게요.
🧱 구조 개요
- /cards
POST: 카드 추가
GET: 모든 카드 조회 - /cards/<id>
GET: 특정 카드 조회
PUT: 카드 업데이트
DELETE: 카드 삭제 - /search
GET: 키워드로 검색
🐍 Flask 기반 샘플 코드
from flask import Flask, request, jsonify
from dataclasses import dataclass, field, asdict
from datetime import date
from typing import List, Dict, Optional, Union
import uuid
app = Flask(__name__)
# ----------- 카드 모델 정의 -----------
@dataclass
class BaseCard:
id: str = field(default_factory=lambda: str(uuid.uuid4()))
title: str = ""
last_updated: date = field(default_factory=date.today)
@dataclass
class DataCard(BaseCard):
description: str = ""
data_source: str = ""
variables: List[Dict[str, str]] = field(default_factory=list)
collection_method: str = ""
time_coverage: str = ""
geographic_coverage: str = ""
quality_notes: Optional[str] = None
usage_notes: Optional[str] = None
@dataclass
class MetaCard(BaseCard):
metadata: Dict[str, str] = field(default_factory=dict)
@dataclass
class HistoryCard(BaseCard):
change_log: List[str] = field(default_factory=list)
@dataclass
class StatsCard(BaseCard):
metrics: Dict[str, Union[int, float]] = field(default_factory=dict)
summary: str = ""
CardTypes = {
'data': DataCard,
'meta': MetaCard,
'history': HistoryCard,
'stats': StatsCard
}
# ----------- 카드 콜렉션 -----------
class CardCollection:
def __init__(self):
self.cards: Dict[str, BaseCard] = {}
def add_card(self, card: BaseCard):
self.cards[card.id] = card
def get_card(self, card_id: str):
return self.cards.get(card_id)
def update_card(self, card_id: str, data: dict):
card = self.cards.get(card_id)
if not card:
return None
for key, value in data.items():
if hasattr(card, key):
setattr(card, key, value)
card.last_updated = date.today()
return card
def delete_card(self, card_id: str):
return self.cards.pop(card_id, None)
def search_cards(self, keyword: str) -> List[BaseCard]:
return [
card for card in self.cards.values()
if keyword.lower() in card.title.lower()
or (hasattr(card, 'description') and keyword.lower() in getattr(card, 'description', '').lower())
]
def all_cards(self) -> List[BaseCard]:
return list(self.cards.values())
collection = CardCollection()
# ----------- API 엔드포인트 -----------
@app.route('/cards', methods=['POST'])
def create_card():
data = request.json
card_type = data.pop('type', '').lower()
CardClass = CardTypes.get(card_type)
if not CardClass:
return jsonify({'error': 'Invalid card type'}), 400
card = CardClass(**data)
collection.add_card(card)
return jsonify(asdict(card)), 201
@app.route('/cards', methods=['GET'])
def list_cards():
return jsonify([asdict(card) for card in collection.all_cards()])
@app.route('/cards/<card_id>', methods=['GET'])
def get_card(card_id):
card = collection.get_card(card_id)
if not card:
return jsonify({'error': 'Card not found'}), 404
return jsonify(asdict(card))
@app.route('/cards/<card_id>', methods=['PUT'])
def update_card(card_id):
data = request.json
updated = collection.update_card(card_id, data)
if not updated:
return jsonify({'error': 'Card not found'}), 404
return jsonify(asdict(updated))
@app.route('/cards/<card_id>', methods=['DELETE'])
def delete_card(card_id):
deleted = collection.delete_card(card_id)
if not deleted:
return jsonify({'error': 'Card not found'}), 404
return jsonify({'message': 'Card deleted'})
@app.route('/search', methods=['GET'])
def search_cards():
keyword = request.args.get('q', '')
results = collection.search_cards(keyword)
return jsonify([asdict(card) for card in results])
# ----------- 실행 -----------
if __name__ == '__main__':
app.run(debug=True)
💡 실행 방법
- 위 코드를 app.py로 저장
- 터미널에서 실행:
pip install flask
python app.py
- POST, GET, PUT, DELETE 요청은 curl, Postman, 또는 웹 프론트엔드에서 테스트 가능
🔍 예시 JSON 입력 (POST /cards)
{
"type": "data",
"title": "2024년 고용 통계",
"description": "전국 고용 상태 요약",
"data_source": "고용노동부",
"variables": [{"name": "job_status", "description": "고용 상태"}],
"collection_method": "표본 조사",
"time_coverage": "2024.01 ~ 2024.03",
"geographic_coverage": "전국"
}
필요하시면 파일 저장, JWT 인증, 웹 UI 연동까지 확장할 수 있어요. 원하시나요?
'마이크로 웹 프레임워크' 카테고리의 다른 글
[마이크로 웹 프레임워크] Flask를 이용한 통계 서버 1 (0) | 2025.02.09 |
---|---|
[마이크로 웹 프레임워크] FastAPI 마이크로 웹 프레임워크 2 (2) | 2024.10.26 |
[마이크로 웹 프레임워크] 플라스크 소개 및 예제 2 (2) | 2024.10.22 |
[마이크로 웹 프레임워크] 파이썬 Sanic 프레임워크란? (0) | 2024.10.20 |
[마이크로 웹 프레임워크] Falcon 고성능 웹 프레임워크 1 (4) | 2024.10.19 |