Learning Outcome & Exercises: Spring MVC

2 câu hỏi~10 phút đọc, vài giờ làm labTừ khóa: learning outcome, Basic, Intermediate, Challenge, evidence

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:

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:

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:

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:

5. Tiêu chí hoàn thành chung

6. Lab và trạng thái

MứcBài tậpTrạng tháiTest / bằng chứng
BasicCRUD có validation⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành—
IntermediateError contract⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành—
ChallengeFilter, 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.

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


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.