Learning Outcome & Exercises: Spring MVC
Tổng kết chương Spring MVC: học xong mình phải làm được gì, và làm bài tập nào để chứng minh?
Đọc hiểu chưa đủ để đi phỏng vấn. Mỗi chương kết thúc bằng những việc làm được và chứng minh được: có code chạy, có test cho cả trường hợp lỗi, có log hoặc số đo. Bài tập nằm trong repo riêng java-backend-interview-labs, thư mục labs/spring-mvc.
1. Mục tiêu đầu ra
Học xong chương này, bạn tự làm được:
- Xây REST controller có validation và error contract thống nhất (ProblemDetail).
- Test controller bằng @WebMvcTest cho happy path và các lỗi 400/404/409.
- Giải thích request đi qua Filter → DispatcherServlet → Interceptor → Controller.
2. Basic: CRUD có validation
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
POST /orders với @Valid; body sai trả 400 kèm danh sách field lỗi.
Bài liên quan: @Controller vs @RestController, Nhận tham số, Validation
Hoàn thành khi:
- MockMvc test cho body hợp lệ và không hợp lệ
3. Intermediate: Error contract
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
@RestControllerAdvice trả ProblemDetail cho NotFound, Conflict, lỗi không lường trước (không lộ stack trace).
Bài liên quan: Exception handling, ResponseEntity, status code, header
Hoàn thành khi:
- Test cho 404, 409, 500
- Response có traceId
4. Challenge: Filter, interceptor và async
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Filter gắn traceId, interceptor đo latency, endpoint trả CompletableFuture; chứng minh Tomcat thread được nhả.
Bài liên quan: Filter, Interceptor và AOP, Async trong MVC, Test controller
Hoàn thành khi:
- Log thread trước/sau
- Test async dispatch với MockMvc
5. Tiêu chí hoàn thành chung
- Tự giải thích được bài toán và vì sao chọn giải pháp.
- Code chạy được bằng lệnh ghi trong README, không chứa secret.
- Có test tự động cho happy path và failure path.
- Có log hoặc số đo trong
evidence/chứng minh kết quả. - Có câu trả lời phỏng vấn ngắn bằng tiếng Việt và tiếng Anh.
- README của lab có link ngược về bài học tương ứng.
6. Lab và trạng thái
| Mức | Bài tập | Trạng thái | Test / bằng chứng |
|---|---|---|---|
| Basic | CRUD có validation | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Intermediate | Error contract | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Challenge | Filter, interceptor và async | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
Repo lab: java-backend-interview-labs/labs/spring-mvc. TODO: link GitHub là placeholder cho tới khi repo được push.
evidence/; chỉ đánh dấu xong khi có bằng chứng.Phỏng vấn hỏi về Spring MVC, câu nào hay gặp nhất và trả lời sao?
Q1. Filter, Interceptor và AOP khác nhau thế nào?
🇻🇳 Tiếng Việt:
Filter thuộc Servlet, chạy trước DispatcherServlet và thấy mọi request. Interceptor thuộc Spring MVC, biết handler nào sẽ xử lý. AOP bọc method của bean, không biết gì về HTTP.
🇬🇧 English:
A Filter belongs to the Servlet layer and runs before the DispatcherServlet for every request. An Interceptor is part of Spring MVC and knows which handler will run. AOP wraps bean methods and knows nothing about HTTP.
Cách nhớ ngắn gọn
- Mỗi bài tập = code + test + log.
- Luôn có ít nhất một failure case.
- Chưa có bằng chứng thì chưa xong.
Tự kiểm tra
Bài tập Basic (CRUD có validation) được coi là xong khi nào?
MockMvc test cho body hợp lệ và không hợp lệ. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Intermediate (Error contract) được coi là xong khi nào?
Test cho 404, 409, 500; Response có traceId. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Challenge (Filter, interceptor và async) được coi là xong khi nào?
Log thread trước/sau; Test async dispatch với MockMvc. Chưa có code chạy và bằng chứng thì chưa tính là xong.