バックエンドバージョンアップの記録

# はじめに
各種ライブラリ等をしばらくバージョンアップしていなかったため、将来に備えてバージョンアップしました。その際の記録です。
なるべく清書しましたが、作業しつつのメモなので、所々順序や方法がおかしい部分もあるかもしれません。可能な限り原典も記載したので、そちらも併せてご確認ください。

# モチベーション
https://zenn.dev/yuitosato/articles/cad5ab93e852ab

# Before & After
これまで使用していたバージョンと、バージョンアップ後の姿を先に掲載します。

| ライブラリ等 | Before | After |公式ページなど|
|:-:|:-:|:-:|:-:|
| Java  | 11 | 17 | [Amazon Corretto](https://aws.amazon.com/jp/corretto/?filtered-posts.sort-by=item.additionalFields.createdDate&filtered-posts.sort-order=desc) |
| Kotlin  | 1.4.31  | 1.6.21 | [Kotlin releases](https://kotlinlang.org/docs/releases.html) |
| Gradle(Wrapper)  | 6.6 | 7.3 | [gradle wrapper upgrading](https://docs.gradle.org/current/userguide/gradle_wrapper.html#sec:upgrading_wrapper) |
| Spring boot  | 2.4.3  | 2.7.0 | [Spring Boot](https://spring.io/projects/spring-boot) |
| Spring Framework  | 5.3.4 | 5.3.20 | [Spring Framework](https://spring.io/projects/spring-framework) |
| Spring Security | 5.4.5 | 5.7.1 | [Spring Security](https://spring.io/projects/spring-security)| 

# 実際の作業

## Kotlinのアップデート
[Release Detail](https://kotlinlang.org/docs/releases.html#release-details)に記載されている現在の最新バージョンである`1.6.21`にします。
また、同ページにあるRecommended kotlinx library versions に記載されている各種ライブラリも併せてバージョンをあげておきます。
```:gradle.properties
kotlinVersion=1.6.21
coroutineVersion=1.6.0
```
### ビルド時のエラーなど
```
Non exhaustive 'when' statements on sealed class/interface will be prohibited in 1.7, add 'null' branch or 'else' branch instead
```
1.4から1.6にバージョンアップすると、いくつかのコードが非推奨や使用禁止になっています。都度修正します。
ワーニングやエラー内容が詳細に出力されるので、それに沿って直せば大丈夫です。

### Kotlin Pluginのアップデート
私はIntelliJ IDEAを使用しているのですが、Kotlinをアップデートしたところプラグインのインストールを促されたので、そちらも実施しました。

## Javaのアップデート
続いてJavaもアップデートします。前述の説明の通り、Java17を使用します。以下はバージョンアップ前の状態です。
```
$ java --version
openjdk 11.0.9 2020-10-20 LTS
OpenJDK Runtime Environment Corretto-11.0.9.11.1 (build 11.0.9+11-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.9.11.1 (build 11.0.9+11-LTS, mixed mode)
```
もともとAmazon Corretto11を使用していたので、こちらの17を使用することにします。
[公式ページ](https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/downloads-list.html)に沿ってインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480689/8ccac1a2-7675-2ad1-e5e0-86f69aef9f48.png)
`.pkg`ファイルをダウンロードし、実行するとインストーラが開くので、それに沿っていけばインストールが完了します。

```shell
$ java --version
openjdk 17.0.3 2022-04-19 LTS
OpenJDK Runtime Environment Corretto-17.0.3.6.1 (build 17.0.3+6-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.3.6.1 (build 17.0.3+6-LTS, mixed mode, sharing)
```

インストール後、再度`./gradlew build`を実行してみると・・・
```shell
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
```
原因はわからないが、次のGradleのアップデートに進みます。

## Gradleのアップデート
[こちら](https://docs.gradle.org/current/userguide/compatibility.html)の表によれば、Java17はGradle7.3と互換性があるようなので、Gradleを7.3に上げます。（さっきのJavaのバージョンアップでのエラー原因がこれだといいのだが）

現在のバージョン
```shell
$ ./gradlew -v

------------------------------------------------------------
Gradle 6.6
------------------------------------------------------------

Build time:   2020-08-10 22:06:19 UTC
Revision:     d119144684a0c301aea027b79857815659e431b9

Kotlin:       1.3.72
Groovy:       2.5.12
Ant:          Apache Ant(TM) version 1.10.8 compiled on May 10 2020
JVM:          17.0.3 (Amazon.com Inc. 17.0.3+6-LTS)
OS:           Mac OS X 11.5.2 x86_64
```

というわけで、[公式ページ](https://docs.gradle.org/current/userguide/upgrading_version_6.html) を参考にGradle Wrapperをアップデートします。
```shell
$ gradle wrapper --gradle-version 7.3
$ git status
        modified:   gradle/wrapper/gradle-wrapper.jar
        modified:   gradle/wrapper/gradle-wrapper.properties
        modified:   gradlew
        modified:   gradlew.bat

$ ./gradlew -v

Welcome to Gradle 7.3!

Here are the highlights of this release:
 - Easily declare new test suites in Java projects
 - Support for Java 17
 - Support for Scala 3

For more details see https://docs.gradle.org/7.3/release-notes.html


------------------------------------------------------------
Gradle 7.3
------------------------------------------------------------

Build time:   2021-11-09 20:40:36 UTC
Revision:     96754b8c44399658178a768ac764d727c2addb37

Kotlin:       1.5.31
Groovy:       3.0.9
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          17.0.3 (Amazon.com Inc. 17.0.3+6-LTS)
OS:           Mac OS X 11.5.2 x86_64

```
バージョンアップが完了したら、`./gradlew build`でビルドが正常に完了するかを確認します。
```shell
$ ./gradlew build
```

## Springのバージョンアップ
`Spring`関連のバージョンは`gradle.properties`に記載されていたので、修正します。
```diff_properties:gradle.properties
- springVersion=5.3.4
- springBootVersion=2.4.3
- springSecurityVersion=5.4.5
+ springVersion=5.3.20
+ springBootVersion=2.7.0
+ springSecurityVersion=5.7.1
```

なお、バージョンアップに伴い、`SpringSecurity`の書き方を変える必要があったようなので、そこは修正しました。

**参考）**

https://www.codejava.net/frameworks/spring-boot/fix-websecurityconfigureradapter-deprecated

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

また、URLのマッチングパターン方法が変わっているそうなので、そちらも修正します。

https://spring.io/blog/2020/06/30/url-matching-with-pathpattern-in-spring-mvc

具体的には以下の1行を`application.properties`に追加します。
(`main/resources`だけでなく、`test/resources`にも追加します。）
```properties
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
```

# 終わりに
大体の場合ビルド時にエラーなどで検知できるので、一つ一つ潰していけばそう難しくはない・・はず。