Mục lục
Khi chúng ta bắt đầu phát triển một dự án Spring Boot mới, một thử thách rất lớn là làm thế nào để xây dựng được một cấu trúc linh hoạt, và dễ đọc và dễ quản lý khi dự án trở nên lớn dần.
Tất nhiên là một cấu trúc có thể phù hợp với dự án này nhưng có thể sẽ không phù hợp với dự án kia. Tuy nhiên dưới đây mình sẽ trình bày một số gợi ý về cách xây dựng cấu trúc cho một project Spring Boot.
Không sử dụng default package
Khi một class được khai báo không chứa package nghĩa là nó đang thuộc default package. Việc sử dụng default package thông thường không được khuyến khích và nên tránh sử dụng. Nó có thể gây ra một số sự cố trong ứng dụng Spring Boot sử dụng @ComponentScan, @EntityScan, hoặc @SpringBootApplication annotation vì chúng sử dụng các package để xác định vị trí quét.
Chúng ta nên tuân theo các quy ước đặt tên package được đề xuất của Java và sử dụng reversed domain (ví dụ: com.deft.my-project).
Vị trí đặt main class trong Spring Boot
Spring Boot team khuyên chúng ta nên đặt main class tại root package – là cha của tất cả các package còn lại trong project. Annotation @SpringBootApplication thường được đặt trên main class dùng để quét và khởi tạo các bean trong project. Nếu được đặt ở root package nó sẽ đảm bảo quét được hết các bean trong các package còn lại.
Package by feature project structure
Một chiến lược tổ chức cấu trúc project phổ biến là package-by-feature giúp tăng cường tính modun cho ứng dụng. Đây là một cấu trúc mà Spring boot team khuyên nên sử dụng, ngoài ra họ cũng triển khai một cấu trúc mẫu trên github.
Project trên được tổ chức theo phong cách package-by-feature, trong đó mỗi package sẽ đảm nhiệm một chức năng, do vậy mỗi package sẽ bao gồm cả model, service, repository, controller và config riêng cho nó.
Layer structure
Cách trên có lẽ là một cấu trúc tốt vì nó được khuyến khích bởi các nhà phát triển spring boot. Tuy nhiên chúng ta vẫn có một cấu trúc nữa chia theo các tầng ứng dụng controller, model, service, repository riêng.
Với cấu trúc này thì mỗi tầng sẽ quản lý tất cả các class liên quan đến nó trong cùng một package. Với cách này thì khi dự án trở nên lớn hơn có nhiều class hơn thì có thể mỗi package sẽ chứa rất nhiều class gây khó khăn khi chúng ta cần tìm kiếm một class cụ thể. Tuy nhiên chúng ta có thể định nghĩa các sub-package con để có thể chia nhỏ hơn class hơn thì vẫn đáp ứng được.
Kết bài
Qua bài viết chúng ta đã xem được số khuyến nghị khi cấu trúc một dự án spring boot, trong có cả cấu trúc được spring boot đề xuất làm tăng tính modun cho ứng dụng.
Nguồn tham khảo
https://www.baeldung.com/spring-boot-package-structure
https://github.com/spring-projects/spring-petclinic
https://www.javaguides.net/2019/01/standard-project-structure-for-spring-boot-projects.html