はじめに
- 備忘録として残しておこうかと
- 業務でJavaを使用することを想定し、慣れるためにTODOアプリを開発してみました
三層構造(Layered Architecture)
-
コントローラー層(Controller Layer)
- 各操作をルーティングしてレスポンスを返す
- クライアントからのリクエストを受け取り、適切な処理を
Service
に委譲 - 必要に応じてリクエスト/レスポンスの変換を行う
- 最終的なレスポンスを返す
-
サービス層(Service Layer)
- データの作成、削除、更新、読み取りといったクエリに相当するロジックを担当(今回はJPAというAPIを使用)
- ビジネスロジックを担当し、データの作成・更新・削除・取得を管理
- JPA を利用して
Repository
にアクセスし、データを操作 - トランザクション管理を行うことも多い
-
モデル層(Model Layer)
- データの構造を定義する(エンティティ、DTO、VO などを含む)
- JPA の
@Entity
を用いてデータベースのテーブルと対応するクラスを定義 - ビジネスルールを持たせることもある
コントロール層が持つ機能
- サービス層で作成したロジックを呼び出す
- 例えばTODOアプリで入力したタスクを呼び出すルーティング
@GetMapping("/read")
public ResponseEntity<List<Todo>> readTodos() {
List<Todo> todos = todoService.getAllTodos();
return ResponseEntity.ok(todos);
}
- サービス層の
todoService
に関するクラスからリスト構造のgetAllTodos
メソッドを呼び出す
サービス層が持つ機能
- JPAのAPIを呼び出す
- 実際のデータ処理を担当する
モデル層が持つ機能
package com.example.todo_backend.model;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table(name = "todos")
@Getter
@Setter
public class Todo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private boolean completed;
}
- データ構造を定義する
- アノテーションでメタ情報を付与させる
- 例えば、
@Id
の場合では、主キーを指定
- 例えば、
- privateをつける意図として、外部から直接アクセスできないようにするため
- カプセル化するため
- 内部処理へ依存させることでエラーを特定しやすく
- カプセル化するため
工夫点や学んだこと
リスト構造について
- なんとなく使用していたが、調べてみるとリスト構造というのは柔軟性のあるデータ構造であることがわかった
-
ArrayList
は サイズを動的に変更できる(TS のArray<T>
と異なる) -
LinkedList
のような異なる実装もあるみたいでとても奥深い...
-
- TSをメインに開発していた人間からは想像できないような構造で驚いた
ゲッターセッターを使用
- Nullや空文字を防ぐバリデーションの役割がある
- 直接アクセスでなく、ゲッターセッターを通してなのでカプセル化を守れる
アノテーションすげえ...
さいごに
- 今回のTODOアプリ開発を通じて、SpringBootの基本的なアーキテクチャやJPAを使ったデータ操作について学ぶことができた。今後は以下の点を改善・発展させたい
-
バリデーションの強化
- セッターを使ったチェックに加えて、
@Valid
を使ったバリデーションを導入したい。
- セッターを使ったチェックに加えて、
-
フロントエンドとの連携を強化
- CORS の設定を環境ごとに変えられるようにして、本番環境でも適用できる形にする。
- JWTを使った認証機能
- その際は、DB設計を見直さねば
- この備忘録を通じて、自分の学びを整理することができました。引き続き開発しながら学ぶようなスタイルでWeb開発の知見を深めたいな~と思います!