0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Javaの三層構造について

Posted at

はじめに

  • 備忘録として残しておこうかと
  • 業務でJavaを使用することを想定し、慣れるためにTODOアプリを開発してみました

三層構造(Layered Architecture)

  1. コントローラー層(Controller Layer)

    • 各操作をルーティングしてレスポンスを返す
    • クライアントからのリクエストを受け取り、適切な処理を Service に委譲
    • 必要に応じてリクエスト/レスポンスの変換を行う
    • 最終的なレスポンスを返す
  2. サービス層(Service Layer)

    • データの作成、削除、更新、読み取りといったクエリに相当するロジックを担当(今回はJPAというAPIを使用)
    • ビジネスロジックを担当し、データの作成・更新・削除・取得を管理
    • JPA を利用して Repository にアクセスし、データを操作
    • トランザクション管理を行うことも多い
  3. モデル層(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や空文字を防ぐバリデーションの役割がある
  • 直接アクセスでなく、ゲッターセッターを通してなのでカプセル化を守れる

アノテーションすげえ...

  • @とつけるだけで色々な情報を付与できるのはとても便利
  • @EntityでDBと紐づけできたり、@Idで主キーを設定できたりととても便利

さいごに

  • 今回のTODOアプリ開発を通じて、SpringBootの基本的なアーキテクチャやJPAを使ったデータ操作について学ぶことができた。今後は以下の点を改善・発展させたい
  • バリデーションの強化
    • セッターを使ったチェックに加えて、@Valid を使ったバリデーションを導入したい。
  • フロントエンドとの連携を強化
    • CORS の設定を環境ごとに変えられるようにして、本番環境でも適用できる形にする。
    • JWTを使った認証機能
      • その際は、DB設計を見直さねば
  • この備忘録を通じて、自分の学びを整理することができました。引き続き開発しながら学ぶようなスタイルでWeb開発の知見を深めたいな~と思います!
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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?