Làm backend với Java Spring, tôi nên biết những gì?

Trong bài viết này mình xin được tổng hợp một số chủ đề từ cơ bản đến nâng cao khi lập trình web với Java. (Mình sẽ bỏ qua các kĩ thuật liên quan đến server render như JSP & Thymeleaf, và chỉ tập trung vào Rest API) 1. Spring Core (MVC or Boot) Bên

Trong bài viết này mình xin được tổng hợp một số chủ đề từ cơ bản đến nâng cao khi lập trình web với Java.

(Mình sẽ bỏ qua các kĩ thuật liên quan đến server render như JSP & Thymeleaf, và chỉ tập trung vào Rest API)

1. Spring Core (MVC or Boot)

Bên cạnh các kiến thức căn bản như làm thế nào để tạo mới project từ https://start.spring.io hoặc cách để viết một API thì còn có một số chủ đề quan trọng khác như:

1. Dependency Injection & Auto-configuration ✔️

Dependency Injection (DI) và Inversion of Control (IoC) là hai khái niệm quan trọng để hiểu được bản chất & nguyên lý hoạt động của Spring. Từ đó hiểu được nguyên tắc chia business layers 2 lớp hay 3 lớp (controller, service, repository) tùy vào dự án.

Đối với Spring Boot, cần nắm được các cài đặt configuration, bởi mục đích ra đời của Spring Boot là nhằm đơn giản hóa công việc đó hết mức có thể.

2. Binding property từ biến môi trường và file YAML ✔️

Mục đích của việc này là để tránh hard-code. Mỗi lần có thay đổi gì liên quan đến thông số, chỉ cần sửa lại biến môi trường và restart app, không cần phải compile và deploy lại app.

3. Validate DTO với Jakarta Bean Validation ✔️

4. Handle REST exception với @ControllerAdvice ✔️

Việc xử lý exception cẩn thận ở mức abstract có thể giúp giảm bớt code dư thừa trùng lặp (boilerplate code).

5. Xử lý multipart-file ✔️

Xử lý file dữ liệu dạng binary là một kĩ thuật tương đối “lằng nhằng”, đòi hỏi việc ghi nhớ các thông số header khi xử lý từ phía client cho đến lúc tiếp nhận request và gửi trả response ở phía server.

Ở chủ đề này thì còn có một vài chủ đề con quan trọng khác như:

  • Nhập/xuất dữ liệu dưới dạng file Word/Excel/PDF bằng cách sử dụng JasperReport hoặc Apache POI.
  • Xử lý hình ảnh hoặc file để tải lên cloud blobstore như Amazon S3.

6. Gửi mail với Spring Mail ✔️

7. Tạo cronjob tĩnh và động (dynamically) với @Scheduler, SchedulingConfigurerExecutorService 👍

Một số nghiệp vụ đòi hỏi phải lên lịch theo nhu cầu người dùng (ví dụ hệ thống đặt lịch hẹn, tự đếm giờ để chuyển trạng thái, tự động gửi thông báo theo thời gian người dùng cài đặt), yêu cầu phải biết kĩ thuật tạo cronjob động theo data của người dùng.

8. Xử lý bất đồng bộ với Spring Event@Async 👍

2. Spring Data

Công việc chính của 1 backend là cung cấp API và xử lý dữ liệu. Việc hiểu rõ và hiểu sâu về ORM bên dưới để viết code chuẩn chỉnh, tối ưu performance cũng như giảm thiểu sai sót là một điều hết sức cần thiết.

Bên cạnh những kiến thức cơ bản như:

  • Phân biệt được Hibernate và JPA, biết được JDBC là gì
  • Biết cách setup datasource cho CSDL tương ứng phù hợp
  • Phân biệt được các annotation JPA và biết cách sử dùng Repository với các loại query khác nhau (JPQL, interface query, native query)

Thì còn những chủ đề sau:

1. Sorting & Pagination ✔️

Đây là 2 kĩ thuật cơ bản của lập trình web. Tưởng dễ nhưng không dễ chút nào, kể cả với những người đã làm lâu năm.

Khi gặp phải những tình huống như số lượng parameters quá nhiều, các điều kiện query cần join ở bảng khác, hoặc cần sort theo nhiều cấp độ level, thì đòi hỏi các kĩ thuật nâng cao hơn để code abstract và ít boilerplate.

2. N + 1 problem ✔️

Đây là vấn đề cực kì quan trọng. Tại sao lại gọi là “N + 1 problem”? Hãy tưởng tượng, khi thiết kế DTO, ta lưu thông tin của một chiếc xe như sau.

@EntityclassCar{...@ManyToOneBrand brand;}

Khi ta đọc từ database một danh sách các xe, thì truy xuất vào field car.brand sẽ có luôn thông tin của hãng xe. Theo lẽ thường tình, chúng ta cho rằng câu query đó chỉ tốn 1 lần truy cập DB với lệnh JOIN...ON, hoặc cùng lắm là 2 lần truy cập riêng lẽ danh sách carbrand.

Nhưng không. Mặc định, JPA sẽ tốn tổng cộng 1 + N lần truy xuất, trong đó, lần đầu tiên lấy lên n chiếc xe, sau đó tốn thêm n lần nữa để lấy lên thông tin của hãng ứng với mỗi xe. Mỗi lần chỉ trả về duy nhất một record. Một pha xử lý cồng kềnh đến bất ngờ. Số lượng xe càng lớn thì performance càng đi vào lòng đất.

Hiểu được bản chất và cách khắc phục sẽ giúp developer bước lên một tầm cao mới.

3. Dynamic Query với Criteria API và JPA Specification 👍

Đôi khi chúng ta muốn custom câu query một cách linh động (dynamically), như kiểu thay đổi mệnh đề WHERE trong query dựa vào params hoặc các trường sort do client gửi xuống. Thì JPA Criteria API là giải pháp giúm chúng ta làm điều đó. Bộ API này cung cấp việc tạo query bằng code, custom các mệnh đề FROM, WHERE, GROUP BY… hoàn toàn bằng code.

JPA Specification cũng là một trong số giải pháp mà Spring Data cung cấp. Nó được dùng kết hợp với Criteria API ở những tình huống cụ thể hơn.

4. Multiple datasource config 👍

5. JPA Alternatives 👍

Hibernate và JPA không phải là giải pháp ORM duy nhất. Chúng ta có các thư viện khác như MyBatis và QueryDSL cũng rất tiện lợi. Đặt biệt là MyBatis, hướng tiếp cận đơn giản của nó hoàn toàn có thể thay thế bộ Criteria API phức tạp mà vẫn giải quyết được vấn đề cấu hình động câu query. Đơn giản như vậy tại sao lại không thử một lần, đúng không?

3. Spring Security

Phần này thì không đòi hỏi quá nhiều ở developer, bởi đây là một trong những chủ đề khó nhất khi nhắc đến hệ sinh thái Spring.

Bên cạnh việc authentication, thì authorization (phân quyền) sẽ phụ thuộc vào logic nghiệp vụ và ảnh hưởng đến cách thiết kế database.

1. CORS, CSRF ✔️

2. OAuth – JWT ✔️

3. Filter chains 👍

Đôi khi thay vì dùng cấu hình có sẵn thì chúng ta cần custom một vài thứ liên quan đến luồng đi của request. Khi đó sử dụng Filter sẽ là lựa chọn hợp lý. Hơn nữa, bản chất bên dưới của Spring là HttpServlet. Nếu đã từng học qua lập trình web với servlet, hẳn bạn sẽ biết kiến trúc cốt lõi của nó đều dựa vào việc build Filter.

Tạm kết

Trên đây là 3 chủ đề chính khi làm việc với Spring.

Phần lớn các tutorial đều có thể tìm thấy trên internet. Mình cực kì recommend trang Baeldung.com cho các bạn. Nơi đây là “thánh địa” của người chơi hệ Java, chủ đề nào cũng có, level nào cũng có.

Mình sẽ tổng hợp các chủ đề còn lại trong bài tiếp theo. Hẹn gặp lại các bạn.

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ