[DevOps]スプリングサーバーのエンドツーエンド配備-アーキテクチャ設計、エンティティ作成
本番前に言うこと
この記事では、サーバアプリケーションについて正式に説明します.とても簡単で、何かあったら何でも書いて、ゆっくりしましょう.
正式にプロジェクトの設計を始めましょう。
以下に示すように、プロジェクトフォルダに複数のパッケージを作成します.
![](https://s1.md5.ltd/image/3f63e9f7bb36593e7cb1dd9a7c5892a5.png)
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;
}
上記のクラスを大まかに説明します.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と書きましょうエンディングを書きましょうか?
以前使用した画像をインポートします.
![](https://s1.md5.ltd/image/fe70dc7512bd491a82bd7af7fa690473.png)
上図を再度表示すると、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;
}
それぞれの言い方を説明します.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メソッドだけを使いたいのですが...内部にクエリーメソッドが作成されていません.上記の手順にうまく従うと、プロジェクトは下図のように構成されます.
![](https://s1.md5.ltd/image/363cc4aa4980360cafeba19eb11c03c7.png)
この記事で作成したクラスもありますが...気にしないで!
これまで、プロジェクトのアーキテクチャ構成を完了し、EntityとRepositoryを完了しました.次の記事では、コントローラ、サービス、dtoについて説明します.
次のポスターで会おう!
Reference
この問題について([DevOps]スプリングサーバーのエンドツーエンド配備-アーキテクチャ設計、エンティティ作成), 我々は、より多くの情報をここで見つけました https://velog.io/@18k7102dy/devops-mono-3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol