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.

About the Author

Ngọc Tri

View all author's posts

Leave a Comment

Your email address will not be published. Required fields are marked *

Bài viết khác

So sánh giữa gorm vs go-pg vs bun

Trong thế giới phát triển Golang, việc tương tác với cơ sở dữ liệu là một phần không thể thiếu của hầu hết các ứng dụng. Để đơn giản hóa quy trình này, các thư viện ORM (Object-Relational Mapping) ra đời, giúp các nhà phát triển thao tác với database thông qua các đối tượng […]

Tìm hiểu Hexagonal Architecture

Hexagonal Architecture là gì? Hexagonal Architecture (tên gọi khác là ports and adapters architecture), là một mẫu kiến trúc được dùng trong thiết kế phần mềm. Nó hướng tới việc xây dựng ứng dụng xoay quanh business/application logic mà không ảnh hưởng hoặc phụ thuộc bởi bất kì thành phần bên ngoài, mà chỉ giao […]

Go-pg

go-pg là một thư viện ORM (Object-Relational Mapping) và trình điều khiển PostgreSQL cho ngôn ngữ lập trình Go. Nó cung cấp một cách tiện lợi để tương tác với cơ sở dữ liệu PostgreSQL bằng cách ánh xạ các cấu trúc (structs) trong Go thành các bảng trong cơ sở dữ liệu và ngược […]

Ngôn ngữ lập trình Golang

Golang là gì? Go (hay còn gọi là Golang) là một ngôn ngữ lập trình được thiết kế dựa trên tư duy lập trình hệ thống. Go được phát triển bởi Robert Griesemer, Rob Pike và Ken Thompson tại Google vào năm 2007. Điểm mạnh của Go là bộ thu gom rác và hỗ trợ […]

Tìm hiểu RESTful API

RESTful là gì? REST (Representational State Transfer) là gì? REST (Representational State Transfer) không phải là một ngôn ngữ lập trình hay một framework, mà là một kiểu kiến trúc phần mềm (architectural style) để thiết kế các hệ thống mạng phân tán, đặc biệt là các dịch vụ web (web services). Nó được giới […]

Hệ quản trị CSDL PostgreSQL

SQL là gì? SQL (Structured Query Language) là viết tắt của Ngôn ngữ truy vấn có cấu trúc, là ngôn ngữ được tiêu chuẩn hóa để tương tác với các hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS). Cơ sở dữ liệu quan hệ là tập hợp dữ liệu được tổ chức thành các […]