自作アプリをSpringBootにリプレイスした話

# はじめに

こんにちは。takunと申します。

つい昨日[Javaサーブレットで作成したWebアプリ](https://qiita.com/takun/items/9ba715007c797e7ed21c)をSpringBootを用いた実装にリプレイスしてみました。
リプレイスにあたり、コーディング内容だけでなく環境設定やデプロイ方法も変わり苦戦しました（苦笑）
プロセスを備忘録として残します。

当方は初心者エンジニアです。間違ったことや不適切な内容となってしまう可能性もあることをご承知ください。また、助言など頂けると嬉しいです。

前提として以下の通り。
使用PC：MacbookAir(Intel)
開発環境：Eclipse
使用言語：Java,SpringBoot
使用DB：MySQL5.7
大まかな構成：HTML(thymeleaf),コントローラークラス,DAOクラス

[注意]今後ログイン認証機能も考えているため、ソースが汚いかもしれません・・・↓

https://github.com/takumiuma/menu-proposer

https://menu-selection-de8489ad965d.herokuapp.com/menu

# DBアクセスのライブラリが複数ある問題
キーポイントとしては元アプリのソースがRAND関数を用いたクエリを記述していたため、やや特殊なケースで簡単に書き換えることができなかった点です。
DBのアクセス方法はSpringDataJPAか、SpringJDBCを用いたものがあるようで、上記のクエリを実行できるものであればいいと思いました。

SpringJPAの書き方を調べてみました。どうやら提供されたメソッドで基本的なSQLは生成してくれますが、RAND関数は調べても見つかりませんでした。
一方で、JPQLという記法で独自のSQLを生成することもできるようです。色々やってみたのですが、DBからうまく取ってこれなかったので・・・
最終的に、直接SQLを書き込めるSpringJDBCのJdbcTemplateを採用しました。

> 絶対にリベンジだ。

以下参考記事

https://qiita.com/crml1206/items/bab47b15342e25343e3c#:~:text=JDBC%EF%BC%9A%E8%87%AA%E5%88%86%E3%81%A7Native%E3%81%AA,%E8%A8%80%E8%AA%9E%E3%80%8CJPQL%E3%80%8D%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%80%82&text=JPA(Hibernate)%E3%81%A7%E5%8B%9D%E6%89%8B%E3%81%AB,%E3%81%99%E3%81%90%E7%B5%82%E3%82%8F%E3%82%8B%E8%89%AF%E3%81%95%E3%82%82%E3%81%82%E3%82%8B%E3%80%82

https://b1san-blog.com/post/spring/spring-jpa/

# jar見つからない問題
ローカル環境でアプリが動作するのを確認し、いざHerokuへデプロイ！
とりあえず、公式リファレンスにSpringBoot用のデプロイ手順あるから従ってみる。

> ん？デプロイは成功したのに、なぜ開かない・・・
ログ見てみるか。

~~~
 Error: Unable to access jarfile target/dependency/webapp-runner.jar
~~~
jarファイルが見つからないというエラーのようでした。
調べてみると、targetフォルダ下にjarファイルがないと動作しないようでした。
> 前回みたいにwarファイルを事前にビルドしておく準備が必要なのかー


https://qiita.com/hiroki1994/items/72a52f2139c1088c623b

上記記事参考にさせて頂きました。個人的なポイントとしては、
- Eclipse上でのjarを生成するMavenコマンド。この記事に書いてないけど、私は実行の構成でゴールの欄は「package」としています。
※もし、targetフォルダ下にjarが生成されなかったら、以下を試すのが良いかも。
  - 反映させる方法
プロジェクト上で右クリック→Maven→プロジェクトの更新
  - 一旦クリーンしてみる方法
プロジェクト上で右クリック→実行→Maven clean→Mavenビルド
- heroku git pushコマンドではなく、以下のようなheroku deployコマンド。
~~~
 $heroku deploy:jar target/(プロジェクト名)-0.0.1-SNAPSHOT.jar --app (アプリ名)
~~~

#  SpringSecurityの奥が深すぎ問題
デプロイもOK！アプリも開く！ん、まって、デフォルトの認証フィルターどうしよう。
> そういえばログイン認証も作ろうと思ってpom.xmlに書いてたな。トップページは誰でもアクセスできるようにしたいし...

調べてみたのですが、以下の理由から内容が難しく一旦参考書を使って学ぶ必要があると考えました。
- そもそも概念・構造もむずい。
- 最新バージョンに変わり、以前のセキュリティ設定の書き方が削除されている。
調べると多くの情報ソースがver6以前のもので参考にならない。そのため、初見だと太刀打ちできないと感じた。
- chatGPT3.5は2021年以前のデータを扱っているため、頼りにできない。

https://qiita.com/suke_masa/items/908805dd45df08ba28d8

https://www.docswell.com/s/MasatoshiTada/KGVY9K-spring-security-intro#p1

上記記事参考にしセキュリティクラスを書いてはみたものの、h2DBとマッピングが競合するエラーが起きたりと、どうしても修正することができませんでした。
~~~
This is because there is more than one mappable servlet in your servlet context: 
{org.h2.server.web.JakartaWebServlet=[/h2/*], 
org.springframework.web.servlet.DispatcherServlet=[/]}.
~~~
pom.xmlはセキュリティ系dependencyをspring-security-coreのみにしたところ、認証フィルターが出なくなりました。
何故かはわかりませんが、@EnableWebSecurityを提供するライブラリをimportできないので、その部分のライブラリが含まれていないのだろうと推測しています。
h2DBあってもなくてもアプリは動作するので、今は消しています。これも推測ですが、security.configのライブラリがコンテキストパスに影響を与えていることが原因なのだろうと考えています。

現状のライブラリでもパスワードのハッシュ化などできますが、もう少しsecurityについての勉強が必要だとヒシヒシ感じました。

# おわりに

こんな新米エンジニアの記事をここまで見て頂けて嬉しいです。拙い文章で恐縮ですが、見ていただいてる方に分かりやすい内容となるよう努めていきます！
コメントやアドバイスなど頂けたら嬉しいです！