1.Clean Architecture là gì?
Clean Architecture là một kiến trúc phần mềm được đề xuất bởi Robert C. Martin (Uncle Bob) nhằm mục tiêu tách biệt rõ ràng giữa các tầng trong ứng dụng, giúp mã nguồn dễ bảo trì, mở rộng, và kiểm thử.
2.Tổng quan kiến trúc
- Entity (Domain Model):
- Là tầng trung tâm nhất.
- Chứa các thực thể, các đối tượng quan trọng đại diện cho nghiệp vụ của hệ thống.
- Đây là phần cốt lõi, không phụ thuộc vào bất kỳ thành phần nào khác.
- Use Case (Service):
- Chứa các logic nghiệp vụ cụ thể của ứng dụng.
- Điều phối hành vi của hệ thống thông qua các thực thể (entities).
- Không phụ thuộc vào framework, database hay HTTP.
- Interface Adapter (Controller, Presenter):
- Là cầu nối giữa bên ngoài và bên trong hệ thống.
- Chứa controller nhận HTTP request, presenter xử lý dữ liệu phản hồi, và gateway chuyển đổi dữ liệu giữa các tầng.
- Có thể phụ thuộc vào Use Case, nhưng không làm ảnh hưởng đến logic nghiệp vụ bên trong.
- Frameworks & Drivers:
- Tầng ngoài cùng, nơi tích hợp các công cụ, thư viện và framework như Gin, GORM, SMTP…
- Có thể dễ dàng thay thế mà không ảnh hưởng đến logic bên trong.
Cấu trúc thư mục thực tế trong dự án Golang
project/
├── cmd/ # Điểm khởi đầu ứng dụng (main.go). Tại đây, ta khởi tạo router và chạy ứng dụng.
├── controller/ # Xử lý request từ phía client, gọi các hàm từ service và trả JSON response.
├── service/ # Chứa logic nghiệp vụ chính (usecase), ví dụ: đăng ký, đăng nhập.
├── domain/
│ └── model/ # Định nghĩa các entity cốt lõi như User, Token, và các response struct.
├── store/ # Lưu trữ tạm thời như OTP, cache. Có thể là map, Redis hoặc memory.
├── repository/ # Chứa các thao tác kết nối với cơ sở dữ liệu như GORM, SQL, v.v.
├── config/ # Đọc và quản lý các biến môi trường từ .env hoặc config file.
└── utils/ # Các hàm tiện ích như tạo JWT, hash password, random string.
3.Ưu điểm
- Tách biệt rõ ràng: Các tầng được phân chia hợp lý, không phụ thuộc lẫn nhau, dễ bảo trì, khi có thay đổi (ví dụ: thay Redis thay cho map), chỉ cần sửa tầng store
- Dễ mở rộng: Có thể dễ dàng thêm các tính năng như xác minh qua SMS, đăng nhập bằng Google…, dễ kiểm thử, Có thể viết unit test cho từng tầng độc lập
- Dễ hiểu và đọc: Mỗi file, mỗi hàm có một vai trò rõ ràng
4.Nhược điểm
- Tốn công setup ban đầu.
- Nhiều file, thư mục hơn, làm tăng độ phức tạp với người mới.
- Dự án nhỏ áp dụng có thể thấy “rườm rà” nếu không quen.