Entity, domain model và DTO – sao nhiều quá vậy?

0
67
Rate this post

Trong lĩnh vực Spring Boot, việc hiểu quy trình biến đổi dữ liệu qua các lớp khác nhau là một chủ đề quan trọng và thú vị. Trong bài viết này, chúng ta sẽ cùng tìm hiểu về các khái niệm Entity, Domain model và DTO và cách chúng ảnh hưởng đến dữ liệu.

1. Tổng quan về kiến trúc Spring Boot

Trước khi đi vào chi tiết, chúng ta cần hiểu về kiến trúc tổng quan của Spring Boot. Mỗi ứng dụng Spring Boot tuân theo hai mô hình cơ bản: mô hình MVC và mô hình 3 lớp (3 tier). Khi kết hợp hai mô hình này, chúng ta sẽ có một ứng dụng có cấu trúc như sau:

Controller <- Service <- Repository

Sơ đồ trên đại diện cho cách chúng ta tổ chức mã nguồn trong ứng dụng. Tuy nhiên, khi xét về cơ chế lưu trữ dữ liệu, sơ đồ sẽ có dạng khác:

DTO <- Domain model <- Entity

Mỗi lớp sẽ xử lý một kiểu dữ liệu cụ thể, với mục đích và nhiệm vụ riêng.

2. Các kiểu dữ liệu

Theo sơ đồ trên, dữ liệu trong ứng dụng Spring Boot được chia thành hai loại chính: dữ liệu công khai (Public) và dữ liệu riêng tư (Private).

  • Dữ liệu công khai là dữ liệu được trao đổi hoặc chia sẻ với bên ngoài, thông qua REST API hoặc giao tiếp với các dịch vụ khác trong mô hình microservice. Dữ liệu này thường ở dạng DTO.

  • Dữ liệu riêng tư là dữ liệu được sử dụng trong ứng dụng và không nên được tiết lộ ra bên ngoài. Dữ liệu này thường thuộc về Domain model hoặc Entity.

Có ba kiểu dữ liệu chính trong ứng dụng Spring Boot:

  • DTO (Data Transfer Object): Là các lớp chứa dữ liệu được sử dụng để truyền dữ liệu giữa client và server, hoặc giữa các dịch vụ trong mô hình microservice. DTO giúp giảm lượng thông tin không cần thiết phải truyền đi, đồng thời tăng cường bảo mật.

  • Domain model: Là các lớp đại diện cho các domain hay các đối tượng thuộc lĩnh vực kinh doanh. Chẳng hạn, trong một ứng dụng thực tế, các lớp này thường đại diện cho kết quả tính toán, hay chứa thông tin đầu vào cho các dịch vụ tính toán.

  • Entity: Cũng là domain model, nhưng tương ứng với bảng trong cơ sở dữ liệu (DB) và có thể được map vào DB. Chỉ có Entity mới có thể đại diện cho dữ liệu trong DB.

Các kiểu dữ liệu này có thể có nhiều tên gọi khác nhau, nhưng chung quy lại, thuộc hai loại dữ liệu như đã nêu ở trên.

3. Chọn kiểu dữ liệu phù hợp với từng lớp

Mỗi lớp trong kiến trúc 3 lớp của Spring Boot thực hiện xử lý, nhận và trả về dữ liệu của một kiểu cụ thể. Ứng dụng các nguyên tắc sau giúp chọn kiểu dữ liệu phù hợp với từng lớp:

  • Web layer (Controller): Chỉ nên xử lý DTO. Điều này đồng nghĩa với việc Controller chỉ nhận và trả về dữ liệu là DTO.

  • Service layer: Nhận vào DTO (từ Controller) hoặc Domain model (từ các service nội bộ khác). Dữ liệu được xử lý (có thể tương tác với DB) và cuối cùng được trả về Web layer dưới dạng DTO.

  • Repository layer: Chỉ thao tác trên Entity, vì đó là đối tượng thích hợp và có thể map vào DB.

Đối với các thành phần khác của Spring Boot không thuộc vào các lớp này, ta có các trường hợp sau:

  • Custom Repository: Đây là một lớp không sử dụng Repository mà thao tác trực tiếp với cơ sở dữ liệu. Lớp này được xem như một Service.

  • Các thành phần khác: Các thành phần này có thể trả về Entity hoặc Model nếu chúng không chứa thông tin nhạy cảm và đơn giản. Trong trường hợp này, Controller có thể trả về Entity hoặc Model thay vì DTO để giảm độ phức tạp của mã nguồn.

4. Model mapping

Khi dữ liệu đi qua các lớp khác nhau, chúng sẽ được chuyển đổi thành các kiểu dữ liệu khác nhau. Ví dụ, khi DTO đi từ Controller vào Service, nó sẽ được chuyển đổi thành Domain model hoặc Entity, trước khi được truyền vào Repository. Quá trình chuyển đổi giữa các kiểu dữ liệu được gọi là model mapping.

Thường thì ta sẽ sử dụng các thư viện như ModelMapper để thực hiện model mapping. Tuy nhiên, có thể viết code thủ công để thực hiện quá trình chuyển đổi.

5. Kết luận

Khi áp dụng vào thực tế, các quy tắc trên có thể thay đổi tùy thuộc vào dự án cụ thể. Nguyên tắc chung là thực hiện model mapping ở rìa của mã nguồn, tức là quá trình chuyển đổi luôn nằm ở đầu hoặc cuối của quá trình xử lý dữ liệu.

Bài viết chỉ là một phần nhỏ trong chuỗi các bài viết về kiến trúc Spring Boot. Nếu bạn muốn tìm hiểu thêm, bạn có thể đọc tham khảo tại đây.

À quên, nếu bạn thấy bài viết hữu ích, hãy dnulib.edu.vn để tiếp thêm động lực cho chúng tôi nhé! Chúc bạn một ngày tốt lành!