最安値トラッカー(aws13th-team3)

Web

概要

네이버 쇼핑 검색 API を用いて商品情報を取得し、MariaDB に保存、ウィッシュリストベースで価格の履歴を蓄積・追跡する FastAPI サービスのプロトタイプです。キーワード検索で得た商品を正規化してデータベースに格納し、ユーザーが気になる商品をウィッシュリストに登録すると定期的に価格を更新(リフレッシュ)して価格履歴を積み上げます。最新価格を基準に「価格が下がった」商品のみを抽出して提供するエンドポイントを持ち、購入の意思決定を支援する目的のシンプルなバックエンド実装が中心です。

GitHub

リポジトリの統計情報

  • スター数: 3
  • フォーク数: 0
  • ウォッチャー数: 3
  • コミット数: 2
  • ファイル数: 10
  • メインの言語: 未指定

主な特徴

  • 네이버 쇼핑 API を利用して商品データを収集・正規化して保存
  • ウィッシュリストに登録した商品の価格履歴を蓄積・更新
  • 最新価格を基準に「価格下落」した商品のフィルタリング API を提供
  • FastAPI を想定した軽量な Web サービス構成(crud 層と DB 層の分離)

技術的なポイント

本リポジトリは API 層(main.py)、データアクセス層(crud.py)、データベース接続(database.py)という分離がされており、責務が明確になっています。README にあるエンドポイント設計(GET /products/search、POST /wishlist、POST /wishlist/refresh、GET /wishlist/drops)から、外部 API(네이버 쇼핑)との通信→取得データの正規化→MariaDB への永続化→ウィッシュリストのリフレッシュ処理による価格レコードの追加→最新価格判定による価格下落フィルタという流れが読み取れます。実装上の注目点は次の通りです。

  • 非同期処理と I/O:FastAPI を使う前提なら 네이버 API 呼び出しや DB 操作は非同期化(async/await)で実装するとスループットが改善します。大量のキーワード検索や定期更新時の並列実行を考慮する必要があります。
  • データ正規化:外部 API のレスポンスは SKU、価格、在庫、販売店情報などが異なるため、統一スキーマに落とし込む正規化ロジック(商品 ID、名称、カテゴリ、価格履歴レコード)を設けている点が重要です。
  • 価格履歴設計:ウィッシュリスト登録時とリフレッシュ時に「価格」を時系列で保存するスキーマが想定され、最新価格比較で「下落」を判定できます。差分や%変化を算出するカラムを追加すると利用価値が高まります。
  • 運用上の配慮:API キー管理(環境変数)、레이트 리밋対策、エラーハンドリング、リトライ、タイムゾーン管理、DB のインデックス(商品IDやタイムスタンプ)設計が実運用での重要ポイントです。
  • 拡張性:バックグラウンドで定期更新を走らせる仕組み(Celery、APScheduler、FastAPI の BackgroundTasks、AWS Lambda + EventBridge など)でスケールさせると本格運用に近づきます。

プロジェクトの構成

主要なファイルとディレクトリ:

  • .idea: dir
  • README.md: file
  • crud.py: file
  • database.py: file
  • main.py: file

…他 5 ファイル

(補足)crud.py はデータベース CRUD 操作を集約していると推測され、database.py が MariaDB 接続設定(接続文字列やエンジンの初期化)を担い、main.py が FastAPI のルーティングと外部 API 呼び出しのエントリポイントになっている想定です。実装詳細はソースを参照してください。

まとめ

シンプルで実用的な価格トラッキングのプロトタイプ。実運用に向けた堅牢化が次の課題です(例:認証、リトライ、レート制御、スケーリング)。

リポジトリ情報:

READMEの抜粋:

네이버 쇼핑 검색 API로 상품을 수집해 우리 MariaDB에 저장하고, 위시리스트 기반으로 가격 변동(하락)을 추적·조회하는 FastAPI 서비스.

  • 키워드로 상품을 검색하고 결과를 정규화해서 저장한다 (GET /products/search)
  • 관심 상품을 위시리스트로 등록하고 가격 히스토리를 누적한다 (POST /wishlist, POST /wishlist/refresh)
  • 최신가 기준으로 가격이 떨어진 상품만 필터링해 조회한다 (GET /wishlist/drops) …