【個人開発】Next.js × Spring Bootでタスク管理アプリ（SPA）を作ってみた！

こんにちは。Naotoです。

フロントエンドの技術を学ぶ一環で、SPAのタスク管理アプリを作成しましたので、紹介させていただきます！

＜最終成果物＞
以下のテストユーザーでログインして使ってみてください！
メール:cnann.0615.test@gmail.com
パスワード:testes0615

https://task-manager-frontend-14.vercel.app/

https://github.com/cnann0615/TaskManager-frontend-14

https://github.com/cnann0615/TaskManager-backend


↓ イメージ ↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817219/17500287-b36a-8f29-99c8-cb93c7f143ba.png)



## きっかけ
日々の仕事の中で、タスク管理に時間をかけてしまっている悩みや、数多くのタスクに気が散り１つの作業に集中できていない悩みを抱えており、その悩みを解決できるようなアプリが欲しい！と思い、開発してみました。

また、2024年に入ってから、フロントエンドについて本格的に学び始めた中で、
「Udemy等でのインプット学習で学んだ知識を、実践レベルで身につけたい！」
という思いも持ったのもきっかけの１つです。

## 開発環境と使用技術

### 開発環境
OS：macOS
IDE：フロントエンド → Visual Studio Code,　バックエンド　→ IntelliJ IDEA CE

### 使用技術
＜フロントエンド＞
言語：TypeScript
フレームワーク：Next.js
ライブラリ：React, Redux, Axios
スタイル：Tailwind CSS
テスト：JEST, React Testing Library　← 実装中
デプロイ：Vercel
パッケージ管理ツール：npm

＜バックエンド＞
言語：Java
フレームワーク：Spring Boot
データベース：MySQL（Heroku JawsDB）
デプロイ：Heroku
パッケージ管理ツール：Maven

＜その他＞
GitHub（ソースコード管理）
Firebase Authentication（認証）
React icons（アイコン）

などなど。。。

## 機能概要

個々の機能を紹介する前にざっくり説明すると、こんな感じです。

* 一般的なタスク管理アプリだが、機能面でこだわったポイントは以下2点。
    * Today's Must 1という、その日に最優先で取り組みたいタスクを視覚的に目立たせて表示できる機能を実装した点。
    * 「カテゴリ」「スケジュール」という２軸でフィルターをかけてタスクを表示できる機能を実装した点。
* Googleアカウントでログインする。
* データの流れは、こんな感じ。
     フロントエンド ←→ axios ←→ APIサーバ（SpringBoot） ←→ MySQL
* フロントエンドでの状態管理はRedux Toolkit（その他React Hooks）を使用


それでは、個々の機能を説明します！

### ログイン
ログインにはFirebase Authenticationを使用しました。
Googoleログインのみに対応しています。

https://firebase.google.com/?hl=ja

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817219/560054cb-8ea2-ae21-f070-90fd5e2b33b9.png)

### 新規タスク追加

新規タスクの追加はこのフォームから行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817219/89053edc-2458-7895-be33-e181c53396a9.png)

「Detail ↓」　をクリックすると、詳細を入力するフォームが現れます。
タイトルのみ必須入力となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817219/244a6b4b-b1e8-70db-e8f9-15de2674ec8c.png)

### 新規カテゴリ / スケジュール追加

カテゴリとスケジュールは、タスクに紐づける情報となります。
仕事でMicrosoft ToDoを使用しているのですが、１タスクにつき１リストしか割り当てができず、
「業務の種類」と「いつやるか」の２つの属性を持たせて管理したいとずっと思っていました。

そこで今回、「カテゴリ」と「スケジュール」の２つの属性をタスクにつけられるようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817219/483e4d2c-6647-615b-3eb0-0c119508214a.png)

追加したカテゴリ/スケジュールは、新規タスク追加フォームのプルダウンにて選択可能となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817219/8e5c353d-0aee-9d5b-a749-78e4ed1bd78f.png)

### タスクリストとタスク詳細

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817219/43cbc430-b8bf-e807-489c-9367ac473ce1.png)



#### タスクリスト
* フォームから追加されたタスクが表示されます。

* カテゴリタブ（緑タブ）とスケジュールタブ（紫タブ）を選択でき、
カテゴリ × スケジュールに当てはまるタスクを表示する仕組みとなっています。
上のスクショの場合、カテゴリが「Frontend」かつ、スケジュールが「Today」のタスクが表示されています。

* 横幅が狭いため、カテゴリタブは、右上の　「< Tab >ボタン」を使ってページ化しています。

* 各タブは、名前の編集（鉛筆マーク）、削除（×マーク）が可能です。
    * 編集された場合は、対象のタスクのカテゴリ/スケジュールに即時に反映されます。
    * 削除した場合は、対象のタスクも全て削除されます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817219/0311ccb1-ad4d-e8fa-5c18-bb694c365939.png)


* タスクカード上のチェックボックスをクリックすると完了未完了が入れ替わり、動的にタスクが移動します。
* タスクのタイトルをクリックすると、画面右側のタスク詳細に、詳細が表示されます。

##### Today's Must 1
* 全てのタスクの中から、その日に最優先で取り組みたいタスクを選び、目立たせて表示できる機能です。この機能により、ユーザは、やるべきタスクを明確にでき、作業に集中できます。
* タスクをToday's Must 1に設定する方法は、以下のタスク詳細で説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817219/1170304e-de4e-034a-ea68-2e71008b6291.png)



#### タスク詳細
* 各項目をクリックすると編集可能になります。
また、編集した内容は、フォーカスが外れたタイミングで、即座にReduxとバックエンドに反映されます。
* 右下の「Deleteボタン」からタスクを削除することができます。
* 右下の「Must1！ボタン」を押下するとそのタスクを上記で説明したToday's Must１のタスクに設定できます。
* メモ欄が大きいのが特徴です。以下のようにノートのように使用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817219/cc006026-d160-2fe6-65e3-f505a4e0ca52.png)


## 苦労した点
* 状態管理
    * 上記で説明した機能が、各コンポーネントに分かれているわけですが、タスクのデータ、カテゴリのデータ、スケジュールのデータ等を全てのコンポーネントに共通して持たせ、どこかでデータがCRUDされたら、全てのコンポーネントに即時反映させなければいけない。
これは、SPAでは当たり前で、仕組み化されている動きですが、実装するのはとても難しかったです。
    * というより、Reduxを理解するのが難しかったです。
    <br>

* デプロイ
    * フロントエンドのデプロイは、Vercelで行い、割と難なくできたのですが、バックエンドに大変苦戦しました。
    * 最初はAWSを使って試みましたが、インフラ構築等の知識が乏しいが故にすぐに挫折し、Herokuで再挑戦しました。
    * application.properties等の設定ファイルに関する知識が浅かったのも苦戦した原因かと思います。
    * 結論、Vereclにしろ、Herokuにしろ、GitHubのpushと同時にデプロイされるのは、とても便利だと感じました。

## 最後に
最後までお読みいただきありがとうございました。

今回は、機能の紹介をメインにさせていただきました。
ソースコードの解説等はまた別の機会に記事にさせていただきたいと思います。

この個人開発を通して、これまでインプットした内容をもとに、自力で実施に動くアプリケーションを作ることができ、とても自信がつきました。

また、コードを書いている時は、時間を忘れるくらい楽しく、作業に没頭できました。（次の日出社なのに寝不足の日が多かったです。）

開発をする過程で様々なエラーにぶつかり、それを乗り越えることで、エンジニアとしてのレベルが上がっていくのを、身をもって体験することができました。

今後もアウトプットをたくさんし、技術レベルを上げていきたいと思います！！！


ありがとうございました！