高卒実務未経験状態から正社員就職した時に作成した、ハイレベルなポートフォリオに関して(AWS, Docker, CircleCI,Vue.js, Laravel、Ajax(axios))

![erzu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/cac1494b-df71-4396-280e-b67f7643d850.png)

# 初めに

今回は **<font color="SteelBlue">Docker</font>**, **<font color="SteelBlue">CircleCI</font>**, **<font color="SteelBlue">AWS</font>**, **<font color="SteelBlue">Vue.js</font>** など、人気の高まっているフレームワークやインフラ技術を一から学んで、比較的ハイレベルなポートフォリオ(Webアプリ)を作成した時のことに関してまとめてみました！



ちなみに、こちらのアプリ作成時期や体験談は一年ほど前の話になりますが、
今だからこそわかる部分もあるのでその辺も含めてまとめていければと思います。

特に『実務経験がない方』や『これからエンジニア就職・転職していきたい！』という方に対して、何かしらご参考になれば幸いです！


# 目次

* アプリの概要
* 使用技術
* インフラ構成図
* 機能一覧
* DB設計
* 技術選定の基準
* 機能実装で意識したこと
* 開発にあたって苦労したこと
* (その他)各機能実装の際に参考にした記事や教材
* アプリ開発にあたって苦労した点、

# アプリの概要

今回作成したものは、

バックエンドは **<font color="SteelBlue">Laravel</font>**
フロントエンドに **<font color="SteelBlue">Vue.js</font>**
インフラに **<font color="SteelBlue">AWS(EC2)</font>** 

といった構成のアプリです。


内容としては、
『食べログをテーマをしたSNSアプリ』ですが、実際はモダンな技術を勉強する際のアウトプットを兼ねたポートフォリオ制作といった感じです。
※ アクティブユーザー数は1人、つまり自身のみです💦


URLはこちら↓

※現在公開停止中
~~アプリのURL：https://www.laravelvueport.link/login~~


GitHubのURL：

https://github.com/masaaki-imai/Historical-portfolio

動画(Instagram)：

https://www.instagram.com/p/CbJUAK3hNEb/

外部公開停止理由として、AWSの1年限定無料枠が切れたために、元は毎月200円程度だったサービス料が9000円に跳ね上がったためです。初学者の皆さんは無料枠が切れた際に気をつけていただければと思います。


### 使用画面のイメージ

トップページ

![スクリーンショット 2022-03-16 7.55.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/052413d8-3225-0e70-46ca-457ffe56479e.png)

写真詳細(コメント機能付き)
![Screenshot 2023-07-16 at 12.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/6436f8c1-0bcb-d85d-2510-4a7cee9b56fb.png)



ログイン、初回登録画面

![スクリーンショット 2022-03-16 7.50.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/16d74768-c8b4-b8aa-fe13-704a934d0580.png)



### 開発環境、本番環境について
開発環境に`Docker / docker-compose`を使用しており、以下の3つの用途のコンテナを使用しています。
また、本番環境はAWSで環境構築していく形で進めました。

1. Webサーバーのコンテナ： Nginx
1. アプリケーションのコンテナ： PHP / Laravel / Vue.js
1. DBのコンテナ： MySQL

参考リンク：

https://qiita.com/shimotaroo/items/29f7878b01ee4b99b951#8docker-composeyml%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B

https://qiita.com/shimotaroo/items/679104b7e00dd9f89907





# 使用技術

* __フロントエンド__
  * __Vue.js 2.6.14__
  * __JavaScript__
  * __HTML / CSS__

* __バックエンド__
  * __PHP 7.4.1(→ 8.0.16　Now)__
  * __Laravel 6.20.26(→ 9.17.0　Now)__
  * __PHPUnit 9.5.16__

* __インフラ__
  * __CircleCi__
  * __Docker 20.10.12 / docker-compose 2.2.3__
  * __nginx 1.18__
  * __mysql 5.7.31 / PHPMyAdmin__
  * __AWS( EC2, ALB, ACM, S3, RDS, Route53, VPC, EIP, IAM )__ 

作り終わった後、
余力があったので個人開発レベルでのバージョンアップも行いました。

サーバーサイドのロジックはPHP/Laravelでプログラミングし、
フロントエンドはVue.js(JavaScript)のみで実装しました。
開発環境にDocker/docker-composeを使用し、
CI/CDパイプラインに関しては、CircleCIで自動テスト・ビルド・デプロイを全て実現するようにしています。

# インフラ構成図
draw.io で ER図 を作成しました。
初学者にも扱いやすいのでおすすめです！✨
![erzu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/cac1494b-df71-4396-280e-b67f7643d850.png)








参考書籍：
- [Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版](https://www.amazon.co.jp/Amazon-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89-%E6%94%B9%E8%A8%823%E7%89%88/dp/4296105442/ref=mp_s_a_1_12?crid=QYSMIF95KSNM&keywords=%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%85%A5%E9%96%80+aws&qid=1680296774&sprefix=%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%85%A5%E9%96%80+aws%2Caps%2C295&sr=8-12)
- [ゼロからわかるAmazon Web Services超入門 はじめてのクラウド (かんたんIT基礎講座)](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8BAmazon-Web-Services%E8%B6%85%E5%85%A5%E9%96%80-%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89-%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93IT%E5%9F%BA%E7%A4%8E%E8%AC%9B%E5%BA%A7/dp/4297106612/ref=asc_df_4297106612/?tag=jpgo-22&linkCode=df0&hvadid=342595526565&hvpos=&hvnetw=g&hvrand=4098711478022152966&hvpone=&hvptwo=&hvqmt=&hvdev=m&hvdvcmdl=&hvlocint=&hvlocphy=9177175&hvtargid=pla-898009145160&psc=1&th=1&psc=1&ref=d6k_applink_bb_dls&dplnkId=be51f29c-6c08-44fc-93ae-cd4bc9bf4d3e)
 


自身はこれに加えて、
こちらの教材を分からない部分を集中的に参考にさせていただきました。
(注: Rubyの記事です)

参考リンク：
- [【2021年リライト版】 世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで](https://zenn.dev/naoki_mochizuki/books/1471ce20222227)

デメリットとして、限られた時間の中でこんなに手を出すは相当難しいです💦
ただ、『一度学ぶと今後長期的にインフラ領域が大体どんな感じなのかを分かった上で実務での作業ができる』という大きなメリットもあるので、個人的にはやった価値は相当あったかなという印象です。

#### S3バケットへのアップロード
以下の２つの用途のために使用しました。

1. 開発環境(MacBook)、本番環境(AWSのEC2上)でアップロードした画像データを格納

1. 保守の観点でできる限り、DBやサーバー、S3等をAWS上で完結させたかった。

1. AWSの勉強に際してのアウトプット目的


Laravelの基本的な知識があれば、Vue.js初心者でも「Vue + Laravel + AWS（S3のみ）」のアプリケーションを作成できる教材です。


#### Slackへの通知設定
デプロイ関連の処理でSlackアカウントに通知が飛んでくるようにしています。


# 機能一覧

* __一般ユーザー登録関連__
  * アカウント新規登録
  * ログイン、ログアウト機能

* __ページネーション機能__

* __写真ダウンロード/機能(FileReader API、　FormData API を使用)__
* __ユーザー写真投稿(AWS S3 バケット、FileReader API、　FormData API を使用)__
    

* __コメント機能__ 

* __エラーハンドリング機能(Vue.js / Ajax(axios))__ 

* __いいね機能(Vue.js / Ajax(axios))__

#### 機能を実装する際に学習したこと
- **アクセサ**
- **正規表現**

# DB設計

#### ER図
![erず.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/4d4719da-5ee0-68fd-466c-65e6612bf73c.png)


#### 各テーブルについて


|    テーブル名    |                      説明                      |
| :--------------: | :--------------------------------------------: |
|      users       |                ユーザー情報                |
|      photos      |               登録した写真情報（12桁のランダムな値をidとして管理）               |
|     comments      |      コメント情報       |
| likes | いいね機能に関する情報 |


# 技術選定の基準

### バックエンド
『学習教材が豊富』なこと、個人開発だけでなく今後業務で使うとなった場合にも『長期的に使用していけるかどうか』、の二点を主に基準としました。 まず『学習教材の豊富さ』についてですが、学習教材が豊富なバックエンドの言語はPHP,Ruby。このうち長期的に使用していけるかどうかについて考えた際にGitHubのフレームワークのスター数、Googleトレンド等を参照するとこの条件に最も当てはまるのは、バックエンド言語だとPHPであり、現在（2022年3月）Laravel-11がリリースされるのが確定していることも含めて、PHPのフレームワークにLaravelを使うことを決めました。尚、バージョンについてですが、アプリ開発を始めた日（2021年12月24日頃）のLTS(Long Term Support)はLaravel6であり、Laravel6の情報量もかなり多いことからLaravel6 でのアプリ開発をしていきました。

### フロントエンド
ページ表示速度を早くするために、 Vue.js、React のどちらかを使うことにしましたが、『学習教材が豊富』 なことと、学習コストを考慮して Vue.js を選びました。 Laravelの公式でもVue.jsの方を採用している事も基準の１つでした。 またVue.js を使うにあたって、Ajaxによる非同期通信では、Laravelのpackage.jsonに標準で記載されているaxios(JavaScriptの外部ライブラリ)を使用しました。

### インフラ

インフラをどうするか考える際に、以下の記事を参考にしました

https://capeyes.hatenablog.com/entry/2015/04/26/091150
一部記事の内容を引用すると、あるサイトの表示速度について次のようになったとのこと

* Heroku トップページのリロードでだいたい2.2秒
* AWS × 東京リージョン トップページのリロードで1秒未満

このことからページ表示速度を早くするためにも、Herokuではなく、AWS でアプリをデプロイすることに決定しました



# 機能実装で意識したこと

これを読んでいる方も、一度はページのローディングだったり登録処理で時間かかってイライラした経験ってあるんじゃないでしょうか？自身で作成するアップりでは絶対に時間かかってイライラさせたくない！という思いが強く、処理にかかる時間を大幅に短縮するためにも SPAでの実装(今回は Vue.js)で実装を進め、ページネーション以外の機能を全てAjax(axios)による非同期通信で行いました。

具体的には

* 写真のアップロード
* コメント送信機能
* 写真のダウンロード機能

などをAjax(axios)による非同期通信で行いました。

それだけでなく、当時無料サーバーとして人気を誇っていたHerokuではなくて、AWSの『日本リージョン』でのインフラ環境構築構築を行いました。
そのおかげもあって、Vue.js特有の初回ロードが遅くなってしまう影響があるにも関わらず、初期ページのロード時間を0.8秒に終えることに成功しました。

#### スピードインサイト

スピードインサイトでのパフォーマンス計測画像
![スクリーンショット 2022-03-14 8.34.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/3e62c6f9-7e87-62f0-af94-fc66a2ac5f56.png)

# 開発にあたって苦労したこと

そもそも個人サービス(という枠組みに入れていいのかわかりませんが、) を作成するのは初めての事で、今まではプロゲートやドットインストールをやった後、テックピットでSNS風、Laravelアプリを作成していたレベルからの取り組みでした。
そのため、ここまで作り上げるのは相当苦労しました。

※実際、実務経験がもうすぐ一年となりますが、実務未経験でよくこんなの作れたな〜感は多少あります💦

具体的にここで苦労したみたいなピンポイントでの箇所はありませんが、
インフラ関連が難しかったと記憶してます。
インフラ構成図に載っているものはほとんどこのためだけに0=>1で勉強したもので、

* AWS( EC2, ALB, ACM, S3, RDS, Route53, VPC, EIP, IAM ),
*  Docker(Qiitaを参考に環境構築)
*   CircleCI
*   Vue.js, 
*   Ajax(axios)、
*  PHPUnit
*  ...

と言う割と膨大な量の勉強をする必要があったことかなと振り返って思います。





# 特に有益だった記事

### 王道の教材

※自身の場合、未経験の際にはUdemyを使用していませんでした。


https://prog-8.com/

https://dotinstall.com/

https://www.techpit.jp/


### 勝俣健太さんのおすすめ教材

0からDocker を始める際に使用

http://y-ohgi.com/introduction-docker/


↓ 第3章までがポートフォリオ作成に関連する部分

https://www.monotaro.com/p/5260/2026/?utm_id=g_pla&cq_med=pla&cq_plt=gp&utm_medium=cpc&utm_source=google&utm_campaign=246-833-4061_6466659573_shopping&utm_content=96539050923&utm_term=_419857551521_x_pla-879055535895&gclid=Cj0KCQjwla-hBhD7ARIsAM9tQKtP5tGJ3vcCVE8oalUBSbNgtD7Zklcd9rfZ0WNfPc8W9g_YGilpUXcaAh7nEALw_wcB

### 書籍一覧

Vue.js を０から始める際に使用

https://books.rakuten.co.jp/rb/15712217/




改訂2版 わかばちゃんと学ぶ Git使い方入門
〈GitHub、SourceTree、コマンド操作対応〉

これが今まで見てきた技術書で一番好きです！
これ一冊で実務にも困らない程度のGit 力がつきます。
一言で言うと『わかりやすい！』


https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-%E3%82%8F%E3%81%8B%E3%81%B0%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E5%AD%A6%E3%81%B6-Git%E4%BD%BF%E3%81%84%E6%96%B9%E5%85%A5%E9%96%80%E3%80%88GitHub%E3%80%81SourceTree%E3%80%81%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E6%93%8D%E4%BD%9C%E5%AF%BE%E5%BF%9C%E3%80%89-%E6%B9%8A%E5%B7%9D-%E3%81%82%E3%81%84/dp/4863543433

たとえばこんな感じです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/624f7c6f-7064-f786-a345-8b6ef1b4c075.png)


※Web版もあります(無料)

https://www.r-staffing.co.jp/engineer/entry/20190621_1


### Qiitaの記事
ポートフォリオだったり、記事の内容だったりかなり勉強になります。

https://qiita.com/nasuB7373/items/0e507abad2017976c407

### インフラ

https://www.techpit.jp/courses/78



https://www.amazon.co.jp/Amazon-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89-%E6%94%B9%E8%A8%823%E7%89%88/dp/4296105442/ref=mp_s_a_1_12?crid=QYSMIF95KSNM&keywords=%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%85%A5%E9%96%80+aws&qid=1680296774&sprefix=%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%85%A5%E9%96%80+aws%2Caps%2C295&sr=8-12

https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8BAmazon-Web-Services%E8%B6%85%E5%85%A5%E9%96%80-%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89-%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93IT%E5%9F%BA%E7%A4%8E%E8%AC%9B%E5%BA%A7/dp/4297106612/ref=asc_df_4297106612/?tag=jpgo-22&linkCode=df0&hvadid=342595526565&hvpos=&hvnetw=g&hvrand=4098711478022152966&hvpone=&hvptwo=&hvqmt=&hvdev=m&hvdvcmdl=&hvlocint=&hvlocphy=9177175&hvtargid=pla-898009145160&psc=1&th=1&psc=1&ref=d6k_applink_bb_dls&dplnkId=be51f29c-6c08-44fc-93ae-cd4bc9bf4d3e
 

https://zenn.dev/naoki_mochizuki/books/1471ce20222227

### Vue.js ✖︎ Laravel

https://www.hypertextcandy.com/vue-laravel-tutorial-introduction



# 終わりに

ここまで読んでいただき誠にありがとうございます！(*^^*)
特に『実務未経験』の方のポートフォリオ制作にあたって、少しでも参考になれば幸いです！
今回は以上です。


## その他写真
![スクリーンショット 2022-02-22 9.44.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/113e7c66-d554-8caa-726c-a860f11b8868.png)