概要
最近お仕事のほうでJava SpringgBootを使用したシステムを触れることになりました。対象のシステムのローカル環境構築を行いましたが、前職でやっていたGoやPythonなんかと比較すると設定項目が多くて面倒くさい印象です。
理想を言えばローカル開発環境はREADME.mdに記載されている数行の環境構築方法を読めば誰でも早く楽に実行できるようにしたいですよね。よって今回の要件としては以下を目指します。
完成したプロジェクトはこちら
- 要件
- 動作が軽くてプラグインが充実しているvscodeを使用
- ローカルにインストールするツールとしては以下の2つのみ。
- docker(+ docker compose)
- Dev Containers(vscodeのプラグイン)
- コンテナ上で実行・ブレークポイントを使用したデバッグを行えるようにする。
- IDEと同レベルの入力補完も使えるようにする。
- SpringBootに簡易的なrest apiのエンドポイントを作成し、「http://localhost:8080」からリクエストを受け取れるようにする。
- mysqlのコンテナを立ててSpring側からからアクセスできるようにする
Spring Bootプロジェクトの作成
上記のSpring InitializrのリンクからSpring Bootプロジェクトを作成します。今回作成するプロジェクトの設定項目は以下の通りです。※以下プロジェクト名は「atoraku」とします。
設定完了後「GENERATE」を選択してダウンロードしてworkspaceに配置します。
vscodeを開き「ファイル(F) > フォルダを開く」でプロジェクトを開きます。
ファイルの追加
必要なファイルを追加します。完成
build.gradle
dependenciesにMySQLのコネクターである「com.mysql:mysql-connector-j」を追加します。
runtimeOnly 'com.mysql:mysql-connector-j' // 追加
Dockerfile
今回の記述方法だと「as ~~~」でイメージに別名を付与しており、 一つのDockerfileに2つのイメージを定義しています。
corretto22のコンテナに「findutils」と「tar」をインストールしています。こちらはDev Containers起動時にインストールしていないとエラーになるので必ず入れましょう。
mysql側のコンテナには日本語適用させる設定を記載しています。
# JDKはamazoncorrettoを使用
FROM amazoncorretto:22-jdk as corretto22
WORKDIR /app
# コンテナ内で ./gradlew コマンドを実行するために必要
RUN yum install -y findutils tar
FROM mysql:8.0.39-debian as mysql
RUN apt-get update && apt-get install -y locales \
&& sed -i -e 's/# \(ja_JP.UTF-8\)/\1/' /etc/locale.gen \
&& locale-gen \
&& update-locale LANG=ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
ENV TZ Asia/Tokyo
ENV LANG=ja_JP.UTF-8
compose.yaml
こちらで重要なことはコンテナ間の通信を行うために
- コンテナ間で通信を行うため、トップレベルに「networks」を定義して両方のコンテナに設定する。
- service.db.environmentにmysqlのユーザ情報を設定します。
- service.db.volumesにコンテナ起動時に実行したいDDL , DML初期を記載したファイルや初期設定ファイル、mysqlのデータ保管場所をvolumesに設定します。volumesに設定することでローカルのディレクトリとコンテナ内のディレクトリを同期することができます。
- ※ – “./docker/db/data:/var/lib/mysql” の場合ローカルのatoraku/docker/db/dataとdbコンテナの/var/lib/mysqlが同期します。
- 今回の例ではこちらでコンテナ起動時にDDL , DMLを実行してshop DBにsweetsテーブルを作成しデータを投入しています。
src/main/resources/application.yaml
こちらはspring の環境変数を設定するファイルになります。ポイントはspring.datasource.urlの設定で「url: jdbc:mysql://${コンテナ名}:${port}/${database}」となります。今回の例では全てcompose.yamlで設定しており、設定箇所は「コンテナ名」、「port」、「database」になります。
spring:
application:
name: atoraku
datasource:
url: jdbc:mysql://db:3306/shop
username: user
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect
Javaファイル(Controller , Service , Repository)
詳しい説明は省略しますが、「/api/sweets」にGetメソッドでアクセスされた時にDBのsweetsテーブルのデータを全て返却するようになっています。ContorollerからSweetsServiceクラスをDIしてSweetsServiceからJPAを利用してsweetsテーブルのデータを取得しています。
@Controller
@RequestMapping("/api")
public class SweetsController {
@Autowired
private SweetsService sweetsService;
@GetMapping("/sweets")
public ResponseEntity<List<Sweets>> getSweets() {
List<Sweets> sweets = sweetsService.getSweets();
return ResponseEntity.ok(sweets);
}
}
ローカル環境構築
- 今回の手順は.devcontainerフォルダが未作成の場合のみ実施する必要があり、作成後は次回以降はスキップできます。
- vscodeを開きdockerがインストール済の環境でプロジェクトを開きます。(筆者はwindowsPC)からwslに接続しています。)
- 左下の「リモートウィンドウを開くオプション」をクリックし、「コンテナーでフォルダーを開く」を選択します。
- 「compose.yamlから」を選択
- 「java」を選択(こちらはcompose.yamlに記載したService名です。)
- 機能の選択は何も選択せずに「OK」をクリックします。
- ここでvscodeで開発コンテナーを開きますが、一度左下の「リモートウィンドウを開くオプション」をクリックし接続を終了します。
- vscodeの拡張機能から「Extension Pack for Java」をvscodeにインストールします。拡張機能から検索します。devcontainerにインストールするための設定を追加するため、歯車マークをクリックして「devcontainer.jsonへ追加」をクリックします。
- 左下の「リモートウィンドウを開くオプション」をクリックし、「コンテナーで再度開く」を選択します。
- vscodeでdevcontainerを開きます。(compose.yamlのサービス「java」のコンテナを実行して、その中身をvscodeで開いているイメージです。depends_onでdbを設定しているため、同時にdb)のコンテナも起動します。)gradleとExtension Pack for Javaのインストールが走るため初回は少し時間がかかります。
- 下の表示が「Java: Ready」になったらOKです
実行方法
通常実行
- Javaファイルを開いて左上の「Run Java」を選択するだけです。
デバッグ実行
- ブレークポイントをはって「Debug Java」をクリックします。ブレークポイントの場所で停止します。
最後に・・・
- 問題なく予測変換も効きます。
- gradle.buildにdependencyを追加する場合は「./gradlew dependency」実行後にvscodeを開きなおすと予測変換で読み込むことができます。