[SpringBoot&JPA]Web階層開発


[1]ホームページとレイアウト


マスタコントローラの登録

スタートバンド&jumbortron-狭いcssを適用した後


ガイドバー-Compiled CSSとJSからファイルをダウンロードし、css、jsをコピーして静的に貼り付けます.
css上のjumbortron-狭いcssファイルを作成し、講師がアップロードしたコードを貼り付けます.

[2]会員登録



会員に加入する


後にホームページに戻って会員は正常に保存して、 DBも完全に保存します

メンバー名が入力されていない場合(エラー)



[3]会員リストの表示


クエリーされた商品をSpring MVCから提供されたモデルオブジェクトに保存し、ビューに渡す
実行するビュー名を返します
📌 タイムマシンで?を使用すると、nullは無視されます.

📌 フォーム・オブジェクトとエンティティの直接使用


フォーム・オブジェクトを使用せずに、登録および変更画面でエンティティ(メンバー)を直接使用できます.
しかしながら、スクリーン要件が複雑になると、シンボル内のスクリーンを処理する機能がますます多くなるため、シンボルはますますスクリーンに従属し、スクリーン機能によって乱雑になったシンボルは最終的にメンテナンスが困難になる.
実際の操作では、エンティティにはコアビジネスロジックしか持たず、スクリーンロジックも持たない.
画面またはAPIに適したフォームオブジェクトまたはDTOを使用します.このようにしてこそ、スクリーンまたはAPI要求をこれらに処理し、できるだけシンボルの純粋性を維持することができる.

加入した会員が会員リストでの活躍を確認できます.

[4]商品登録


商品登録表に商品を登録すると、 DBに保存されていることが確認できます.
商品登録表にデータを入力し、submitボタンを押してPOST方式で/items/newを要求する.
商品保存完了後、直接カタログ画面redirect:/items

[5]カタログ


このように商品を登録してカタログを確認すると、がよく収められていることが確認できます.

[6]商品の修正


商品登録後、カタログのデータは完全に保存され、商品修正確認を商品修正確認修正に変更する.が正常に動作していることを確認

ショートカットキー

option + option + 위아래 화살표:multi-cursor多重選択

商品修正フォームに移動


修正ボタンをクリックして、GET方式で/items/{itemId}/edit urlを要求します.
その結果、updateItemForm()メソッドが実行され、このメソッドは、itemService.findOne(itemId)を呼び出して変更する商品を照会する.
クエリ後、結果がモデルオブジェクトに表示され、ビューitems/updateItemFormに表示されます.

商品を修正する


商品修正フォームで情報を修正し、提出ボタンをクリックし、POST方式で/items/{itemId}/edit urlを要求し、updateItem()の方法を実行する.
このとき、コントローラパラメータに渡されたitemエンティティインスタンスは現在、準永続状態にあります.したがって、永続的なコンテキストではサポートされず、データを変更しても変更検出機能は実行されません.

(七)けちん坊変更検出との合併(merge)

mergeは実際の仕事ではあまり使われていませんが、重要な内容なので完璧です!理解する

準零速図元とは何ですか。


永続性コンテキストとは、管理されなくなったエンティティを指します.
この例では、itemService.saveItem(book)で修正したBookオブジェクトを試します.オブジェクトはデータベースに1回格納され、識別子が存在します.このように任意に作成されたエンティティにも既存の識別子がある場合、これを準ゼロ速エンティティと見なすことができる.

この準零速図元を修正する2つの方法は?

  • 準零速シンボルですが、変更検出機能
  • を使用する方法
  • 併用方法
  • 検出機能の変更(推奨)

    // ItemService.java
        /**
         * 변경 감지 기능 사용 (이게 merge보다 나은 방법)
         */
        @Transactional
        public void updateItem(Long itemId, String name, int price, int stockQuantity) {
            Item findItem = itemRepository.findOne(itemId);
            findItem.setName(name);
            findItem.setPrice(price);
            findItem.setStockQuantity(stockQuantity);
        }
    永続性コンテキストでエンティティを再問合せし、データのメソッドを変更します.
    トランザクション内でエンティティを再問合せした後、変更する値を選択→トランザクションはトランザクションコミットポイントのリフレッシュ()をトリガーし、変更検出(Dirty Checking)を有効にし、データベースでUPDATE SQLを実行します.

    マージ

    @Transactional
    void update(Item itemParam) {
    	Item mergeItem = em.merge(item);
    }
  • merge()
  • を実行
  • パラメータに渡された準永続エンティティの識別子値(id)を使用して、プライマリキャッシュ(永続コンテキスト)でエンティティを問合せます.
    2-1. プライマリ・キャッシュにエンティティがない場合は、データベースからエンティティを問合せ、プライマリ・キャッシュ
  • に保存します.
  • クエリの永続エンティティのメンバーエンティティ値を入力します.
    (メンバーエンティティのすべての値がmergeMemberにプッシュされます.したがって、mergeMember名が「メンバー1」の場合、「メンバー名」に変更されます.)
  • 永続状態を返すmergeMember
  • つまり。


    準ゼロ速エンティティの識別子値を使用してゼロ速エンティティをクエリーする
    すべてのゼロスピードシンボル値を準ゼロスピードシンボル値に置き換えます(マージ)
    АААААААААААААААА

    注意!


    変更検出機能を使用すると、必要な属性のみを選択して変更できますが、すべての属性が変更されるため、マージ時に値がない場合はnullに更新されるリスクがあります.
    (mergeはオプションの概念ではありません)

    ちなみに一言。


    実際の作業では、通常、更新機能は非常に限られています.ただし、集計ではすべてのフィールドが変更され、データがない場合はNullに更新されます.
    連結を使用してこの問題を解決するには、「フォームの変更」画面のすべてのデータを常に保持する必要があります.
    実際の操作では、通常は変更可能なデータのみが露出されるため、マージの使用はかえって面倒になります.

    したがって、エンティティを変更する場合は、常に変更検出を使用してください。


    Mergeは使用しないでください.
  • コントローラに不自然なエンティティを作成しないでください.
  • トランザクションのサービス層には、識別子(id)と変更するデータが明確に伝達される.(パラメータまたはDTO)
  • トランザクションを持つサービス・レベルで永続的なエンティティを表示し、エンティティのデータを直接変更します.
  • トランザクション交点変更検出が実行されました.
  • [8]注文商品



    オーダーフォームに移動:


    メイン画面で注文商品を選択すると、GET方式で/orderが呼び出される.
    Order ControllerのcreateForm()メソッドを呼び出し、注文する顧客情報と商品情報を注文画面に表示するので、モデルオブジェクトに入れてビューに渡します.

    注文する


    注文する会員と商品を選択し、提出ボタンをクリックすると、/order urlがPOSTで呼び出され、コントローラのorder()メソッドが実行されます.
    このメソッドは、顧客識別子、商品識別子、および数量情報を受信し、受注サービスに受注を要求します.
    注文が完了すると、商品注文明細のある/orders urlに直接移動します.

    [9]受注リストの取得、キャンセル


    会員と商品を登録してを注文すれば、の注文リストに確認できます.をキャンセルすると、正常にCANCELに動作していることを確認します.