[DevOps]スプリングサーバーのエンドツーエンド配備-アーキテクチャ設計、エンティティ作成


本番前に言うこと


この記事では、サーバアプリケーションについて正式に説明します.とても簡単で、何かあったら何でも書いて、ゆっくりしましょう.

正式にプロジェクトの設計を始めましょう。


以下に示すように、プロジェクトフォルダに複数のパッケージを作成します.
  • コントローラ:コントローラレイヤのクラスを含むパッケージ.
  • サービス:サービス層のクラスを含むパッケージ.
  • domain:domain Layerのクラスの集合.内部では、他のエンティティとリポジトリパッケージを作成します.
  • system:プロジェクトで使用されるシステムクラスを含むパッケージ.私たちのプロジェクトはconfig、componentなどを使用するつもりはありませんので、dtoとresultパッケージしか追加されません.
  • 次にresultパッケージ内のすべてのクラスを作成します.

    ResultProviderの作成


    ResultProviderの場合は、戻りフォーマットを吐くロールを持つクラスと見なすことができます.ResultProviderを作成する前に、CommonResult、SingleResult、MultipleResultを作成します.
    CommonResult.java
    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    public class CommonResult {
    
        private Boolean success;
    }
    SingleResult.java
    @Getter
    @Setter
    @NoArgsConstructor
    public class SingleResult<T> extends CommonResult {
    
        private T data;
    
    }
    MultipleResult.java
    @Getter
    @Setter
    @NoArgsConstructor
    public class MultipleResult<T> extends CommonResult {
    
        private List<T> data;
    }
    上記のクラスを大まかに説明します.
  • CommonResult:返されるjson共通部分を定義するクラス
  • SingleResult:戻るJSONで送信時に使用するクラス
  • に単一のデータを入れる必要がある.
  • MultipleResult:返されたJSONに複数のデータを送信する必要がある場合に使用するクラス
  • 上のクラスを使用してResultProviderを作成します.
    ResultProvider.java
    @NoArgsConstructor(access = AccessLevel.PRIVATE)
    public class ResultProvider {
    
        // 성공 결과만 반환하는 메소드
        public static CommonResult getSuccessResult() {
            return new CommonResult(true);
        }
    
        // 단일 데이터를 가지는 성공을 반환하는 메소드
        public static <T> SingleResult<T> getSingleResult(T data) {
            SingleResult<T> result = new SingleResult<>();
            result.setData(data);
            result.setSuccess(true);
    
            return result;
        }
    
        // 리스트 형태의 데이터를 가지는 성공을 반환하는 메소드
        public static <T> MultipleResult<T> getMultipleResult(List<T> data) {
            MultipleResult<T> result = new MultipleResult<>();
            result.setData(data);
            result.setSuccess(true);
    
            return result;
        }
    }
    ResultProviderクラスについて説明します.
    まず、ResultProviderクラスの上部に@NoArgConstructor(access=AccessLevel.PRIVATE)があり、ジェネレータのアクセス権をprivateに制限し、ResultProviderクラスのインスタンス化を阻止します.
    次に、静的メソッドを使用して、CommonResult、SingleResult、およびMultipleResultを返すメソッドをそれぞれ作成します.したがって、ResultProviderを使用して、次のフォーマットに従います.
    ⚉SingleResult戻り例
    {
    	"success" : true, 
      	"data" : {
         	"id" : 1, 
          	"name" : "테스트 맛집"
          	"address" : "서울시 강남구 강남역 10번 출구"
        }
    }
    次はEntityと書きましょう

    エンディングを書きましょうか?


    以前使用した画像をインポートします.

    上図を再度表示すると、shopとmenuの関連付けは1:Nです.だから私たちが書くのは関連関係も一緒に書くことです
    まずはShop classを確認
    Shop.java
    @Getter
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    @Accessors(chain = true)
    @Entity
    public class Shop {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        private String name;
    
        private String address;
    
        // Shop : Menu = 1 ; N
        @OneToMany(fetch = FetchType.LAZY, mappedBy = "shop", cascade = CascadeType.ALL)
        @JsonManagedReference
        private List<Menu> menuList;
    }
    それぞれの言い方を説明します.
  • @Builder:ビルダーモードを使用するために追加された説明.
  • @Accessors:Chainモードの追加説明.updateメソッドを作成するときに便利なメソッドです.もちろん、このプロジェクトでは使用しませんが、コードテンプレートとして保存されているので、
  • は気にしません.
  • @Entity:クラスがEntityクラスであることを示す構文.
  • @Id:メンバー変数がEntityのPK(プライマリ・キー)であることを示すアシスタント.
  • @GenerateValue:PKを自動的に生成するためのヒント.筆者がPKを使用したのは,表に自動増分属性が付与されているためである.筆者は本プロジェクトでMySQLデータベースを使用しているので、ポリシーをIdentityに調整します.
  • 「≪関連関係マッピング|Relationship Mappings|emdw≫」セクションでは、@OneToManyに遅延ロード属性があることも確認できます.もちろん@OneToManyのデフォルトのロードポリシーは遅延ロードです...明確な目的のために書きました.
    JPAの関連付けには、遅延ロードとインスタントロードが含まれます.インスタント・ロードには、データの高速ロードの利点がありますが、ロードに関連するすべてのエンティティと、これらのすべてのエンティティがすぐにクエリーされるため、クエリーの実行が正常ではありません.
    (通常JPAと呼ばれるN+1題)
    したがって、JPAで関連付けを使用する場合は、無条件にロードを遅延させることをお勧めします.
    また、cascadeプロパティが付与されていることもわかります.cascadeプロパティを付与することで、データベースに発生する可能性のある欠陥を回避できます.
    次に、@JosonBackReferenceと@JosonManagedReferenceの宣言について説明します.上記の2つのエンティティは、循環参照を回避するためにJsonを作成するときに、関連関係でどのエンティティがホストとして機能するかを示す役割を果たします.通常、1:Nの関係では、Nは関連関係の主人、1は関連関係の奴隷(?)そう思えばいいこの表現は正しいですか.
    Menuclassを見てみましょう
    Menu.java
    @Getter
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    @Accessors(chain = true)
    @Entity
    public class Menu {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        private String name;
    
        // Menu : Shop = N : 1
        @ManyToOne
        @JsonBackReference
        private Shop shop;
    }
    では、レポートを作成します.

    レポートを作成しましょう。簡単ですから、私と一緒に来てください。


    コードのみを提供します.簡単だから
    MenuRepository.java
    @Repository
    public interface MenuRepository extends JpaRepository<Menu, Long> {
    }
    ShopRepository.java
    @Repository
    public interface ShopRepository extends JpaRepository<Shop, Long> {
    }
    どうせ私は内蔵のRepositoryメソッドだけを使いたいのですが...内部にクエリーメソッドが作成されていません.
    上記の手順にうまく従うと、プロジェクトは下図のように構成されます.

    この記事で作成したクラスもありますが...気にしないで!
    これまで、プロジェクトのアーキテクチャ構成を完了し、EntityとRepositoryを完了しました.次の記事では、コントローラ、サービス、dtoについて説明します.
    次のポスターで会おう!