[6]. MailMilkDashBoardループ参照を生成するDTOを再変換


前の記事のEntity<>DTO変換では、エンティティ自体をDTOに変換して返します.
参照用に作成されたリストに循環参照が表示されます.

問題は、エンティティ自体のリストを返すことです.お客様に情報を持ち込むべきではありません.電子メールだけが必要です.だから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()を見ることができます.