LoginSignup
0
0

More than 1 year has passed since last update.

Spring bootで簡単なWebアプリを作ってみた

Last updated at Posted at 2022-08-16

前提

私個人の手順書を兼ねてメモをします。

作るもの

夫婦間で共有するTodoリストアプリです。
MVPで作っていくので、どんどん機能改善していきたいと思っています。

使用する技術

  • Docker
  • Spring Boot
  • MySQL(Ver8.0)

DBアクセスにはJPA,viewはThymeleafを使用。

ディレクトリ構成

このサイト※1wo
を参考にしました。
案件によってディレクトリ構成が異なるので、いつも迷ってしまう。
Controller, Service, Repository の

root/webapp/src/main
└── java/com/example/todo
│    ├── DemoApplication.java
│    ├── domain
│    │   └── Task.java
│    ├── controller
│    │   └── TaskController.java
│    ├── service
│    │   └── TaskService.java
│    └── repository
│        └── TaskRepository.java
└── resources
     ├── application.yml
     ├── static
     └── templates
         └── index.html

MySQLをDockerで使うための準備

MySQLは、Docker 公式のイメージを用います。バージョンは8.0。
Flywayを使わなくても初期化できるみたいなので、Flywayの使用は一旦やめます。

root
├── webappc
├── build.gradle
├── log
│   └── mysql
│       └── mysqld.log
├── docker
│   └── mysql
│       ├── Dockerfile
│       ├── conf.d
│       │   └── my.cnf
│       └── initdb.d
│           ├── R__insert_tasks_table.sql
│           └── V20220627_1__create_all_table.sql
├── docker-compose.yml

MySQLの文字コードの設定

my.conf
[mysqld]
character-set-server=utf8mb4

[client]
default-character-set=utf8mb4
V20220627_1__create_all_table.sql
CREATE TABLE IF NOT EXISTS tasks (
    id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    description VARCHAR(255) NOT NULL,
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

R__insert_tasks_table.sql
INSERT INTO tasks(id, description) VALUES (1, 'これはサンプルタスクです。') as EXPR
    ON DUPLICATE KEY UPDATE id = EXPR.id;
docker-compose.yml
version: "3.6"
services:
  db:
    container_name: mysql-db # コンテナ名
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root # rootユーザのパスワードを指定
      MYSQL_USER: user # ここで指定したユーザが自動生成される
      MYSQL_PASSWORD: user # MYSQL_USERのパスワード
      MYSQL_DATABASE: todo_app # ここで指定した名前でDBが自動生成される
      TZ: "Asia/Tokyo" # TimeZoneの指定
    command: --default-authentication-plugin=mysql_native_password # mysql_native_password を使用したネイティブ認証。これを指定しないとエラーになる。
    ports:
      - 3306:3306
    volumes:
      - ./docker/mysql/conf.d:/etc/mysql/conf.d # my.confのマッピング
      - ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d DB初期化処理のスクリプト配置場所
      - ./docker/storage:/var/lib/mysql # データ保存場所のマッピング
      - ./log/mysql:/var/log/mysql # ログ保存場所のマッピング 
  app:

苦労した点

  • MySQLのコンテナ起動時の初期化スクリプトが起動しなかった。
    -> docker-compose.ymlに定義するvolumesの定義を変更したら動作するようになった。
変更前
services:
  db:
    volumes:
      - ./docker/storage:/var/lib/mysql # データ保存場所のマッピング
変更後
services:
  db:
    volumes:
      - mysql_db:/var/lib/mysql # データ保存場所のマッピング

volumes:
  mysql_db:
    driver: local

将来的に追加したい機能

  • Andoroidアプリ化して指紋認証ログイン機能
  • Todo削除機能
  • Public Cloudにデプロイ(DBはAzure Cosmos DBのFree Tierを使用したい)
  • FlywayでDBテーブルのバージョン管理
  • Gitでバージョン管理
  • Public Cloudにコンテナをデプロイ。
  • Unit Testコードの充実
  • 設計書の作成(クラス図、ER図、シーケンス図、画面遷移図など)
  • taskテーブルにcreated,updatedを追加する
  • Todo追加機能

参考にしたサイト

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