🐕

Spring boot+dockerで webアプリケーション環境構築

2024/10/08に公開

はじめに

dockerとspring bootを用いたwebアプリケーションの環境構築について、説明します。

階層図

project-root
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── demo
│   │   │               ├── controller
│   │   │               │   ├── HelloController.java
│   │   │               │   └── UserController.java
│   │   │               └── service
│   │   │                   └── UserService.java
│   └── resources
│   └── test
│       └── java
│           └── com
│               └── example
│                   └── demo
│                       └── JavaAppApplicationTests.java
├── .gitignore
├── Dockerfile
├── build.gradle
├── docker-compose.yml
├── gradlew
└── gradlew.bat


build.gradleの設定

Gradleとは

Java向けに開発されたオープンソースのビルドツールです。
build.gradleはプロジェクトのビルドに関する設定を記述するファイルであり、Gradleがこれを読み込んでビルド作業を進める役割を果たしています。

plugins {
    id 'org.springframework.boot' version '2.7.3'
    id 'io.spring.dependency-management' version '1.0.13.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'org.postgresql:postgresql'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

plugins

id 'org.springframework.boot' version '2.7.3'
このプラグインはSpring Boot用のGradleプラグインで、Spring Bootアプリケーションの構築や実行に必要なツールとタスクを提供します。
bootRun タスクを提供し、開発中のアプリケーションを起動します。

id 'io.spring.dependency-management'
依存関係の管理をSpring Bootと連携して行うためのプラグインです。バージョンや依存関係の解決を効率化します。

id 'java'
id 'java'を指定することで次のようなタスクが利用可能になりま
・compileJava: Javaソースコードのコンパイル
・test: 単体テストの実行
・jar: JARファイルのパッケージ化

sourceCompatibility

sourceCompatibility = '17' は、プロジェクトが使用する Java のバージョンを指定します。この場合、Java 17 を使用することを意味します。これにより、指定したバージョンに対応した言語機能を使用できるようになります。

dependencies

Projectが利用するライブラリです。

設定されている各項目について、解説します。

implementation 'org.springframework.boot:spring-boot-starter-web'

Spring Boot
アプリケーションでウェブアプリケーションを構築するための便利なスターター依存関係です。このスターターを使うことで、以下のような重要なコンポーネントが自動的にセットアップされます。

Spring MVC
ウェブアプリケーションのためのフレームワークで、HTTPリクエストの処理やコントローラーの実装をサポートします。

Tomcat
デフォルトの組み込みサーバーとして、アプリケーションを簡単に実行できるようにします。他のサーバー(Jetty や Undertow)も選択可能です。

Jackson
JSONのシリアライズおよびデシリアライズを行うライブラリで、RESTful APIを構築する際に便利です。

Spring Bootの設定: 一般的な設定や初期設定が自動的に行われ、開発がスムーズになります。

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

Spring Data JPA
JPA(Java Persistence API)を使用してデータベース操作を行うためのフレームワークです。リポジトリパターンを使ったデータアクセスが簡単に実装できます。

Hibernate
JPAの実装として、エンティティのマッピングやクエリの実行を行います。デフォルトで組み込まれているため、特別な設定をしなくても使用できます。

データベース接続
データソースの設定が自動的に行われ、アプリケーションプロパティを通じて簡単にデータベースに接続できます。

トランザクション管理
JPAのトランザクション管理が組み込まれており、データベース操作に関するトランザクションを簡単に扱えます。

runtimeOnly 'org.postgresql:postgresql'

実行時に使用できるように、ビルド出力だけに依存関係を追加する。

testImplementation 'org.springframework.boot:spring-boot-starter-test'

テスト実行時のみ、依存関係をコンパイルクラスパスに追加する。

test {
    useJUnitPlatform()
}

testブロックはGradleの標準的なタスクで、JUnitを使ったテストを実行するために設定されます。
useJUnitPlatform()は、JUnit 5をテストプラットフォームとして使用することを指定します。この構文により、JUnit 5の特徴的なアノテーションや機能が利用可能になります。

gradle-wrapper.propertiesについて

「Wrapper(ラッパー)」とは、Gradleがインストールされていない環境でもGradleビルドを実行できるようにするための仕組みです。
これは、プロジェクトで必要なGradleの特定のバージョンをダウンロードして使うためのスクリプトであり、すべての開発者が同じGradleのバージョンを使用できるようにします。

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip

networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

distributionUrl に、使用したいGradleのバージョンを指定する。

Gradle公式ドキュメント
https://docs.gradle.org/current/userguide/userguide.html

HelloController.javaに「Hello World」を記述

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/")
    public String hello() {
        return "Hello World!";
    }
}

@RestController

Thymeleafによって生成されるHTMLをレスポンスする場合は、@Controllerを使います。
JSONやXMLをレスポンスするようなAPI形式の場合は、@RestControllerを使うのが適切です。

@GetMapping("/") の "/" は、ルートURL(例: http://localhost:8080/)を意味します。そのため、ブラウザなどでこのルートURLにアクセスすると、このメソッド hello() が呼び出されます。

@GetMapping("/")

HTTP GETリクエストを指定したURLパス(ここでは"/")にマッピングします。このアノテーションをメソッドに付けることで、そのメソッドが指定されたパスに対するGETリクエストに応答するようになります。

docker-composer.ymlの設定

version: "3.6"
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: demo-java
    tty: true
    working_dir: /app
    volumes:
      - .:/workspace
      - ./src:/app/src
      - ./build.gradle:/app/build.gradle
      - ./settings.gradle:/app/settings.gradle
      - ./gradle:/app/gradle
      - ./gradlew:/app/gradlew
      - ./gradlew.bat:/app/gradlew.bat
      - ./gradle.properties:/app/gradle.properties
    ports:
      - 8080:8080
      - 5050:5050
      - 35729:35729
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mydatabase
      - SPRING_DATASOURCE_USERNAME=postgres
      - SPRING_DATASOURCE_PASSWORD=postgres
      - JAVA_OPTS=-Dspring.devtools.restart.enabled=true -Dspring.devtools.livereload.enabled=true

  db:
    image: postgres:13
    container_name: demo-postgres
    environment:
      - POSTGRES_DB=mydatabase
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

Dockerfileの設定

# ベースイメージとしてGradleを使用
FROM gradle:7.4.2-jdk17 AS build

# 作業ディレクトリの設定
WORKDIR /app

# プロジェクトファイルのコピー
COPY . .

# プロジェクトのビルド
RUN gradle bootJar --no-daemon

# JARファイルの存在を確認
RUN ls -l /app/build/libs

# ランタイムイメージとしてOpenJDKを使用
FROM openjdk:17-jdk-slim

# 必要なツールのインストール
RUN apt-get update && apt-get install -y findutils && apt-get clean

# ポート8080を公開
EXPOSE 8080

# 作業ディレクトリの設定
WORKDIR /app

# ビルド済みのJARファイルをコピー
COPY --from=build /app/build/libs/*.jar /app/app.jar

# コピーの確認
RUN ls -l /app

# アプリケーションの実行
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

dockerコマンドでコンテナを立ち上げる

プロジェクトのルートディレクトリーに移動して、以下のコマンドを実行します。

# Dockerイメージをビルドする
docker-compose build

# コンテナを起動する
docker-compose up

http://localhost:8080/

にアクセス

ブラウザに表示されました。

参考リポジトリ

まとめ

DockerとSpring Bootを使用したWebアプリケーションの環境構築手順について説明しました。主なポイントとして、Gradleを使用したビルドの設定、Spring Bootアプリケーションの依存関係管理、Dockerfileやdocker-compose.ymlの設定を通して、簡単に開発環境を構築する方法を紹介しました。

Discussion