「AWS無料相談会」をオンラインで開催中

Java11+Spring Boot+Dockerで作るWebアプリケーションその2

本記事は前回私が掲載した記事Java11+Spring Boot+Dockerで作るWebアプリケーションの続きとなります。

前回はWebアプリケーションの雛形を作成してDockerでMySQLコンテナを立ち上げるところまでを構築しましたので、今回はWebアプリケーションからMySQLに接続して取得したデータを画面に表示するところまでを構築したいと思います。

バックエンド側とフロントエンド側のディレクトリ構造およびファイル構成は以下のようになります。

└── src
    └──main
       ├── java
       │   └── com
       │       └── example
       │           └── demo
       │               ├── DemoApplication.java
       │               ├── domain
       │               │   └── Customer.java
       │               ├── repository
       │               │   └── CustomerRepository.java
       │               ├── service
       │               │   └── CustomerService.java
       │               └── web
       │                   └── CustomerController.java
       └── resources
           ├── application.yml
           ├── static
           └── templates
               └── customer
                   └── list.html

アプリケーション部分を作成

CustomerController.java

@Controller
@RequestMapping("customer")
public class CustomerController {
    @Autowired
    CustomerService customerService;

    @GetMapping(path = "list")
    String list(Model model) {
        List<Customer> customers = customerService.findAll();
        model.addAttribute("customers", customers);
        return "customer/list";
    }
}

Customer.java

@Data
@Entity
@Table(name = "customer")
public class Customer {
    @Id
    @GeneratedValue
    private Integer id;
    private String firstName;
    private String lastName;
}

CustomerService.java

@Service
@Transactional
public class CustomerService {
    @Autowired
    CustomerRepository customerRepository;

    public List<Customer> findAll() {
        return customerRepository.findAll();
    }
}

CustomerRepository.java

public interface CustomerRepository extends JpaRepository<Customer, Integer> {
}

list.html

<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Customers</title>
</head>
<body>
<table class="table">
    <thead class="thead-dark">
    <tr>
        <th scope="col">ID</th>
        <th scope="col">FirstName</th>
        <th scope="col">LastName</th>
    </tr>
    </thead>
    <tbody>
    <tr th:each="customer : ${customers}">
        <td th:text="${customer.id}">id</td>
        <td th:text="${customer.firstName}">firstName</td>
        <td th:text="${customer.lastName}">lastName</td>
    </tr>
    </tbody>
</table>
</body>
</html>

application.yml

spring:
  profiles:
    active: localhost
---
spring:
  profiles: localhost
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/demo_db
    username: user
    password: password
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    show-sql: true
    hibernate:
      ddl-auto: update
  data:
    web:
      base-path: /customer
---
spring:
  profiles: docker
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://dbserver/demo_db
    username: user
    password: password
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    show-sql: true
    hibernate:
      ddl-auto: update
  data:
    web:
      base-path: /customer

前回アプリケーションのルート配下に作成したdocker-compose.ymlに以下のようにappの設定を追加します。

docker-compose.yml

version: '2'
services:
  dbserver:
    build: ./docker/mysql
    image: demo-db:0.0.1
    restart: always
    environment:
      MYSQL_DATABASE: demo_db
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: rootpassword
    ports:
    - "3314:3306"
    volumes:
    - ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d
    - ./docker/mysql/conf.d:/etc/mysql/conf.d
    - ./log/mysql:/var/log/mysql

  app:
    build: .
    image: demo-app/boot:0.0.1
    depends_on:
    - dbserver
    ports:
    - "8080:8080"
    volumes:
    - .:/app
    environment:
      JAR_TARGET: demo-0.0.1-SNAPSHOT.jar

volumes:
  mysql-db:
    driver: local

最後にアプリケーションのルート配下にDockerfileを作成して完成です。

Dockerfile

FROM ubuntu:18.10
RUN apt-get update
RUN apt-get -y install openjdk-11-jdk
ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64
VOLUME /tmp
RUN mkdir /app
WORKDIR /app
# jar target
ENV JAR_TARGET "demo-0.0.1-SNAPSHOT.jar"
# set entrypoint to execute spring boot application
ENTRYPOINT ["sh","-c","java -jar -Dspring.profiles.active=docker build/libs/${JAR_TARGET}"]

ここまで出来たら以下のコマンドでビルドして起動します。

docker-compose build
docker-compose up

正常にMySQLとアプリケーションが起動したことを確認後、以下のURLにアクセスするとDBに登録されたcustomerデータが画面に表示されるかと思います。
http://localhost:8080/customer/list

以上、非常にシンプルな構成ですが、Java11+Spring Boot+Dockerで構成されたアプリケーション構築についてのまとめでした。

なお、以下のぺージでMMMのDockerコンテナへの取り組みをご紹介しています。ぜひ合わせてご覧ください。

Dockerコンテナ基盤(AWS Fargate/Amazon ECS)