【独学・未経験】React,Rails,Docker,Heroku,CircleCIでSPAポートフォリオを作成しました

# はじめに
プログラミング初心者＆実務未経験者がSPAポートフォリオを作成したので、ご紹介します。

#### 　作者スペック
###### 職務経験
 - ３０歳　文系　販売金融会社勤務　
 - 新卒から営業を３年経験後、本社へ異動しシステム開発プロジェクトに参加
 - システム開発プロジェクトでは、業務側として要件定義や運用決めなどを経験
 - ２０２２年４月から情報システム部門に異動
 この通り、会社ではシステムを作るプロジェクトに入ったものの、コードを書いたりは全くしてません（開発はベンダー任せ）

プログラミング経験
- まったくなし
- Web系のエンジニアになりたく、独学で会社へ勤務しながら勉強
- ポートフォリオ着手時点のレベルは、Progate,Railsチュートリアルを終えた程度の実力
- ポートフォリオ作成をしながら、LinuxやネットワークなどのIT基礎技術とフロントエンドのReact,javascriptなどを学びました
- タイピングも毎日３０分寿司打をやり、３ヶ月でブラインドタッチをマスターしました。
- ポートフォリオ作成中は本当にたくさんの壁や障害がありましたが、検索したり、教材を購入し１から学ぶことでなんとか形になるぐらいにはなりました。

# アプリ概要

**制作したアプリケーションはこちら**
→heroku 無料終了に伴い、閉鎖しました。

**github**
https://github.com/kiyomasa05/cooklog2
（フロントとバックエンドの親フォルダ）

Cooklogというアプリで、自分の作ったレシピや、他人の作ったレシピを確認、お気に入り登録できます。
お気に入りにしておくとマイページで簡単に確認できる：クックパッドを模倣したアプリです。

なぜこのアプリを作ったかというと
　**妻を喜ばすためです。**
妻に「どんなアプリがあったらいいと思う？」と聞くと、
「（毎日料理を作るので）クックパッドもいいんだけど、お気に入りのレシピが並べて見れるアプリがいい」
とのことなので、UIにこだわり、自作のレシピとお気に入りのレシピが横並びで見れるアプリを作成しました。

レスポンシブ対応もしています
<img width="30%" alt="レスポンシブ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/a961974d-5b70-84be-ed63-158fb464aeea.png">

# ポートフォリオに使用した技術

フロントエンド
- Docker 
- docker-compose 
- React
- React-Hook-Form
- chakra-ui
 
バックエンド
- Ruby on Rails (apiモード)
- MySQL

テスト

- Jest
- testing-library
- Rspec

インフラ
- heroku
- AWS S3

コード整形
- ESlint
- pretter

CI／CD
- CircleCi

本番環境ではクライアント側とapi側　別々にデプロイしていますが、ローカル環境ではその親フォルダからDocker-composeで1コマンドで起動できるようにしています。

### システム構成図

herokuを利用

![名称未設定ファイル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/e82faa2a-53a9-71a2-2245-177f9a4f6217.jpeg)


### ER図
![Untitled Diagram-Page-1.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/fec33385-5b13-668a-99aa-8498541baaad.png)

#### フロントエンド

| 名称      | 説明 | 
|:-----------|:------------|
| React（Create　React　App）   | Javascriptフレームワーク  | 
| React-Hook-Form   | フォームバリデーションライブラリ    | 
| chakra-ui | UIコンポーネント | 


- ATOMICデザインを意識したディレクトリ構成になっています。
- api通信はHooksを使用し、axiosで叩いています。
- 認証はcookieを利用　
- React-Hook-Formは正直めちゃくちゃ使いやすかったです。

大変だったのは、
- rails activestorageを利用した画像の送信
- cookieを利用した認証
- providerへのデータ格納とコンパイル調整対応

この辺はエラーを直すのに１，２週間かかってます、、、
（完全独学なので、ググることはもちろん、関連することをUdemyで勉強したり、教材を購入したり大変でした。
メンターも検討しましたが、利用しませんでした。テラテイルが神）



#### バックエンド

| 名称      | 説明 | 
|:-----------|:------------|
| Ruby on Rails（APIモード）  | apiサーバーとして利用 | 
| MySQL   | データベースマネジメントシステム    | 

- APIサーバーとしてフロントからのリクエストに対し、JSONデータを返す役割
- 画像データはActiveStorage経由でS3バケットに保存してます
- 認証はsessionメソッドを利用（cookie）
-　ローカル環境での認証は、Firefoxを使用するようにしてください（Chromeではcookieのsecure属性がtrueにならない。
-　本番環境はhttps通信でsecure属性がtrueになるためChromeでも問題ないです


#### インフラ　
| 名称      | 説明 | 
|:-----------|:------------|
| heroku | （フロントエンドもバックエンド　）PaaS インフラ周りを任せています | 

- Dockerを利用した開発しているため、herokuでもDockerコンテナで稼働しています。
- heroku.ymlという便利なherokuの設定を利用しデプロイしています

#### CI/CD
| 名称      | 説明 | 
|:-----------|:------------|
| CircleCI | （フロントエンドもバックエンド　）PaaS インフラ周りを任せています | 

- github連携しmasterブランチにpushした際にテスト＆デプロイするように設定しています。







# 機能紹介

### 機能一覧　

| 機能名      | 説明 | 
|:-----------|:------------|
| ユーザー機能    | 新規登録、登録内容変更、アバター登録、ログイン、ログアウト   | 
| レシピ投稿機能   | 投稿、編集      | 
| レシピ一覧確認機能 | タイムライン表示、タイトル検索 | 
| お気に入り機能      | 投稿されたレシピをお気に入り登録、解除    |

### 機能詳細

##### トップページ

ログイン＆新規登録への遷移のみ
ヘッダーのボタンはログインしているか、していないかで変わるようにしています

<img width="400" alt="トップ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/1217bf6b-ffb5-b464-6bb0-258b46f9568b.png">
<img width="400" alt="トップ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/631eb015-17fc-e245-893e-fb95eeafd507.png">

##### 新規登録　ログインページ
クライアント側のエラーメッセージはyupとreact-hook-formを使用
アバター写真も設定可能にしています。

新規登録
![signup.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/1379d2de-4238-e95f-88ec-5854b309ba3c.gif)

ログイン
![ログイン.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/290609f2-a661-b936-f7be-6f627ff03353.gif)


##### ユーザー編集
パスワードは任意で変更できるように設定
![useredit.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/ef464abe-56f0-bb67-418e-8104a182a74d.gif)

##### お気に入り登録
投稿レシピ一覧から好きなレシピをクリックするとモーダルにて詳細確認可能
自分が投稿したレシピは編集ボタンが表示され、他人が投稿したレシピにはお気に入り登録ボタンを設置
お気に入りにするとマイページで確認可能になります。
![favo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/a336f3d1-d901-4dd3-b67b-8b6d7bdbe69c.gif)

##### レシピ投稿
写真と材料、手順、時間などを入力
時間のUIはスライダーとカウンターを採用
![レシピ投稿.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/ae1a7919-8ddc-8684-d5ae-5720d5a360a7.gif)


##### レシピ編集
（初期値の設定に苦労しました、、）
![編集.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/2fc68d7a-0787-02eb-8119-586407b559c5.gif)

#####  レシピ検索
タイトル検索です。
![検索.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/242415b5-ad8d-ec16-e7a9-0f496e28408f.gif)



# 制作を終えての感想

Rails　チュートリアルをおわったぐらいからはじめ、そこからSPAに必要なReactなどを勉強しながら作成したので、
余計なライブラリーをインストールしたり不要なエラーを出したりかなり大変でした。

製作中　苦労したポイントを並べてみます。
正直ありすぎて大変でした。

導入系

| 名称      | 説明 | 
|:-----------|:------------|
| Docker  | Dockerとはなんぞ？と理解し、２つのコンテナを同時起動するのが大変でした  | 
| ESlint  | コード整形のツール、途中から導入したのですべてのコードが書き直しになりましたｗｗ  | 
|JEST | javascriptのテストツール　理解するのが大変でした。 | 
| RSpec  | railsテストツール　理解→コード記載が大変でした。  | 
| CircleCI  | CI/CDツール　理解→コード記載が大変でした。うまくデプロイできず、１週間ぐらいつまりました  | 

エラー系

| 名称      | 説明 | 
|:-----------|:------------|
| 非同期処理   | 非同期処理とはなんぞ？と   | 
| CORSの設定   | CORSの理解がまず難しかったです。そんなのどうでもいいから早く通信させろ！って思いつつも知らないとできないもどかしさがすごかったです  | 
| providerの利用   | api通信後のユーザー情報をグローバルステートとして扱いたかったのですが、利用する側でログインユーザがnullになってしまい、 （api通信前なので）コンパイルエラーを起こしていました。原因の把握まで時間がかかったことと、状態管理の難しさを痛感しました。 | 
| Cookieによる認証   | railsのsessionで認証をしたかったのですが、Chromeのアップデートによりセキュア属性がtrueでないとpost送信ができなくなりました。　それを知らずlocalhost環境で認証ができずに困りました。 | 
| レシピの編集機能| 初期値の設定とapiに画像を送ったり送らなかったりでエラー多発 | 

他にも英語のエラーがたくさん出ましたが、これぐらいにしておきます、、、

うれしかったこと　　
やっぱり、エラーでつまってなんとか考え出して解消し、予測通り動いた瞬間はうれしいです。
嫁にすごいね！と褒められるとうれしいですね。


ポートフォリオに入れたかったがやめたこと
| 名称      | 説明 | 
|:-----------|:------------|
| typescript | こちらのほうが便利なことを途中で知り、後戻りできませんでした  | 
| インフラのAWS化  | 第一歩としてheroku ネクストステップとしてAWSを想定していましたが、時間の関係もありAWSは諦めました。時間があれば挑戦したいです    | 
| Firebase　Authenticationの導入 | 　制作途中で存在を知り、cookieよりセキュアなので良いなと思いつつ、後戻りできませんでした | 
| Recoilの導入 | ステート管理として便利そうというとは制作途中で知りました。  | 


なんとかできましたが、実務レベルと比べると「ひどいコード」という自覚はあります。
他の実装されているコードを参考にすればなんとかできるレベルの知識だと思っています。
あとテストコードはもう少し記載をしたかったです。

# 今後について

今月から転職活動を始めます。
もともと７月から始めたいと思っていたので、７月までに仕上げるようにしていました。

同時並行でITパスポートの資格勉強もしており７月中旬に受験します。
最後までお付き合いいただきありがとうございました。

## 学習ロードマップ

自分なりにこのようなイメージで勉強を進めていました。
途中、ブログに手を出したり、右往左往しましたがなんとか達成できました。

![プログラミング学習ロードマップ.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037238/e7d392e5-08e3-7065-1883-7e0e8b92de4f.png)


## 参考になった教材、書籍

| 名称      | 媒体 | URLなど　|
|:-----------|:------------|:------------|
| Railsチュートリアル  | 書籍  |https://railstutorial.jp/ |
| Ruby　on Rails5 速習実践ガイド  | 書籍  | https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227|
| モダンJavaScriptの基礎から始める挫折しないためのReact入門  |Udemy |https://www.udemy.com/share/103Myn3@MuumNARDLz740cW3ek6G--oSzvmiS9wbX_ZctDyQhCPa0x3h2XU5jhvaKJMwTwmyGw==/|
| Reactに入門した人のためのもっとReactが楽しくなるステップアップコース完全版  |Udemy |https://www.udemy.com/share/104dFO3@hDtprjFBiX4yYYPM-EMIrSy1UbBZ0lRCt7ZwnmvDzZ_RzENtI9OJrlmuri3uX4KRyw==/|
| ゼロからはじめる Dockerによるアプリケーション実行環境構築 |Udemy |https://www.udemy.com/course/docker-k/|
| 動かして身につく。RailsAPIとNuxt.jsで作るJWT（JSONWebToken）ログイン認証【22時間超解説】 |Udemy |https://www.udemy.com/share/106GUA3@hGOCbZJbpp7K8H3SVG87zMctWZIlukCc4kw9-US7JCIDtTq2z-yQBm2AZPhD6driyQ==/|
| [テスト編] Nextjs + React-testing-libraryでモダンReactソフトウェアテスト|Udemy |https://www.udemy.com/share/1040nE3@x9aU_XOajhi03jISGgKmf6DaNjr8dQEw7fvZcLO2CmQnOf4gZrGy9dLdHA_BE36Nwg==/|
| Docker超入門講座 合併版 ゼロから実践する4時間のフルコース |Youtube |https://youtu.be/lZD1MIHwMBY|
| とらゼミ |Youtube |https://www.youtube.com/user/1492tiger|
| スラスラわかるネットワーク＆TCP/IP |書籍|https://www.amazon.co.jp/%E3%82%B9%E3%83%A9%E3%82%B9%E3%83%A9%E3%82%8F%E3%81%8B%E3%82%8B%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-TCP-IP%E3%81%AE%E3%81%8D%E3%81%BB%E3%82%93-%E3%83%AA%E3%83%96%E3%83%AD%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9/dp/4797377038|
|USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話|note |https://note.com/takkun_desu/n/n7297b6ea03ff|


ご覧いただきありがとうございました。
作成中質問に答えていただいた方、教材を作成していただいた方、支えてくれた妻に本当に感謝します。