配属先での研修の話～レガシーなwebアプリの裏側～

## レガシーなWebアプリの裏側
みなさんはWebアプリを作成したことがありますか。おそらくこの記事を見ているほとんどの人が経験したことがあると思います。私も実際に新人研修でWebアプリを作成したことがあります。ですが作成したアプリが「どのように」「どの経路で」「どうやって」Web上で見ることができるのか知っている人は少ないのではないでしょうか。やったことあるという人でも、書いてある手順通りににやってみたらできた。なんて人も多いのではないでしょうか。今回はそのことについて、配属先での研修でやったことを書いていこうと考えています。

### 使用環境
- Oracle VM VirtualBox バージョン 6.1.26 r145957 (Qt5.6.2)
- Ubuntu Server 20.04.2 LTS
- Eclipse IDE for Enterprise Java and Web Developers, Version: 2021-06 (4.20.0)
- Spring Tools 4 (aka Spring Tool Suite 4)
- Tomcat 9
- MySQL Ver 8.0.26-0Ubuntu0.20.04.2 for linux on x86_64
- Tera Term 4.106

### VM環境
初めに、VirtualBoxをインストールし、そこにUbuntuをインストールしました。このVirtualBox上のUbuntuをサーバーとして使用します。さらにちゃちゃっとTomcat9とMySQLもUbuntuサーバーにインストールしてしまいます。
ここで使用しているコンピュータとVirtualBoxとで通信の設定を行いました。VirtualBoxのipを確認したところ、10.0.2.15であったので、ここにTera Termでssh接続を試みます。結果は
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225605/562efd56-4d6c-4fb8-319f-7872f31f9260.png" width="20%">
何も設定していないのですから当然です。

なぜこうなったのかというとコンピュータ内にあるVirtualBoxに接続しようとしているのに、コンピュータ外の10.0.2.15に接続しにいったからです。これを回避するのにVirtualBoxの設定でポートフォワーディングの設定を行います。
VirtualBoxの設定→ネットワークで高度タブを開き、ポートフォワーディングをクリックし以下のように設定します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225605/0fba978b-0645-ec50-679c-e2eb5b611d52.png" width="40%">
再度接続を試みますが、今度は127.0.0.1:2222に接続します。すると、無事接続できました。
実際どのようになっているのかというと、以下のような図になっています。
<figure>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225605/4b324e90-ff6d-10cd-8e50-98d843177732.png" width="90%">
<figcaption>図1: ポートフォワードで VM にアクセスする仕組み</figcaption>
</figure>

ポートフォワーディングの設定ができたところで一旦サーバーから離れてWebアプリを作成していきます。

### Webアプリ作成
今回はWebアプリの通信経路等の学習が目標であるのでアプリ自体はどんなものでも関係ありません。[このサイト](https://medium-company.com/spring-boot-thymeleaf/)の通りにそのままアプリを作成します。ブラウザから`http://localhost:8080/`にアクセスしてサイトが表示されれば1段階目は終了です。

次に、データベースに接続します。データベースは先程UbuntuにインストールしたMySQLを使用します。[こちらのサイト](https://medium-company.com/spring-boot%ef%bc%8bjpa%e3%81%a7%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e3%81%ab%e6%8e%a5%e7%b6%9a%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/)を参考に作成していきます。ただ、ローカルにMySQLがないので、データベース接続設定が先のサイトとは異なります。
まず、MySQLの設定をします。外部からアクセスできる権限のあるユーザーを作成します。また、アドレスバインド設定もします。このあたりは調べればいくらでも記事があるのでここでは省きます。
次にVirtualBoxのポートフォワーディングの設定を行います。設定は以下のように行いました。ホストポートは使用されていないポートであれば何番でも構いません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225605/5ba64b6b-b857-a439-16c8-be1c51ecb419.png" width="40%">
最後にWebアプリの接続設定です。application.propertiesを以下のように設定します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225605/3603b976-2357-5bad-18ac-e2d80fc468e5.png" width="50%">
usernameとpasswordは先ほど作成したMySQLのユーザーを使用してください。

設定が完了して、アプリを実行し、ブラウザで`http://localhost:8080/user/list`を開くとDBの値が取得できているはずです。
現段階の通信経路は以下のようになっています。

<figure>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225605/19c7252d-37fe-153d-4c71-bc674195686c.png" width="90%"><br>
<figcaption>図2: ローカルの Web アプリが VM の DB を参照する仕組み</figcaption>
</figure>

しかし、これではSpring BootアプリはEclipse上で開発環境として動作しているだけなので、本番ではUbuntuのTomcatのサーバーにデプロイしなければなりません。最後に本番環境(UbunutuのTomcat)にデプロイする方法とその後の通信経路について説明します。

### 本番環境
- WARファイルの作成<br>
先ほど作成したWebアプリをデプロイするためのWARファイルを作成します。しかし、先ほどの接続設定では繋がらないのでapplication.propertiesの設定の`spring.datasource.url`の値を`jdbc:mysql://localhost:3306/sampledb`にします。ユーザーはローカルからアクセスできる権限があれば変更しなくても大丈夫です。
変更したところで、Eclipseのファイル→エクスポートからWARファイルを選択し、任意の場所にエクスポートします。これでデプロイするWARファイルの作成ができました。
- ポートフォワーディング設定<br>
接続経路が変わるのでポートフォワーディングの設定も以下のように書き換えます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225605/a1ea7117-69cb-9938-bc24-c2e53bd5f8c2.png" width="40%">

- Tomcatにデプロイ<br>
`http://localhost:22222/manager/html/`に接続してTomcatのマネージャを開きます。少し下の「WARファイルの配備」のところでエキスポートしたWARファイルを選択し、配備します。
以下のようになっていれば成功です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225605/89c48827-ef77-06c6-0738-e503ef645976.png" width="80%">

ブラウザから`http://localhost:22222/springSample/user/list`に接続確認をして完了です。

最後に本番環境デプロイ後の通信経路の図を載せておきます。

<figure>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225605/7b7cccc7-3199-87ed-8bd9-8ac217737fff.png" width="90%"><br>
<figcaption>図3: ブラウザから直接 VM の Web アプリを参照する仕組み</figcaption>
</figure>


### 最後に
実際の実用化されてるアプリはVirtualBox内が1つのコンピュータとして、インターネットに出ていく過程でルーター等経由したり、VirtualBox内でもTomcatより前にApache等のアプリケーションを経由したりで複雑です。(まだ勉強中なので違うかもですが)
研修はまだまだ続き、この後VirtualBox環境をラズベリーパイ実装したり(これはほぼ終了しています)、AWS環境に実装したりと進んでいく予定です。

まだまだ勉強中で用語の間違い等あったかもしれませんが、もし間違いがあればコメント等でご教授いただけると幸いです。