React × Spring Boot を本番構成で統合してみた|Docker Composeで開発環境を一体化
はじめに
今回の記事では、ReactとSpring Bootを統合して本番構成を意識した形に移行したこと、そしてDocker Composeを用いたローカル開発環境の構築についてまとめています。
具体的には、
- Reactアプリをビルドし、Spring Bootの
resources/static
に配置して統合 - Spring Bootの設定ファイルを
application.yml
形式に整理し、環境ごとの切り替えを可能に - Docker Composeで、Spring Boot、React(ビルド済み)、PostgreSQLをまとめて起動できる構成を作成
といった内容を扱っています。
これまでの開発の流れや学習過程については、以下の記事にまとめています。
まだ読んでいない方は、あわせてご覧いただくと、今回の内容がより理解しやすくなるかと思います。
- 学習計画を立てた話
- Javaの基礎とオブジェクト指向を学んでみた感想
- Spring Bootのローカル環境構築
- Spring BootでのEntity + Repository実装
- Spring Bootで予約機能を実装してみた|バリデーション・例外処理
- Spring Boot × React で作るイベント予約管理システム(フロントエンド編)
このあとからは、具体的な統合手順やDocker構成について順を追って解説していきます。
ReactとSpring Bootの統合
これまで、フロントエンド(React)とバックエンド(Spring Boot)はそれぞれ別々のアプリケーションとして動かしていましたが、今回のステップでは「ReactをビルドしてSpring Bootに組み込む」ことで、一体化された構成へと移行しました。
1. Reactアプリをビルド
まずは、Reactアプリを本番用にビルドします。
npm run build
このコマンドを実行すると、build/
ディレクトリに静的ファイルが出力されます。
これらは最終的に Spring Boot の resources/static
へ配置することで、バックエンドサーバーからそのまま配信されるようになります。
2. ビルド成果物を Spring Boot に組み込み
Reactで作成された静的ファイルを、Spring Bootプロジェクトの src/main/resources/static/
にコピーします。
# 例:buildフォルダの中身をstaticディレクトリにコピー
cp -r build/* ../backend/src/main/resources/static/
Spring Boot の static/
配下に配置されたファイルは、自動的に Web サーバーで公開される仕組みになっているため、特別な設定を追加しなくても React の画面が表示されます。
3. 統合動作の確認
Spring Bootアプリを起動後、ブラウザで http://localhost:8080/
にアクセスし、Reactのトップページが表示されれば統合は成功です。
Docker Compose でローカル開発環境を一体化
ここからは、React + Spring Boot + PostgreSQL を Docker Compose を使って一体化し、ローカル環境でも本番に近い構成で動作確認できるようにした手順をまとめます。
1. Spring Boot の環境設定切り替え(YAML化)
設定ファイルを application.properties
から application.yml
に移行し、環境ごとに設定を分けて管理できるようにしました。
-
src/main/resources/application.yml
:本番(通常の起動)用の設定
spring:
application:
name: event-reservation-app
datasource:
url: jdbc:postgresql://db:5432/eventdb
username: user
password: password
driver-class-name: org.postgresql.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
-
src/test/resources/application-test.yml
:テスト用の設定
spring:
datasource:
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
driver-class-name: org.h2.Driver
username: sa
password: ""
jpa:
hibernate:
ddl-auto: create-drop
show-sql: true
h2:
console:
enabled: true
Spring Boot のプロファイルは @SpringBootTest
を使って自動切り替えしています(EventReservationApplicationTests
にて設定)。
💡 補足:@SpringBootTest とは?
@SpringBootTest
は、Spring Bootアプリ全体の起動テストを行うためのアノテーションです。
テスト実行時にアプリケーションコンテキスト全体が立ち上がり、application-test.yml
のようなテスト用設定が自動で適用されます。
2. Spring Boot の jar 作成
アプリを Docker イメージとして動かすために、事前に jar ファイルを作成しておきます。
./mvnw package
このコマンドで target/
ディレクトリに jar ファイルが出力されます。
💡 補足:jarファイルとは?
jar(Java ARchive)ファイルは、Javaで作成されたアプリケーションやライブラリをひとまとめにした圧縮ファイルです。
Spring Bootでは、jarファイルにアプリ本体+Webサーバー(Tomcatなど)を内蔵しており、jar単体でアプリを実行することができます。
あわせて、Spring Boot 側の Dockerfile
を用意して、jar ファイルをベースにアプリを起動できるようにします。
3. Spring Boot 用 Dockerfile の作成と配置
jar ファイルをコンテナ上で実行するために、Dockerfile
を作成します。
このファイルは、Spring Boot プロジェクトのルートディレクトリ(backend/
ディレクトリ)に配置しました。
📂 backend/
├── Dockerfile ← ここに配置
├── pom.xml
├── src/
└── ...
以下が実際の Dockerfile
の内容です。
# Java 17ベース(JDK入り)
FROM openjdk:17-jdk-slim
# 作業ディレクトリ作成
WORKDIR /app
# jarファイルコピー(事前に mvn clean package しておく)
COPY target/event-reservation-app-0.0.1-SNAPSHOT.jar app.jar
# アプリ起動
ENTRYPOINT ["java", "-jar", "app.jar"]
4. Docker Compose の作成と配置
Spring Boot アプリと PostgreSQL をまとめて起動できるようにするため、docker-compose.yml
を作成します。
このファイルは、プロジェクトのルートディレクトリに配置します。
📂 プロジェクトルート/
├── backend/ ← Spring Boot(Dockerfileはここ)
├── frontend/ ← React(※今回はビルド済みの静的ファイルを使用)
├── docker-compose.yml ← ここに配置
以下が実際の docker-compose.yml
の内容です。
version: '3.8'
services:
app:
build:
context: ./backend
dockerfile: Dockerfile
container_name: springboot-app
ports:
- "8080:8080"
depends_on:
- db
networks:
- app-network
db:
image: postgres:15
container_name: postgres-db
ports:
- "5432:5432"
environment:
POSTGRES_DB: eventdb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- app-network
networks:
app-network:
volumes:
postgres-data:
ポイント解説
-
app: Spring Boot アプリのサービス。
./backend
をビルドして、ポート8080
で公開。 - db: PostgreSQL のサービス。開発用のシンプルな設定で、データはボリュームに永続化。
- depends_on: Spring Boot アプリを起動する前に、DB が先に起動されるように設定。
- networks / volumes: アプリ間通信とデータ永続化のための設定。
これで以下のコマンドを実行するだけで、アプリと DB が一括起動できるようになります。
docker-compose up --build
Dockerfile と docker-compose.yml の役割の違い
ファイル名 | 主な役割 |
---|---|
Dockerfile | アプリケーション(例:Spring Boot)の Dockerイメージを定義 するファイル。 ベースとなるOSやJDKのバージョン、jarファイルの配置、起動コマンドなどを記述します。 |
docker-compose.yml | 複数のサービス(例:アプリ+DB)を まとめて起動・連携 させるためのファイル。 どのサービスをどこからビルドするか、ポートの公開、依存関係などを設定します。 |
イメージしやすく言うと…
- Dockerfile は「1つのアプリケーションをどう動かすか」のレシピ。
- docker-compose.yml は「アプリ+DBなど、複数のコンテナをどう連携させるか」の設計図。
この2つを組み合わせることで、ローカルでも本番に近い構成を簡単に再現できるようになります!
最後に
今回は、React と Spring Boot の統合、そして Docker Compose を使ったローカル開発環境の構築までを一通りまとめました。
Reactアプリを本番想定で Spring Boot と連携し、さらに Docker でインフラ部分も一体化することで、より現場に近い開発体験ができたと思います。
実際にやってみて「手元でアプリとDBが一括起動できるの便利!」と実感しましたし、環境構築の自動化が進んだことで、今後のデプロイにもつなげやすくなりました。
次回予定していること
次回は、今回作成した Docker イメージを Docker Hub にアップロードし、それを使って AWS へのデプロイ にチャレンジしていく予定です。
- Docker Hub へのプッシュ
- AWS へのデプロイ(EC2 または ECS の予定)
- 環境変数の管理やセキュリティ設定など、本番環境を意識した改善
Discussion