【個人開発】筋トレサポートアプリを開発しました。【Next.js + Rails API】

# はじめに
初めまして！ニノ（@Ninomin）と申します。
大学では心理学を学び、新卒で独立系Slerに入社し、現在3年目です。未経験からのWebエンジニア転職を目指して、日々プログラミング学習を行っています。
今回、筋トレサポートサービス **「Be Fit」** を開発しました。

# 目次


| 章 | タイトル | 備考 |
| --- | --- | --- |
| 1 | [サービスについて](#1サービスについて) | サービスURL, GitHub |
| 2 | [サービス概要](#2サービス概要)|概要について |
| 3 | [サービスを作成した背景](#3サービスを作成した背景)| 開発に至った理由について |
| 4|  [機能一覧](#4機能一覧)|  主要機能について|
| 5|  [使用技術](#5使用技術)| 主要技術について |
| 6|  [インフラ構成](#6インフラ構成)| インフラ構成図 |
| 7|  [技術選定理由](#7技術選定理由)|  |
| 8 | [ER図](#8er図) |  |
| 9|  [工夫したポイント](#9工夫したポイント)|1.ユーザービリティ 2.パフォーマンス　3.メニュー作成 |
| 10|  [今後の開発について](#10今後の開発について)|  |
| 11|  [最後に](#11最後に)|  |


# 1.サービスについて
### [Be Fit](https://www.befitvercel.com/)

https://www.befitvercel.com/


▼GitHub URL
バックエンド
https://github.com/Ryocchi-Muscle/BeFit_backend
フロントエンド
https://github.com/Ryocchi-Muscle/BeFit_frontend

# 2.サービス概要
筋トレ初心者向けのサポートアプリです。
具体的には、

* ユーザーの性別、トレーンング頻度にあったトレーニングプログラムを作成できる
* 週ごとのトレーニングの成長を棒グラフで確認することができる
* メニューの解説機能を使用して、正しいフォームを学ぶことができる

# 3.サービスを作成した背景
**多くの人にフィットネスの楽しさを伝えたい**

私は現在、筋トレ歴５年目になります。
筋トレを通じて、自己肯定感が高まりました。 その経験から、多くの人にフィットネスの楽しさを伝えたいと考えています。
しかし、トレーニング初心者はジムでの知識が不足しており、何をすれば良いのかわからないことが多いです。
そこで、私の知識と経験を活かし、初心者が効率的なトレーニングを行い、身体の変化を実感できるサービスを提供したいと思い、このサービスを開発しました。

# 4.機能一覧
## メイン機能の使い方

<table>
  <tr>
    <th style="text-align: center">プログラム作成</th>
    <th style="text-align: center">メニュー記録</th>
    <th style="text-align: center">メニュー編集</th>
  </tr>
  <tr>
    <td>
     <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515122/87f50ee8-317a-1768-872f-496febca0bd2.gif" alt="トレーニングプログラム作成">
      まずは、プログラム作成ボタンを押して、各情報を入力後に作成ボタンを押す。
    </td>
    <td>
      <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515122/3b5363da-d5c7-6644-1678-67c4b1a0912f.gif" alt="トレーニングプログラム作成">
      作成されたプログラムのメニューを行い、記録を入力する。
    </td>
    <td>
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515122/ba66237b-202d-39eb-6f18-076c1c73cc2e.gif" alt="トレーニングプログラム作成">
           記録を編集することも可能です。
    </td>
  </tr>
  <tr>
    <th style="text-align: center">記録表示</th>
    <th style="text-align: center">カレンダー機能</th>
    <th style="text-align: center">解説機能</th>
  </tr>
  <tr>
    <td>
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515122/0a1c5536-4eaa-6b5d-da53-866fead28682.gif" alt="トレーニングプログラム作成">
      1週間のトレーニングボリュームを棒グラフで表示。<br>最大8週間分の記録を確認することができ、トレーニングの成長を可視化できる。
    </td>
    <td>
        <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515122/f5a5c9f8-1cc4-cd27-4d99-8bda45505585.gif" alt="トレーニングプログラム作成">
      カレンダーから過去の記録を確認することができる。
    </td>
    <td>
         <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515122/2f549fd5-32dc-11d4-fed3-f9e2d8f17ad7.gif" alt="トレーニングプログラム作成">
      初心者でも理解しやすく、対象の筋肉の筋繊維図や、動画を見ながら学ぶことができる。
    </td>
  </tr>
</table>

# 5.使用技術
| カテゴリ       | 技術                                                                                  |
| -------------- | ------------------------------------------------------------------------------------- |
| フロントエンド | TypeScript 5.3.3 / React 18.2 / Next.js 14.2.3                                   |
| バックエンド   | Ruby 3.2.2 / Ruby on Rails 7.0.8 （APIモード）                                         |
| データベース   | MySQL                                                                            |
| 認証           | NextAuth.js                                                                           |
| CI/CD           | GitHubActions                                                                           |
| インフラ       | Vercel / Heroku                                                                       |                       |
| その他         | SWR / shadcn/ui / Radix UI/ GoogleAnalitycs / tailwind CSS/

# 6.インフラ構成
![インフラ構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515122/4d2eaadf-f12d-0a86-b9c2-792fafe0d099.png)


# 7.技術選定理由

### フロントエンド
#### React / Next.js
①Google Trendsで調査したところ、Vue.js / Nuxt.jsよりReact / Next.js.の方が人気が高まっていたことから、日本でもReact / Next.jsを採用する企業が増えると推測したから。
②ver13以降のルーティングの簡易性。
③単純に興味があった。

### バックエンド
#### Rails API
①ドキュメント、資料の豊富さからの学習コストの低さ。
②転職先候補の企業での採用数が多かったから。

### CI / CD
#### GitHub Actions
GitHubとの親和性の高さから開発体験が良さそうだったから。

### 認証ライブラリ
#### NextAuth.js

https://next-auth.js.org/

ログイン方法は、開発コスト、ユーザービリティからGoogleログイン一択でした。NextAuthであれば、Googleログインを簡単に実装でき、セキュリティが高さも担保されているため、採用しました。



### インフラ
#### Vercel
* Next.jsとの相性が良さ
* GitHubとの連携による開発の効率化

#### Heroku
多くの企業が使用しているMySQLに慣れておいた方が良いと判断し、MySQLが簡単に利用できるBackendのデプロイツールとしてHerokuを選択しました。

### その他のライブラリ
#### React Swiper
https://swiperjs.com/react

作成したプログラムカードのスワイプの実装で使用しました。

#### shadcn/ui (UIライブラリ)

https://ui.shadcn.com/

**Shadcn UI**は、`RadixUI`と`Tailwind CSS`を用いたコンポーネントをプロジェクトに導入してくれるツールです。
ライブラリではなくツールとして機能するため、プロジェクトの依存関係に組み込まれることはありません。これにより、作成したコンポーネントに関するすべての操作を自分の環境で行えるという利点があります。




:::note info
**コスパ最強のコンポーネント**
他のライブラリも試しましたが、
Next.jsで使用できるUIライブラリの中で一番使用しやすく、導入コストが低く、コスパ最強のコンポーネントだと感じました。面白いコンポーネントがたくさんあるので、眺めているだけでも楽しいと思います👀
:::


## 8.ER図
![ER図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515122/04f3eb05-88c0-5588-fedd-51ee793f85b9.png)

## 9.工夫したポイント
### 1.シンプルなUI/UX
#### 1-1.ログイン認証
ログイン認証は、`Googleログイン`一択にしました。
理由は、大きく下記の２つです。
**①ユーザービリティの向上。**
**②開発工数の削減。**

##### ①ユーザービリティの向上に関して
一言で言うと、`面倒なメールアドレスの入力、パスワード作成という手続きをすることで、ユーザーの離脱率を下げたくなかったから`です。
Googleログインであれば、ほとんどのユーザーが所有していますし、本アプリはレスポンシブファーストの設計が前提でした。
iphoneからであれば、`iCloudキーチェーン`を使用することでログイン時に、メールアドレス、パスワードの入力を手動でする必要がありません。

また、万一、本アプリからメールアドレスとパスワードが流出してしまうリスク面も考慮し、Googleプロバイダーにログインに必要な情報を取得しにいく実装をしています。

##### ②開発工数の削減。
ログイン機能の実装より、アプリの中身の機能実装に工数をさきたかったため、`1.記事の豊富さ`、 `2.NextAuthでGoogleログイン実装が簡易的にできる`という観点で選択しました。

※しかし、結果的に実装にかなり苦戦し、2週間以上実装にかかりました。。。

#### 1-2.レスポンシブを考慮したUI/UX
ジムでの使用から必然的にレスポンシブになるため、開発当初からレスポンシブファーストで開発を行っていました。

レスポンシブ画面だと、画面上のごちゃごちゃ感を排除しないといけません。また、`人は見た目が９割`という言葉があるように、アプリの印象も見た目が大切だと思い、ユーザーにとってシンプルなUIUXを心がけて実装そうしていました。

#### Ex1.ProgramCardの表示
Swiperライブラリを使った3Dカバーフロー効果のスライダーを使用し、各日のProgramCardをストレスなく確認できるようにしました。

 <td>
     <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515122/7fda8a3f-4840-3164-6059-6848a033f41c.gif" alt="トレーニングプログラム作成">
    </td>

#### Ex2.Dialogの活用
ページ遷移することで発生するローディングをなるべく発生させないように、Dialogを取り入れ、トレーニング中にもストレスなく、アプリを使用してもらえるように工夫しました。

 <td>
     <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515122/f7fa075b-0e77-754e-e096-573b872bac48.gif" alt="トレーニングプログラム作成">
    </td>

### 2.パフォーマンス

トレーニング記録のデータの取得のパフォーマンスを向上させるため、キャッシュ管理ライブラリの一つであるSWRを採用しました。SWRは、まずキャッシュからデータを返し（stale）、次にフェッチリクエストを送り（revalidate）、最終的に最新のデータを取得するという、Stale While Revalidateの略語です。

実際にSWRを使用する前と使用した後では、データのキャッシュにより待ち時間が短縮され、表示速度が格段に向上しました。

理解できていない点も多いので、引き続き学習していこうと思います。

**useSWRについて**

https://swr.vercel.app/

### 3.メニュー作成

当初は、`OpenAPI`を使用したメニュー作成を計画していました。
しかし、検証段階でchatGPTにユーザーの情報を入力し、メニューを作成してもらいましたが、`鍛える部位が多い`、`提示メニュー数が多く、初心者がマスターするには負担が大きい`ということから、私のアプリの指針である`初心者が効率的に筋肥大するプログラム`という観点から外れてしまうため、これまでの私の経験からメニューを自作しました。
また、多くのトレーニングアプリは、ユーザー対象が男性です。私の思いとしては、**「男性女性全ての人にフィットネスの楽しさを伝えたい」**　と思い、女性用のメニューも作成できるようにしました！

## 10.今後の開発について
#### 1.テスト
まずは、バック、フロント共にテストを書いて、カバレッジ率を上げていきたいです。

#### 2.UI/UXの修正・追加
トーストやバリデーション表示、スクロール等、ユーザービリティに関して、まだまだ改善の余地があるため、より使用しやすいUI/UXへ修正していきたいです。

#### 3.プログラムの種類追加
実際に触っていただいたユーザーの方から、ジム以外で家でトレーニングしている人用のプログラムがあれば嬉しいとの声があったので、導入を検討していきたいです。

# 11.最後に

初めてのアプリ開発で、当初予定していたissue計画通りに開発を進めることができず、苦労した点も多々ありましたが、ひとまず自分の思いをサービス化できたのは、良い経験となりました。

今回のアプリ開発で多くの課題を発見できたので、今後の糧とし、より成長していきたいと思います。

最後まで読んでくださりありがとうございました！

Xもやっているので、よければフォローお願いします！

https://x.com/MuscleEngi87389