[6]. MailMilkDashBoardループ参照を生成するDTOを再変換
5981 ワード
前の記事のEntity<>DTO変換では、エンティティ自体をDTOに変換して返します.
参照用に作成されたリストに循環参照が表示されます.
問題は、エンティティ自体のリストを返すことです.お客様に情報を持ち込むべきではありません.電子メールだけが必要です.だからDTOをやり直してそれに合わせました
まず、お客様が牛乳リストをロードするとき、お客様と配送情報は必要ありません.
そのお客さんが飲む牛乳のリストだけ知りたいからです.
1番でfindByEmail()の戻り値はCustomerEntityで、CustomerDTOが受信して再定義します.(findById()の理由は、EメールによるクエリによってCustomerEntityがスキップされるためです.)
2番を見るとMilktoList()関数はMilkクラスに静的に宣言されます.
MilkEntityに移動したリストがMilkとして作成され、返されます.上の静的な部分を見ればいいです.
顧客情報では、牛乳情報は私が欲しい情報だけをロードし、循環参照も解決しました.
このループ参照は遠征新聞配達でも発生し,修正された.
ちなみに、電話番号はむやみに押しています.このプロジェクトで使用されるデータは、電子メール以外に何もありません.
しかし、もう一つの場所があります.牛乳エンティティから牛乳情報をロードすると、循環参照が発生します.
ユーザーの電子メールで牛乳情報を検索する場合...ミルク情報は….
これらは顧客電子メール、配達員電子メール、残りの牛乳情報です.
以前は、エンティティが参照されていたため、エンティティが格納されていたため、すべての場所で使用すると、ループ参照が生成されます.だから私が必要なのはお客様の電子メールです.したがって、顧客のエンティティを参照する以外に、String emailに入力します.getCustomer().getEmail()として
メールが指定されています.私たちがそれを必要としているのは、findAllを通じて牛乳庫からそれをすべて呼ぶからです.
必要を区別するために.お客様がどんな牛乳を食べたいかを見たいだけなら、customer reportageでfindByEmail()を見ることができます.
参照用に作成されたリストに循環参照が表示されます.
問題は、エンティティ自体のリストを返すことです.お客様に情報を持ち込むべきではありません.電子メールだけが必要です.だからDTOをやり直してそれに合わせました
まず、お客様が牛乳リストをロードするとき、お客様と配送情報は必要ありません.
そのお客さんが飲む牛乳のリストだけ知りたいからです.
@Getter
@NoArgsConstructor
public class Milk {
@Builder
public Milk(int id, String apartmentName, int apartmentHouseNumber1,
int apartmentHouseNumber2, String milkManufacturer, String milkName,
int milkCount, String weekDate
) {
this.id = id;
this.apartmentName = apartmentName;
this.apartmentHouseNumber1 = apartmentHouseNumber1;
this.apartmentHouseNumber2 = apartmentHouseNumber2;
this.milkManufacturer = milkManufacturer;
this.milkName = milkName;
this.milkCount = milkCount;
this.weekDate = weekDate;
}
private int id;
// 아파트 이름
private String apartmentName;
// 아파트 동 수
private int apartmentHouseNumber1;
// 아파트 호 수
private int apartmentHouseNumber2;
// 우유 대리점 이름
private String milkManufacturer;
// 우유 이름
private String milkName;
// 우유 수량
private int milkCount;
// 먹는 요일
private String weekDate;
static List<Milk> toList(List<MilkEntity> milkEntities){
List<Milk> milks = new ArrayList<>();
milkEntities.forEach(milkEntity -> {
milks.add(new Milk(milkEntity.getId(), milkEntity.getApartmentName(), milkEntity.getApartmentHouseNumber1(),
milkEntity.getApartmentHouseNumber2(), milkEntity.getMilkManufacturer(), milkEntity.getMilkName(),
milkEntity.getMilkCount(), milkEntity.getWeekDate()));
});
return milks;
}
}
@NoArgsConstructor
@Getter
public class CustomerDTO {
public CustomerDTO(CustomerEntity customer) {
this.email = customer.getEmail();
this.password = customer.getPassword();
this.phoneNumber = customer.getPhoneNumber();
this.contractPeriod = customer.getContractPeriod();
this.delinquencyPeriod = customer.getDelinquencyPeriod();
this.joinDate = customer.getJoinDate();
this.withdrawalDate = customer.getWithdrawalDate();
this.note = customer.getNote();
this.milks = Milk.toList(customer.getMilkDTOS());
}
//고객 아이디
private String email;
//비밀번호
private String password;
//핸드폰 번호
private String phoneNumber;
//계약기간
private Date contractPeriod;
//연체기간
private Date delinquencyPeriod;
//가입날짜
private Date joinDate;
//탈퇴날짜
private Date withdrawalDate;
//비고
private String note;
private List<Milk> milks = new ArrayList<>();
}
CustomerDTO findByEmail(String email);
このようにMilkは、リスト内のMilkEntityをロードするためにDTOを記述する. static List<Milk> toList(List<MilkEntity> milkEntities){
List<Milk> milks = new ArrayList<>();
milkEntities.forEach(milkEntity -> {
milks.add(new Milk(milkEntity.getId(), milkEntity.getApartmentName(), milkEntity.getApartmentHouseNumber1(),
milkEntity.getApartmentHouseNumber2(), milkEntity.getMilkManufacturer(), milkEntity.getMilkName(),
milkEntity.getMilkCount(), milkEntity.getWeekDate()));
});
return milks;
}
必要な情報のみが格納されているリストにデータを入れて返します.1. CustomerDTO customerDTO = customerRepository.findByEmail("[email protected]");
2. public CustomerDTO(CustomerEntity customer) {
this.milks = Milk.toList(customer.getMilkDTOS());
}
1番でfindByEmail()の戻り値はCustomerEntityで、CustomerDTOが受信して再定義します.(findById()の理由は、EメールによるクエリによってCustomerEntityがスキップされるためです.)
2番を見るとMilktoList()関数はMilkクラスに静的に宣言されます.
MilkEntityに移動したリストがMilkとして作成され、返されます.上の静的な部分を見ればいいです.
顧客情報では、牛乳情報は私が欲しい情報だけをロードし、循環参照も解決しました.
このループ参照は遠征新聞配達でも発生し,修正された.
ちなみに、電話番号はむやみに押しています.このプロジェクトで使用されるデータは、電子メール以外に何もありません.
しかし、もう一つの場所があります.牛乳エンティティから牛乳情報をロードすると、循環参照が発生します.
ユーザーの電子メールで牛乳情報を検索する場合...ミルク情報は….
これらは顧客電子メール、配達員電子メール、残りの牛乳情報です.
以前は、エンティティが参照されていたため、エンティティが格納されていたため、すべての場所で使用すると、ループ参照が生成されます.だから私が必要なのはお客様の電子メールです.したがって、顧客のエンティティを参照する以外に、String emailに入力します.getCustomer().getEmail()として
メールが指定されています.私たちがそれを必要としているのは、findAllを通じて牛乳庫からそれをすべて呼ぶからです.
必要を区別するために.お客様がどんな牛乳を食べたいかを見たいだけなら、customer reportageでfindByEmail()を見ることができます.
Reference
この問題について([6]. MailMilkDashBoardループ参照を生成するDTOを再変換), 我々は、より多くの情報をここで見つけました https://velog.io/@akar97/6.-MailMilkDashBoard-순환참조-발생다시-DTO-변환하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol