Bạn đã biết gì về Spring Boot? Cùng tìm hiểu thêm thông tin về hệ sinh thái Spring framework có gì đặc biệt qua bài viết dưới đây nhé!
Spring Boot là gì?
Spring Boot là một dự án phát triển bởi JAV (ngôn ngữ java) trong hệ sinh thái Spring framework. Nó giúp cho các lập trình viên chúng ta đơn giản hóa quá trình lập trình một ứng dụng với Spring, chỉ tập trung vào việc phát triển business cho ứng dụng.
Tạo và triển khai CRUD trong project Spring Boot
Ở thời điểm hiện tại Spring Boot có lẽ đang là framework nổi tiếng và được sử dụng nhiều bậc nhất trong phát triển các ứng dụng sử dụng ngôn ngữ Java. Được xây dựng trên nền tảng Spring framework, nó có tất cả các tính năng của Spring cộng thêm những tiện ích mà nó mang lại như giảm thiểu các bước cấu hình phức tạp, nhúng server container (Tomcat, Jetty hoặc Undertow) tự động vào ứng dụng giúp chúng ta có thể khởi chạy một ứng dụng ngay lập tức, quản lý dependence thông minh,…
Tất cả điều này đã tạo nên một sức lôi cuốn vô cùng lớn đối với cộng đồng developer trên khắp thế giới, các công ty cũng đang dần chuyển sang dùng Spring Boot cho các dự án tiếp theo. Lựa chọn học Spring Boot ở thời điểm hiện tại là một quyết định đúng đắn vì thị trường việc làm của nó đang rất nhiều. Không chỉ vậy, hiện tại có nhiều công ty cũng đang dần chuyển từ Spring qua Spring Boot cho các dự án cũ và các dự án mới sẽ dùng hẳn Spring Boot.
- Khởi tạo project spring boot
Để khởi tạo một project Spring Boot nhanh chóng các bạn có thể truy cập vào trang Spring Initializr và lựa chọn các thông số cấu hình cho dự án, cũng như các dependency cần thiết hoặc khởi tạo project maven với các dependency như sau:
Lưu ý: Nếu dùng Spring Initializr, các bạn có thể thêm các dependency này bằng cách chọn “Add dependencies” ở tab “Dependencies”.
Cấu trúc project Spring Boot
Trong một project Spring Boot thường sẽ có các layer chính:
- Domain: chứa các ánh xạ database – entity
- Repository: định nghĩa các DAO (Data access object) class dùng để làm việc với database
- Service: chứa các business logic class
- Controller: nhận request từ client
- Mapper: dùng để convert qua lại giữa entity và dto (không có cũng được)
- Exception Hanlder: xử lý các exception xảy ra trong quá trình thực thi yêu cầu của client
Dự án sau khi được hoàn thành sẽ có cấu trúc như thế này. Bây giờ, chúng ta sẽ bắt đầu đi từng phần một.
- Domain layer
Đối với hầu hết các dự án, chúng ta thường bắt đầu với domain layer trước, sau khi đã phân tích thiết kế cơ sở dữ liệu xong, chúng ta sẽ đến bước định nghĩa các entity ánh xạ các table tương ứng dưới database.
Trong bài viết này, chúng ta dùng H2 database, các bạn có thể linh hoạt sử dụng các database khác như SQL, MySQL, Mariadb tùy ý. Vì sử dụng JPA và JPA provider bên dưới là Hibernate nên có thể dễ dàng chuyển đổi qua lại giữa các database mà code không bị ảnh hưởng. Trong khuôn khổ bài viết này, định nghĩa một User entity có thể làm như sau:
Các entity class phải được chú thích với @Entity annotation, ngoài ra các annotation khác của lombok được mình sử dụng để giảm thiểu việc triển khai các method getter, setter, constructor,…
- Repository Layer
Đây là layer chúng ta định nghĩa các DAO class dùng để thao tác với database. Tuy nhiên, trong phần này, chúng ta không cần phải triển khai các method cơ bản như là findById(), findAll, save(), delete(), update() vì chúng đã được triển khai thông qua một tầng abstraction được đặt ở trên JPA implementation. Để sử dụng các tính năng cơ bản này, chúng ta chỉ cần khai báo một Repository class thừa kế từ CrudRepository.
- Service Layer
Như đã đề cập trước đó, Service layer sẽ là nơi chứa các business chính của dự án, là cầu nối giữa Controller layer và Repository layer. Với một ứng dụng CRUD thì chúng ta cần ít nhất các method dùng cho việc thêm, sửa, xóa, cập nhật và tìm kiếm. Trước tiên, chúng ta cần định nghĩa một UserService Interface và một UserServiceImpl class dùng để triển khai các method định nghĩa trong UserService.
và
Các bạn thấy cách làm này có “kỳ cục” không? Tại sao chúng ta không tạo luôn UserService class rồi triển khai code trong đó? Điều này hoàn toàn được, tuy nhiên các bạn cần phải biết đây là một cách làm giúp tăng tính mở rộng code.
Giả sử, hiện tại chúng ta đang có UserService và UserServiceImpl hoạt động ổn. Về sau này, chúng ta cần chỉnh sửa một số tính năng trong UserServiceImpl để tăng performance hoặc adapt cho phù hợp với business mới. Nhưng do UserServiceImpl đã được phát triển qua một thời gian dài, nên việc sửa code trong này rất khó khăn, lúc đó, chúng ta có thể tạo ra một UserServiceImplNew mới cũng như implement UserService và triển khai code tách bạch khỏi UserServiceImpl. Sau đó, chúng ta chỉ cần thay đổi việc sử dụng UserServiceImplNew thay vì UserServiceImpl mà không cần chỉnh sửa code ở những chỗ khác.
Những chỗ khác đang sử dụng UserServiceImpl mà không có nhu cầu chỉnh sửa thì vẫn có thể sử dụng, do không có chỉnh sửa gì trên UserServiceImpl nên chúng ta yên tâm là các tính năng sẽ vẫn hoạt động như cũ.
- Create
Đến với chức năng đầu tiên, chúng ta cần tạo một hàm createUser dùng để tạo và lưu một record User xuống database.
Các bạn có thể tùy ý thêm các mã kiểm tra khác như email có hợp lệ không, email có tồn tại trước đó hay chưa, sau đó sử dụng method save() để lưu xuống database.
Chú ý: Khi sử dụng H2 trong project Spring Boot thì mặc định nó đã cấu hình tự động cho bạn sử dụng một database H2-mem, nghĩa là khi tắt ứng dụng thì dữ liệu sẽ bị mất.
- Update
Với hàm update(), client cần truyền cho chúng ta ID của user muốn cập nhật và một User object chứa các thông tin được cập nhật.
- Delete
Tính năng này khá đơn giản, chúng ta sẽ nhận vào một User ID và xóa User trong database có ID tương ứng.
- Find
Sẽ có 2 method thường được dùng là tìm kiếm theo ID hoặc lấy tất cả.
- Controller Layer
Đến layer cuối cùng dùng để nhận các request từ client, chúng ta sẽ cần đến @RestController annotation để đánh dấu một class là một controller, và @RequestMapping, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping để chỉ định các endpoint cụ thể cho các API.
Trong đó, các bạn cần chú ý @RequestBody dùng để parse request body sang User object tự động, và @PathVariable dùng để parse ID từ Path parameter.
Như vậy là chúng ta đã biết cách xây dựng một ứng dụng Spring boot đơn giản với các tính năng CRUD cơ bản nhất mà một ứng dụng cần có. Bên cạnh đó, chúng ta cũng biết cách sử dụng các annotation để ánh xạ dữ liệu và tạo ra các endpoint cho ứng dụng. Hy vọng các bạn có thể áp dụng thành thạo những kiến thức đã chia sẻ ở bên trên!
Bộ môn Ứng dụng phần mềm
Cao đẳng FPT Mạng cá cược bóng đá Hà Nội