0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaでLP管理システムを作成してみる 環境構築修正編

Posted at

こんにちは!

以前、Java + Docker + MariaDB を使った環境構築を行いました。
当時は Java 標準の HttpServer を使い、最低限「動く」Webアプリを構築しましたが、
実際に触ってみると Webアプリとしての拡張性・保守性に大きな制約 があることに気づきました。

▼ 前回の記事

具体的には、

  • ルーティングや設定をすべて自前実装する必要がある
  • DI・例外処理・設定管理が弱い
  • 機能追加のたびに修正箇所が増えやすい

といった点がネックでした。

本記事では、その構成を Spring Boot を用いた実用的な Web アプリ構成 に置き換え、Docker 上で動作する Java Web 環境 を構築します。

使用技術

  • Java 17
  • Spring Boot 3.2
  • Docker / Docker Compose
  • MariaDB
  • Maven
  • Spring Data JPA
  • Thymeleaf(画面用)

Dockerfile

FROM eclipse-temurin:17-jdk-alpine

WORKDIR /app

RUN apk add --no-cache maven

COPY pom.xml .
RUN mvn dependency:go-offline

COPY src ./src

RUN mvn clean package -DskipTests

EXPOSE 8080

CMD ["java", "-jar", "target/product-management-0.0.1-SNAPSHOT.jar"]

ポイント解説

  • OpenJDK 17(Alpine)

    • 軽量で起動が早いらしい
  • Maven をコンテナ内で使用

    • ローカル環境に Maven をインストールせずにビルド可能
  • dependency:go-offline

    • 依存関係を先にダウンロードし、Dockerビルドを高速化
  • Spring Boot の fat jar を実行

    • java -jar でシンプルに起動できる

docker-compose.yml

version: '3.8'

services:
  mariadb:
    image: mariadb:10.8
    container_name: java_lp_mariadb
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: productdb
      MYSQL_USER: appuser
      MYSQL_PASSWORD: apppassword
    ports:
      - "3308:3306"
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
      - mariadb_data:/var/lib/mysql
    networks:
      - app-network

  app:
    build: .
    container_name: java_lp_app
    ports:
      - "8081:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mariadb://mariadb:3306/productdb
      SPRING_DATASOURCE_USERNAME: appuser
      SPRING_DATASOURCE_PASSWORD: apppassword
      SPRING_JPA_HIBERNATE_DDL_AUTO: update
    depends_on:
      - mariadb
    networks:
      - app-network

volumes:
  mariadb_data:

networks:
  app-network:
    driver: bridge

MariaDB コンテナ

  • DB名・ユーザー・パスワードを環境変数で定義
  • init.sql を使って初期データやテーブル作成が可能
    IF NOT EXISTS を使った CREATE TABLE を想定)

Spring Boot アプリコンテナ

  • DB接続情報を 環境変数で注入
  • depends_on により DB コンテナ起動後にアプリを起動
  • 8081 → 8080 でローカルからアクセス可能

pom.xml

<dependencies>
    <!-- Webアプリ用 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- JPA / ORM -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- テンプレートエンジン -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <!-- MariaDB ドライバ -->
    <dependency>
        <groupId>org.mariadb.jdbc</groupId>
        <artifactId>mariadb-java-client</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- バリデーション -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>

ポイント

  • Spring Boot Starter を中心に構成
  • JDBC ドライバは runtime スコープ
  • CRUD・画面作成・入力チェックをそのまま拡張可能

起動クラス

package com.example.productmanagement;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ProductManagementApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProductManagementApplication.class, args);
    }

}

このクラスが Spring Boot アプリのエントリーポイント となり、
java -jar 実行時にアプリ全体が起動します。

いったんこちらの環境構築を基にいろいろと作成していきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?