【Java】SpringBootで美容院の予約管理システムを作成してみた

# SpringBootを使用して美容院の予約管理システムを作ってみました
ProになるJavaというテキスト内で、SpringBootを使用したアプリケーションの作成の項目があり、学習したことの復習のため今回のシステムを作ってみようと思いました。
コード内に間違いや推奨されない書き方もあるかもしれないですが、とりあえず動くものを作ろうということで作成に踏み切りました。
まず、制作するにあたってどんな機能を作るべきなのかということを箇条書きでざっとまとめることをしました。

## 主に実装したい機能
・予約の登録(2日前まで)、確認、変更、取消
・名前、住所、メールアドレス、電話番号、希望メニューをDBにデータを格納
・各日付の予約ページにてDBから予約情報を出力し、空いている時間を見ることが可能
・予約完了時に10桁の予約番号を発行、トップページから予約番号を入力することで予約内容を確認することが可能
・予約完了、変更、取消手続き完了時に登録されているメールアドレスに確認メールを送信

個人的なこだわりとしては予約ページから予約可能か否かを一目で分かるようなものが作れたらなと考えていました。
予約の確認をどういった方法で実装するか迷いました。
SpringSecurity使用したログイン機能なども考慮したうえで今回は簡略化して予約番号を採番することにしました。今後改良していくうえでSpringSecurityも実装するのもありかなと思っています。

### 苦戦した部分
・DBに格納する予約情報をrecordで実装しましたが、それを確認するために取り出す際にStreamのmapを使用しました。なんとなく毛嫌いしていたStreamもキャストの変換等で躓きましたが、何とか書くこができました。


```java
record Reserve(
String id, LocalDate date, LocalTime time, String menu, String name,String email, String tel){}
```

```java
    public Reserve idFind(String id) {
        String sql = "SELECT * FROM reserve WHERE id = ?";
        try {
            Map<String, Object> map = jdbcTemplate.queryForMap(sql, id);
            Reserve reserve = new Reserve(
                    map.get("id").toString(),
                    ((Date) (map.get("date"))).toLocalDate(),
                    ((Time) map.get("time")).toLocalTime(),
                    map.get("menu").toString(),
                    map.get("name").toString(),
                    map.get("email").toString(),
                    map.get("tel").toString());
            return reserve;
        } catch (IncorrectResultSizeDataAccessException e) {
            return null;
        }
    }
```

・予約ページで予約可能な時間をテーブルで表示する部分で、HTMLのinputの時間とDBに格納されている予約時間を比較し、一致した場合には「×」を、一致しなければテーブルに「予約可能です」とを出力するように実装しました。
これをユーザが選択できる時間の分(10:00~18:00)だけListに格納し、それをHTML側に渡すという処理にしました。

```html
<input type="time" name="time" step="1800" list="data-list" min="10:00" max="18:00" required>
        <datalist id="data-list">
            <option value="10:00"></option>
            <option value="10:30"></option>
            <option value="11:00"></option>
            <option value="11:30"></option>
            <option value="12:00"></option>
            <option value="12:30"></option>
            <option value="13:00"></option>
            <option value="13:30"></option>
            <option value="14:00"></option>
            <option value="14:30"></option>
            <option value="15:00"></option>
            <option value="15:30"></option>
            <option value="16:00"></option>
            <option value="16:30"></option>
            <option value="17:00"></option>
            <option value="17:30"></option>
            <option value="18:00"></option>
        </datalist>
```

```java
public List<String> ReservableDate(LocalDate date) {
        List<LocalTime> judge = new ArrayList<>();
//        ユーザに選択された日付とDBにある日付が同じ時、reserveTimeListと同じ時間がある場合にjudge配列に時間を追加
//        reserveDatesの中身がnullの場合、judgeの中身もnullになる
        for (int i = 0; i < reserveDates.size(); i++) {
            if (date.isEqual(reserveDates.get(i).date)) {
                for (int j = 0; j < reserveTimeList.length; j++) {
                    if (reserveTimeList[j].equals(reserveDates.get(i).time)) {
                        judge.add(reserveDates.get(i).time);
                    }
                }
            }
        }
//        judgeに格納された時間とreserveTimeListに同一の時間があるかを判定
        List<String> judge2 = new ArrayList<>();
        for (int i = 0; i < reserveTimeList.length; i++) {
            if (judge.contains(reserveTimeList[i])) {
                judge2.add("×");
            } else {
                judge2.add("予約可能です");
            }
        }
        for (int i = 0; i < judge2.size(); i++) {
            System.out.println(reserveTimeList[i] + "：" + judge2.get(i));
            System.out.println("------------------------------");
        }
        return judge2;
    }
```



### まとめ
実際に書いたコードをGithubでも公開しています。
Githubなどに挙げる際のコミットメッセージも今後はしっかり考えないとなと思っております( ´∀｀ )
今回書いたコードもそうですが、様々なドキュメントや資料を見ることが本当に大切で自分なりに理解することが重要だと感じています。
そのうえで実際に動いた時の楽しさなどを実感することができました。
まだまだ簡単なシステムしか作れませんが、少しづつ自分が成長していることも感じています。
もっとこうしたほうがいいとか、こう実装するべきといった声をいただけると今後の学習の糧となります。
ぜひ、Githubのほうも見ていただければと思います。
[Githubへのリンクはこちら](https://github.com/Seigo-Kondoh/reserve)