[SpringStudy] 1. JPAとは?


JPA?


Java Persistence APIは,Java陣営におけるオブジェクト−リレーショナルマッピング技術の標準として用いられるインタフェースの集合である.
すなわち,実際に実装されたものではなく,実装されたクラスをマッピングするためのフレームワークである.
JPAを実現する代表的なオープンソースコードはHibernateである.

ORM(Object-Relational Mapping)


これは、既知のアプリケーション・クラスとリレーショナル・データベースのテーブルをマッピング(関連付け)することを意味します.
技術的には、アプリケーション内のオブジェクトはRDBテーブルに自動的に永続化されます.1)

メリット


  • データベースはSQL文以外の方法で操作でき、開発者はオブジェクトモデルを使用してビジネスロジックを整理することに専念するしかありません.
    (内部でクエリーを自動的に生成してデータベースを操作しますが、開発者は心配する必要はありません.)

  • Queryの場合、必要な宣言や割り当てなどの追加コードが減少します.
    すなわち,種々のオブジェクトに対してそれぞれコードを記述することができ,コードの可読性を向上させることができる.

  • オブジェクト向けのコードを作成し、生産性を向上させることができます.

  • マッピングされた情報はクラスとして指定されるため、ERDの表示依存性を低減し、メンテナンスと再構築に有利である.
  • 欠点?


    1)プロジェクトの規模が大きく、複雑で、設計が間違っている場合、速度が遅く、一貫性が損なわれる可能性があります.
    2)複雑で重いQueryは、速度を個別に調整する必要があるため、SQL文を記述する必要がある場合があります.

    なぜJPAを使うのですか?


    JPAは重複するCRUD SQL文を扱うことができる.
    JPAは、マッピングされた関係を使用してSQLを作成して実行します.
    開発者は、どのSQLが実行されるかを考慮するだけで、簡単に予測できます.
    また、JPAは、ネイティブSQLという機能も提供しています.
    リレーションシップマッピングが困難な場合やパフォーマンスの問題がある場合は、SQL文を直接作成して使用できます.
    JPAを使用する最大のメリットは、SQLではなくオブジェクト中心で開発できることです.
    そのため、生産性が向上し、メンテナンスも容易になります.
    また、JAVAは親と子の関係も提供しています.
    すなわち継承関係が存在し、DBはこれらのオブジェクトの継承関係をサポートしない
    このような継承関係は、JPAが以下のように解決した.

    上の構造にAlbumクラスが格納されているとします.
    jpa.persist(album);
    そしてJPAは上のコードを次のクエリに変換して実行する.
    INSERT INTO ITEM (ID, NAME, PRICE) VALUES (...);
    INSERT INTO ALBUM (ARTIST) VALUES (...);
    前述したように,クエリ時にもITEMとALBUMテーブルを1つにまとめてインポートする.
    // JAVA 코드
    String albumId = "id1";
    Album album = jpa.find(Album.class , albumId);
    
    // 변환된 쿼리
    SELECT I.*, A.*
    	FROM ITEM I
        JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID;
    

    関連関係


    上記のように、継承関係へのアクセスも提供され、オブジェクト向けに関連関係も提供されます.
    コード別に計算すると、クラスにはフィールド変数として別のクラスタイプがあります.

    上の図は、メンバークラスがチームタイプのチームフィールド変数を持つ形式を示しています.
    class Member{
    	Long id;
        String userName;
        Team team;
    }
    
    class Team{
    	Long id;
        String teamName;
    }
    Springコースで使用されているStudent、Majorクラスでご理解ください.


    Studioクラスは、private Major majorを介してMajorタイプのプライマリフィールド変数を有する.
    ソース:https://dbjh.tistory.com/77