iT邦幫忙

2024 iThome 鐵人賽

DAY 11
1
佛心分享-SideProject30

從卡關到通關的Spring Boot 腦內風暴系列 第 11

沒有要給你知道那麼多—DTO 設計應用

  • 分享至 

  • xImage
  •  

在後端開發時,會發現DTO非常好用,特別是在資料傳輸時,能夠安全交換資料,避免不必要的資訊暴露或是浪費傳輸量。

為何要使用DTO?

DTO全名是Data Transfer Object,能夠選擇傳入傳出的資訊,而不用直接使用Entity實體傳輸。

  • 確保傳遞必要資訊
    DTO用於在前後端之間交換資料,可選擇要傳送的內容。

User實體類別如下,有完整的資料欄位:

public class User {
    private Long id;
    private String username;
    private String password;
    private String email;
    private String address;
    // getters and setters
}

UserDTO如下,過濾掉敏感資訊,如密碼:

public class UserDTO {
    private Long id;
    private String username;
    private String email;
    // getters and setters
}
  • 資料格式轉換
    有時後端處理實體資料時會比較複雜,透過DTO可以額外處理封裝成容易了解和處理的格式。

實體類別的日期型別為LocalDateTime:

public class Task {
    private Long id;
    private LocalDateTime taskDate;
    // getters and setters
}

DTO將日期處理為字串,使前端更好處理:

public class TaskDTO {
    private Long id;
    private String taskDate; // yyyymmdd 格式
    // getters and setters
}
  • 避免實體傳輸
    實體傳輸容易造成安全風險,透過DTO封裝可以避免過多業務邏輯的曝光。

實體類別有庫存欄位:

public class Product {
    private Long id;
    private String name;
    private Double price;
    private int stock;
}

使用DTO隱藏庫存欄位:

public class ProductDTO {
    private Long id;
    private String name;
    private Double price;
}

跟DAO一樣嗎?

DAO(Data Access Object)主要是負責與資料庫交互,單純處理CRUD的操作,屬於抽象化資料存取層,與業務邏輯分層,保持可讀性及維護性,與DTO完全不一樣。

public interface TaskDAO {
    Task findById(Long id);
    void save(Task task);

DTO專注於資料傳輸,是後端開發中非常重要的設計模式,能夠有效控制資料傳輸,提升安全性,而DAO則是專注於資料存取,與業務邏輯清楚分開,能夠提升維護性。後端開發善用這兩者,能夠大大提升系統維護及擴充性唷!


上一篇
後端溝通無礙—RESTful API
下一篇
解密 Spring Data JPA—Repository (補充專案結構)
系列文
從卡關到通關的Spring Boot 腦內風暴30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
chichi
iT邦新手 2 級 ‧ 2024-10-16 16:02:06

另外我覺得不可變的 DTO 的物件可以嘗試使用 record 來封裝,基本上會讓程式碼更簡潔

clairehsy iT邦新手 4 級 ‧ 2024-10-22 09:04:24 檢舉

感謝分享,目前還沒接觸過record,我再來使用看看!

chichi iT邦新手 2 級 ‧ 2024-10-22 10:23:46 檢舉

沒記錯他是 JAVA 17 後的新類別

我要留言

立即登入留言