「既存のトレード記録ツールが自分のスタイルに合わない」「自分だけの分析機能が欲しい」——プログラミングスキルがあるトレーダーなら、自作アプリという選択肢がある。
この記事では、Supabase(BaaS)とNext.js(Reactフレームワーク)を使って、FXトレード記録アプリをゼロから構築する方法を解説する。データベース設計から認証、CRUD実装、デプロイまでの全工程をカバーする。
なぜSupabase + Next.jsなのか
Supabaseの強み
SupabaseはFirebaseのオープンソース代替として人気のBaaS(Backend as a Service)だ。PostgreSQLベースのデータベースに加え、認証、リアルタイム購読、ストレージ、Edge Functionsを提供する。無料プランでも十分な機能があり、個人開発のトレードアプリには最適だ。
Next.jsの強み
Next.jsはReactベースのフルスタックフレームワークで、App Routerによるファイルベースルーティング、Server Components、API Routesを備えている。SEO対応のブログページからダッシュボードまで、1つのプロジェクトで構築できる。Vercelへの無料デプロイも簡単だ。
組み合わせのメリット
Supabaseがバックエンドの大半を担当するため、フロントエンド開発に集中できる。認証はSupabase Auth、データベースはSupabase PostgreSQL、ファイルアップロードはSupabase Storageで、バックエンドのコードをほとんど書かずにフルスタックアプリが完成する。
データベース設計:tradesテーブル
必須カラムの設計
トレード記録の核となるtradesテーブルには、以下のカラムが最低限必要だ。id(UUID、主キー)、user_id(UUID、認証ユーザーID)、currency_pair(通貨ペア)、direction(売買方向)、entry_price(エントリー価格)、exit_price(決済価格)、lot_size(ロットサイズ)、pips(損益pips)、profit_loss(損益金額)、entry_time(エントリー日時)、exit_time(決済日時)。
分析用カラムの追加
基本カラムに加えて、strategy(使用手法)、emotion(感情タグ)、notes(メモ)、screenshot_url(スクリーンショットのURL)、session(東京/ロンドン/NY)を追加すると、後の分析精度が格段に上がる。created_atとupdated_atのタイムスタンプも忘れずに設定する。
インデックスの設定
user_idは必ずインデックスを設定する。ユーザーごとのデータ取得が最も頻繁なクエリだからだ。entry_timeにもインデックスを追加しておくと、期間絞り込みのパフォーマンスが向上する。currency_pairもフィルタリングに頻繁に使うためインデックスの候補だ。
認証:Supabase Authの実装
メール認証の設定
Supabaseの管理画面でメール認証を有効にし、Next.jsのクライアントライブラリでサインアップ・サインイン・サインアウト機能を実装する。supabase.auth.signUpでアカウント作成、supabase.auth.signInWithPasswordでログイン、supabase.auth.signOutでログアウトが実現する。
OAuth認証の追加
Googleアカウントでのログインを追加すると、ユーザーのハードルが下がる。Supabaseの管理画面でGoogleプロバイダーを有効にし、Google Cloud Consoleでクライアントを作成する。supabase.auth.signInWithOAuthメソッドで実装は完了だ。
ミドルウェアでの保護
Next.jsのmiddleware.tsファイルでセッションチェックを行い、認証されていないユーザーをログインページにリダイレクトする。ダッシュボードやトレード記録ページなどの保護されたルートは、ミドルウェアで一括管理するのが最も効率的だ。
Row Level Security(RLS)の設定
RLSはSupabaseの最も重要なセキュリティ機能だ。RLSポリシーを設定することで、各ユーザーが自分のデータのみにアクセスできるように制限する。
SELECTポリシー
「auth.uid() = user_id」の条件を設定するだけで、ログイン中のユーザーが自分のトレードデータのみを参照できるようになる。他のユーザーのデータは完全に不可視だ。
INSERT/UPDATE/DELETEポリシー
INSERT時にはuser_idが認証ユーザーのIDと一致することを強制する。UPDATE/DELETEも同様に、自分のデータのみ操作可能に制限する。これにより、フロントエンドのバグがあったとしても他ユーザーのデータを改ざんすることは不可能になる。
RLSは「最後の砦」だ。フロントエンドでどれだけバリデーションを行っても、データベースレベルでアクセス制御しなければセキュリティは担保できない。tradesテーブルでは必ずRLSを有効にすること。