2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Next.js × Go で具材からレシピ検索できるアプリを作った話

Posted at

はじめまして。私は フリーランスエンジニア として、現在は フルスタック開発 および AI駆動開発 を学んでいます。

今回は、Next.js × Go を使ったフルスタック開発を、Cursor などの AI エディタを活用して実装した経験について紹介します。

※ 本記事は一部生成AIを利用して作成しています

作ったアプリ

image.png

何ができるの?

  • 具材を選択してレシピを検索
    • 4つの検索モードで、ライトユーザーから本格派まで幅広く対応
  • レシピを登録・公開
    • ログインユーザーは自分のレシピを登録&公開可能
    • 材料からも検索でき、お気に入り・レビュー機能付き
  • レシピ名からの検索
    • 通常のレシピ検索サービスとしても使えます

なぜ作ったの?

料理をしていると、どうしても具材が余ってしまいがちです。

私自身も、余った食材をうまく活用できず、腐らせて捨てる経験が何度もありました。

そんな悩みを持つ人は多いはず。だったら、**余った具材からレシピを検索できるサービスを作ろう!**と思ったのがきっかけです。

ユーザーの料理への関心が高まり、フードロス削減にも貢献できたら嬉しいです。

主要機能の紹介

具材選択機能

image1.png

レシピ検索機能

image2.png

レシピ登録機能

image3.png

ユーザー機能

image4.png

課題・改善点

レシピ数が致命的に少ない

他のレシピサイトは 1〜2万件 を超えるレシピを持つ中、当サービスのレシピ数は わずか95件

なぜレシピが少ないのか?

  • 画像は Adobe Firefly によるAI生成
  • レシピ1件あたり 5〜7枚の画像生成が必要
  • 各プロンプト作成に時間がかかる

現在、レシピデータの効率的な生成手法を模索中
目標は最低でも 1000レシピ

Lighthouse パフォーマンスが低い

image5.png

主な原因:

  • Next.js Image 最適化を無効化(Cloudflare R2の課金制限回避のため)
  • Client Components の多用による JS バンドル肥大化

解決策

  • 画像最適化の再検討
  • アニメーションの簡略化などを検討中

E2Eテストを未実装

  • 現状は手動検証と Jest による一部ユニットテストのみ
  • 今後は CypressPlaywright の導入を検討中

技術スタック

フロントエンド

  • フレームワーク: Next.js 14.1.0
  • 言語: TypeScript 5.8.3
  • UIライブラリ: React 18.2.0
  • スタイリング: CSS Modules (SCSS)
  • 状態管理: Zustand 5.0.1
  • データフェッチング: TanStack React Query 5.69.0 / Axios 1.8.4
  • UI/UX補助: Framer Motion / React Icons / React Hot Toast / React Joyride
  • ドラッグ&ドロップ: @dnd-kit/core
  • アニメーション: @lottiefiles/dotlottie-react
  • 日本語処理: Wanakana

バックエンド

  • 言語: Go 1.23.2
  • フレームワーク: Gin 1.10.0
  • ORM: GORM 1.25.12
  • DBドライバ: lib/pq
  • キャッシュ: Redis (go-redis/v8)
  • 認証: Supabase Auth

ストレージ / 外部サービス

  • Supabase Storage / AWS S3
  • OpenAI API (sashabaranov/go-openai)
  • Google Cloud Translation API

データベース

  • 本番DB: PostgreSQL 15
  • キャッシュ: Redis
  • マイグレーション: 自作カスタムスクリプト

インフラ

  • コンテナ化: Docker & Docker Compose
  • 開発環境: Supabase CLI
  • 本番環境:
    • フロントエンド:Vercel
    • バックエンド:Render
    • DB:Supabase PostgreSQL
    • ストレージ:Cloudflare R2

良かったこと

  • サービスの企画〜公開までを一人でやり切った
  • モダン技術を多く取り入れたことで、技術力が一気に向上した
  • バックエンドも実装したことで、API設計・型安全の理解が深まった

大変だったこと

Supabase × GORM の接続エラー

GORM のデフォルトは Prepared Statement 有効 ですが、Supabase の Transaction Pooler では未対応。

同時接続で競合が発生してしまい、エラー地獄に…。

解決策

  • GORM / ドライバレベルで Prepared Statement を無効化
  • 同時接続数を1に制限

ただし、無料枠の Supabase は Direct Connection(IPv4)に非対応だったため、妥協せざるを得ませんでした。

おわりに

この記事が、フルスタック開発 × AI × Supabase に興味がある方の参考になれば嬉しいです!

ご意見や改善アイディアがあれば、ぜひコメントで教えてください 🙏

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?