Open47

ToDoアプリ作成(SpringBoot + React)

t_minet_mine

とりあえず、SpringBootでAPI作るかな。
Java久しぶりなので楽しみ。

t_minet_mine

OpenJDK系(Eclipse Temurin、Amazon Correttoなど)は無償セキュリティアップデートの提供期間がOracle JDKより長いというメリットがあるらしい。

https://qiita.com/arubaito/items/1fee363154b34663deea

正しい情報を調べようとすると、それぞれの公式サイトでサポート期間を調べて表にして、引用元のリンクを付ける必要がある。そこまでの情報源は見つからず。。

以前使ってた記憶あるし、Amazon Correttoが無難そうかなあ。

t_minet_mine

Amazon Corretto 21をインストールした

t_minet_mine

Extension Pack for Java Auto Configをインストールした。

下記SpringBoot公式サイトにExtension Pack for Java Auto Configをインストールしてと書かれてるので。
https://spring.pleiades.io/guides/gs/guides-with-vscode

この拡張機能が何をしてくれるのかは不明。。

・Extension Pack for Java
・Spring Boot Extension Pack
あたりの拡張が含まれてるらしい。

t_minet_mine

Spring InitializrでGradle対応プロジェクトをダウンロードすれば、そのプロジェクトにGradle Wrapperが入ってるからGradleのインストールは不要らしい。

t_minet_mine

Spring Initializrでプロジェクト作成した

t_minet_mine

Spring Initializrで作ったプロジェクトをvscodeで開いた。

vscodeのターミナルで下記を実行した

gradlew bootRun

http://localhost:8080にアクセスしても「このサイトにアクセスできません」となる

t_minet_mine

http://localhost:8080にアクセスできないのは依存関係にSpring Webを含めてないのが原因っぽい。

t_minet_mine

上記の設定でプロジェクトを作り直したら、依存関係にspring-boot-starter-webがあるのを確認できた。

t_minet_mine

下記コマンドでアプリ実行して、無事にブラウザに画面が表示された。

gradlew bootRun

t_minet_mine

application.propertiesに下記を設定したらアプリ起動できた。
DB接続に成功したっぽい。
(starter-data-jpaを入れてると、アプリ起動時にDB接続しに行って接続に失敗するとアプリが終了するので。)

spring.application.name=springboot-todolist

## connect to database
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/todo_app
spring.datasource.username=postgres
spring.datasource.password=postgres

t_minet_mine

VSCodeでjavaのimport文を追加するショートカットは「Alt + Shift + O」

t_minet_mine

動作確認用に
・EmployeeEntity.javaを追加
・application.propertiesにspring.jpa.hibernate.ddl-auto=updateを追加
アプリ起動でテーブルができることを確認した。

spring.jpa.hibernate.ddl-auto=updateは、アプリケーション起動時に、Entityに対応するテーブルがなければ作成するという設定。

t_minet_mine

Entity、Repository、Service、Contollerを追加して、
とりあえずAPIできた。

t_minet_mine

することメモ
・API設計(とりあえずメモ程度にする予定)
・API作成
・テスト作成

その他
・開発環境(Java、PostgreSQL)のDocker化
・Reactで画面作成
・Git管理
・少しずつ開発環境をブラッシュアップしていきたい

t_minet_mine

とりあえず登録、更新、削除、検索のAPIを作成する。

テーブル設計

テーブル名:todos
カラム:
・id
・desctiption
・created_at
・updated_at

t_minet_mine

build.gradleに下記を追加
implementation "org.flywaydb:flyway-core:11.13.2"
implementation 'org.flywaydb:flyway-database-postgresql:11.13.2'

application.propertisに下記を追加
spring.flyway.enabled=true
spring.flyway.baseline-on-migrate=true

t_minet_mine

src/main/resources/db/migration/に V1__todos.sql を追加。

CREATE TABLE todos (
    id SERIAL PRIMARY KEY,
    description TEXT NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
t_minet_mine

SpringBootアプリ起動でtodosテーブルが作成された。

t_minet_mine

次は下記を作成する。

・TodoEntity.java
・TodoRepository.java
・TodoService.java
・TodoController.java

t_minet_mine

動作確認用にPostmanを使うかな?
あと、Git管理したい。

t_minet_mine

Postmanで動作確認できた。

t_minet_mine

することメモ
・不要ファイル削除
・git管理
・テストを書く

t_minet_mine

Spring Bootでテストを書くとき、主に2つのアプローチがある。

統合テスト:
 アプリ全体を起動して、HTTPリクエストをシミュレート
 @SpringBootTest + @AutoConfigureMockMvc

単体テスト:
 コントローラやサービス単体をテスト(他層をモック化)
 @WebMvcTest or @DataJpaTest

テストの方針

spring.datasource.url に H2(メモリDB) を使って統合テストを実施したい
t_minet_mine

@SpringBootTest・・・SpringBootのBean(Service, Controllerなど)がすべて利用可能にする
@AutoConfigureMockMvc・・・疑似的なhttpリクエストを送信できるMockMvcを利用可能にする

t_minet_mine

Bean = Springがアプリ起動時に作って管理してくれるオブジェクト(主にService, Controller, Repositoryなど)

t_minet_mine

メモ
・カバレッジレポート
・Swagger
・統合テストだけでなく単体テストもしたい
・テストが足りているかチェックしたい