DTO vs Entity trong Spring Boot: vì sao đừng trả Entity ra API
22/07/2026
Một trong những quyết định thiết kế quan trọng nhất khi làm REST API với Spring là: có nên trả thẳng Entity JPA ra client không? Câu trả lời gần như luôn là không — hãy dùng DTO.
Entity và DTO khác nhau ở mục đích
- Entity: ánh xạ bảng database, phục vụ lớp lưu trữ (persistence)
- DTO (Data Transfer Object): định hình dữ liệu vào/ra API, phục vụ lớp giao tiếp
Vì sao đừng trả Entity
- Lộ dữ liệu: Entity có thể chứa
passwordHash, cờ nội bộ — dễ lỡ tay serialize ra ngoài - Vòng lặp JSON: quan hệ hai chiều (Order ↔ Customer) gây đệ quy vô tận khi serialize
- Lazy loading exception: serialize ngoài transaction đụng quan hệ lazy gây
LazyInitializationException - Ràng buộc chặt: đổi schema database làm vỡ hợp đồng API của client
Mẫu triển khai
public record UserDto(Long id, String email, String name) {
static UserDto from(User u) {
return new UserDto(u.getId(), u.getEmail(), u.getName());
}
}
Với dự án lớn, dùng thư viện map (MapStruct) để tự sinh code chuyển đổi. DTO cũng là nơi lý tưởng đặt annotation validation (@NotBlank, @Email) cho input.
👉 Dùng thử công cụ liên quan trên dev-hub: JSON Formatter — chạy hoàn toàn trong trình duyệt, không gửi dữ liệu lên server.