Spring Boot ＋ Docker　環境構築

# Spring Boot + Docker 環境構築

この記事ではSpring Boot と Docker を使って
バックエンド環境を構築する手順を紹介します。

私自身あまり記事を書いた経験もなく、初めての環境構築ということもあり
拙い内容だとは思いますが、自分用の忘備録として記事にしてみました。

## 今回の内容
- Spring環境のコンテナ化
- デモAPIへのアクセス
- セキュリティソフトによるエラーへの対応

## 🗂 作業手順のまとめ

### ✅ 1. Spring Boot プロジェクトの作成

まずは、Spring Boot プロジェクトを作成します。`Spring Initializr` または IDE（IntelliJ IDEA, Eclipse など）を使用してプロジェクトを作成します。

#### 使用バージョン:
- **Java 17**
- **Spring Boot 3.x**

#### 必要な依存関係:
- **Spring Web**
- **Spring Data JPA**
- **PostgreSQL Driver**
- **Lombok**

必要に応じて、他の依存関係を追加します。

---

### ✅ 2. PostgreSQL 用の設定ファイル作成（`application.properties`）

次に、Spring Boot で使用する PostgreSQL の設定を `application.properties` ファイルに記述します。

```properties:application.properties
spring.application.name=backend

# DB接続設定
spring.datasource.url=jdbc:postgresql://db:5432/db
spring.datasource.username=myuser
spring.datasource.password=mypassword

# JPA設定
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

```

> `db` は Docker Compose に定義するサービス名と一致させます。

---

### ✅ 3. Dockerfile の作成（`backend/Dockerfile`）

Spring Boot アプリケーションを Docker コンテナ内で実行するための `Dockerfile` を作成します。

```docker:DockerFile
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY build/libs/*.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
```

---

### ✅ 4. docker-compose.yml の作成

次に、`docker-compose.yml` ファイルを作成します。このファイルで、PostgreSQL と Spring Boot のコンテナを連携させます。

```yaml:docker-compose.yml
version: '3.8'

services:
  db:
    image: postgres:15
    container_name: postgres_container
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: db
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data

  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    container_name: spring_backend
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/mydatabase
      SPRING_DATASOURCE_USERNAME: myuser
      SPRING_DATASOURCE_PASSWORD: mypassword

volumes:
  pgdata:
```

---

### ✅ 5. ビルド時の注意点（JAR生成）

Spring Boot アプリケーションは、コンテナ化の前に `.jar` ファイルを生成する必要があります。以下のコマンドを実行して JAR ファイルを作成します（テストをスキップ）。

```bash
./gradlew clean build -x test
```

---

### ✅ 6. Docker 起動コマンド

最後にDocker Compose を使ってコンテナを起動します。バックグラウンドで実行するには `-d` オプションを追加します。

```bash
docker-compose up --build -d
```

これで、Spring Boot アプリケーションは `localhost:8080` でアクセス可能になります。

---
## 🎯 DemoAPI に対して Fetch を実行

`ApiDog` を使って、`controller`で作成したエンドポイントに対してアクセスしメッセージを受け取ります。

```java:GreetingController
package com.example.backend.controller;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class GreetingController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello World from Spring Boot!";
    }
}
```
## ApiDogで作成したAPIへアクセス
以下のようにメッセージを受け取ることができたら成功です！

![スクリーンショット 2025-04-08 033753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619847/eba4036a-1fbd-4357-96fb-439dbe620f63.png)

## 🧯 環境構築中のトラブルと対処法

| 問題 | 対処方法 |
| --- | --- |
| JARが見つからず Docker ビルドに失敗 | `./gradlew clean build` を実行し、`build/libs` 配下に JAR が生成されているか確認 |
| Gradle テストでエラー | DB接続が原因の場合が多いため、DBの起動と設定値を確認。`-x test` で一時スキップ可能 |
| アンチウイルス（McAfee）によるアクセス拒否 | リアルタイムスキャンを一時的に停止すると解消する場合あり |

## 🧨 アンチウイルスソフトによるエラー

Gradle ビルド中に以下のエラーが発生しました：

```scss
Multiple build operations failed.
Could not move temporary workspace (...\.gradle\caches\...) to immutable location (...\.gradle\caches\...)
```

### 🔍 主なメッセージ内容

- `Could not move temporary workspace`
- `immutable location`
- `.gradle\caches\...\transforms\...` の操作に失敗

これにより、ビルドが複数回失敗し、正常にプロジェクトを起動できなくなりました。

---

## 🎯 原因

Windows の `.gradle` フォルダに対して、**McAfee（マカフィー）のリアルタイムスキャン機能**がアクセスをブロックしていました。この影響で、`.gradle\caches\transforms\...` 以下のファイルやディレクトリの「読み取り専用」属性が解除できず、Gradle が一時ファイルを移動・書き換えできませんでした。

---

## 🛠 対処方法

### ✅ 1. McAfee のリアルタイムスキャンを一時停止

1. タスクトレイのマカフィーアイコンを右クリック
2. 「リアルタイムスキャンの無効化」または「ウイルスとスパイウェア対策」→「リアルタイムスキャンの管理」
3. 15分～30分程度、無効化を設定

> 📌 無効化は一時的に行い、作業後は再度有効化することを推奨。
　※この対処方法は自己責任で行ってください。

### ✅ 2. アンチウイルスソフトの除外設定を利用する

アンチウイルスソフトにはスキャン除外フォルダを設定できるものもあるため
利用中のアンチウイルスソフトの設定を確認する。

> 📌 一部のアンチウイルスソフトはファイルのみしか指定できない。
　対処法をご存じの方がいましたら教えてください...。
---

## 最後に
お疲れさまでした！拙い内容だったとは思いますが、ここまで閲覧していただきありがとうございます。Spring＋Dockerの環境構築が終了しました！

これでとりあえずはAPIへのアクセスまでおこなえる状態にはなったのですが
使ってみていくつか気づいたことがあります。
-  Javaファイルを変更するたびに`./gradlew build`をしないといけない
-  ログがものすごく見にくい etc...

といった感じでバックエンド環境として動くものの
この環境でシステム開発をしたいかと言われると・・・って感じです。

なので次回の記事ではこの辺りの問題を解決し、より開発しやすいバックエンド環境を
目指して修正をおこなっていこうと思います！

## 使用したツールなど
https://apidog.com/jp/

https://start.spring.io/