【React】名刺共有アプリを作ってみて【初心者】

## はじめに
本記事は、**JISOU**の課題として制作した「デジタル名刺アプリ」の紹介と実際に作ってみての感想記事です。
「デジタル名刺アプリ」は、エンジニアとして名前や自己紹介はもちろん、好きな技術や自分のGitHubアカウントなどをブラウザ上で作成・共有できます。

## 簡単な自己紹介
- Reactに触れて2, 3か月の初心者
- というかフロントエンド周りの知識もほとんどなし
- 何か簡単でもいいのでアプリを作ってみたかった（…がなかなかできなかった）

 自分と同じような初心者の方、**React**を使って実際にアプリを作ってみたい方、作ってみたいけどなかなか踏み出せない…という方はぜひ読んでいただけたらと思います

## アプリの概要
オンラインで名刺を共有・登録できる web アプリケーションです。ユーザーはスキルや SNS 情報を登録し、URL を通じて自身のプロフィールを他者に簡単に共有できます。

### 主な機能
* ユーザー登録（名前、自己紹介、好きなスキル、GitHub/Qiita/X のリンク）
* 名刺ページの自動生成（共有用 URL あり）
* 名刺の ID 検索
* 作成した名刺情報の日時削除

### 実際の画面
![プレゼンテーション1 (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4048214/d38cd2f5-568c-462a-9f2e-6c6e58a0124c.gif)

### 使用技術
- フロントエンド：React + Vite + Chakra UI
- バックエンド（BaaS）：Supabase
- 言語：TypeScript
- テスト：Jest × Testing Library
- デプロイ：GitHub Actions
- インフラ：Firebase Hosting

* `supabase` はオープンソースのBaaS(Backend as a Service）です。これがあればDB周りの構築や準備なしですぐにデータベースが利用できてフロントエンド側（アプリ開発）に集中できます。また、`PostgreSQL` をベースにしているので、RDBになじみのある人は使いやすいのではないでしょうか。
* `GitHub Actions` は、GitHub上で動作する CI/CD（継続的インテグレーション／デリバリー）の自動化ツール です。今回はコードをGitHubに`push` するだけで 自動でビルドからテスト、`Firebase Hosting` にデプロイまでを実行するように設定して、快適な開発環境を用意しました。

## 工夫した点

### ① Supabaseのストアドファンクションによるトランザクション処理
ユーザの登録を行うのに、`ユーザ`テーブルと`ユーザ＆スキル`テーブル(`ユーザ`テーブルと`スキル`テーブルの中間テーブル)の2つを更新する必要ありました。整合性をとるために、supabase側でストアドファンクションを作成し、クライアント(アプリ)側から`rpc`で呼び出すことでトランザクション処理を行いました。
```ts
const { error } = await supabaseClient.rpc("insert_user_and_userskill", {
  _user_id: registerFormData.eitango_id,
  _name: registerFormData.name,
  _description: registerFormData.description,
  _skill_id: registerFormData.skill_id,
  _github_id: registerFormData.github_id || null,
  _qiita_id: registerFormData.qiita_id || null,
  _x_id: registerFormData.x_id || null,
});
```
（↓詳しくはこの記事をご参照ください）
https://qiita.com/higa1234q/items/da37b30d05bd5a50f64d

### ② ファクトリーメソッドをやってみる
supabaseから取得したユーザー情報は、そのままでは空文字など不正なデータを含む可能性があります。そこでファクトリーメソッドを設けて、安全にオブジェクトを生成できるようにしました。
```ts
// User.ts
static createUser(...) {
  return new User(
    id,
    name,
    description,
    skills,
    formatSnsUrl("https://github.com", github_id),
    ...
  );
}
```
これに限らずデザインパターンはどんどん試してみないといけないですね…。本やサンプルコードだけ読んでも理解しづらいです。

## ハマった点

### ① supabaseのストアドファンクション
ストアドファンクション自体は、PL/pgSQL言語(OracleでいうPL/SQL)で書く必要がありました。ここは正直結構しんどかったです。何度もトライ＆エラーを重ねて作成しました。

### ② GitHub Actionsでのバッチ処理
今回はGitHub Actions側で、前日までに作成された名刺情報を朝6時に自動削除するよう設定していました。しかしGitHubではUTCなので、日本時間から9時間引いた時間を設定しなければなりません。また設定したからと言って必ず実行されるわけでもないようです。ここら辺に気づかず、毎朝確認しては「？」となっていました。

（↓実行されやすい時間帯があるようです）
https://zenn.dev/rie_amasato/articles/f901ef9fb19415

## 感想・得られた学び
Reactを初めて3か月ですが、ここまで開発することができました。Reactをはじめフロントエンド周りは？だらけでしたが、ドキュメンテーションや話題になっている記事や話の内容など少しずつ理解できるようになったと感じています。また作って終わりではなくデプロイ・運用などまでカバーしていて、実践的に勉強できました。
JISOUに入ってから毎日コードに触れていて、良い習慣がつきつつあるなと思います。やはり周りが作っていたり発信していたりするのを見るのは勉強、励みになりますね。
次は、自分で考えたアイデアを実装していくようなので、ほかの技術にキャッチアップしつつ挑戦したいと思います。

## 最後に
作って終わりではなく、リファクタリングや機能追加などやりたいです。
特にエラー周り（トーストを出す）。また設計手法についても勉強したら取り入れてみたいと思います。

↓GitHubはこちら
https://github.com/higa1234/digital-business-card

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp