Lập trình Java Spring Boot

I. Giới thiệu khóa học:

Khóa học Lập trình Java Spring Boot trang bị cho học viên kiến thức và kỹ năng thực hành để xây dựng ứng dụng web backend bằng Java Spring Boot. Chương trình tập trung vào cách khởi tạo project, xây dựng REST API, kết nối cơ sở dữ liệu MySQL với Spring Data JPA, áp dụng kiến trúc 3 lớp, xử lý validation, exception handling, bảo mật cơ bản với Spring Security và triển khai ứng dụng lên môi trường thực tế. Thông qua các bài thực hành và mini project cuối khóa, học viên có thể từng bước phát triển một ứng dụng Spring Boot hoàn chỉnh và sử dụng sản phẩm này cho học tập, công việc hoặc portfolio cá nhân. Nội dung này phù hợp với mục tiêu khóa học hiện có như xây dựng REST API, kết nối MySQL, áp dụng kiến trúc 3 lớp và deploy ứng dụng.

II. Thời lượng: 40 giờ (5 ngày)
III. Hình thức đào tạo:

Đào tạo trực tiếp tại lớp học, đào tạo online tương tác với giảng viên, đào tạo kết hợp online và trực tiếp tại lớp học, đào tạo tại văn phòng khách hàng theo yêu cầu

IV. Mục tiêu khóa học:

Sau khi hoàn thành học viên có khả năng:

  • Hiểu được Spring Boot là gì, vì sao cần dùng và vị trí của nó trong hệ sinh thái Java.
  • Tự khởi tạo và cấu hình một project Spring Boot từ đầu.
  • Xây dựng được REST API hoàn chỉnh cho một nghiệp vụ thực tế (CRUD, validation, xử lý lỗi).
  • Kết nối và thao tác với cơ sở dữ liệu MySQL thông qua Spring Data JPA.
  • Áp dụng được kiến trúc 3 lớp (Controller - Service - Repository) khi viết code.
  • Đóng gói, triển khai (deploy) một ứng dụng Spring Boot lên môi trường thật.
  • Hoàn thành một mini project có thể trưng bày trong portfolio cá nhân.
V. Đối tượng tham gia:
  • Sinh viên ngành Công nghệ thông tin, Khoa học máy tính, Kỹ thuật phần mềm muốn học lập trình backend với Java Spring Boot.
  • Lập trình viên Java mới bắt đầu muốn nâng cao kỹ năng xây dựng REST API và ứng dụng web backend.
  • Fresher/Junior Developer cần bổ sung kiến thức về Spring Boot, Spring Data JPA, Spring Security và triển khai ứng dụng thực tế.
  • Người đã có nền tảng Java cơ bản và muốn phát triển năng lực theo hướng Java Backend Developer.
  • Nhân sự IT hoặc người chuyển hướng sang lập trình backend, mong muốn xây dựng project thực hành để bổ sung vào hồ sơ cá nhân.
VI. Điều kiện tiên quyết:

Có kiến thức Lập trình Java cơ bản (OOP, Exception, Collection, Generic).

VII. Nội dung khóa học:

1. Module 1: Java review và Spring Boot

Mục tiêu cụ thể

  • Học viên hiểu được Spring Boot khác Spring truyền thống ở chỗ nào và vì sao Spring Boot phổ biến.
  • Khởi tạo thành công một project Spring Boot bằng Spring Initializr.
  • Hiểu được vai trò của các file/folder cơ bản trong project.
  • Chạy được endpoint đầu tiên và truy cập từ trình duyệt.

Nội dung lý thuyết

  • Ôn Java : OOP, Collection (List/Map), Lambda expression, Stream API cơ bản, Maven/Gradle.
  • Giới thiệu Spring Framework: Spring là gì, các module chính (Core, MVC, Data), vấn đề mà Spring giải quyết.
  • Spring Boot và lợi ích: Auto-configuration, Starter dependencies, embedded server (Tomcat), không cần cấu hình XML.
  • Tour Spring Initializr: Cách chọn version, dependencies (Spring Web), đóng gói project.
  • Cấu trúc project: pom.xml, src/main/java, src/main/resources, application.properties, file Application chính, ý nghĩa annotation @SpringBootApplication.

Demo và thực hành

  • Demo (giảng viên): Tạo project HelloSpringBoot từ Spring Initializr, import vào IntelliJ, chạy ứng dụng và xem log khởi động.
  • Thực hành 1: Học viên tự tạo project tên hello-springboot với dependency Spring Web.
  • Thực hành 2: Viết một class HelloController có endpoint GET /hello
  • Thực hành 3: Đổi cổng (port) ứng dụng sang 8081 trong file application.properties và chạy lại.

Bài tập

  • Tạo thêm 3 endpoint: /info trả về thông tin cá nhân, /time trả về thời gian hiện tại, /math/sum?a=5&b=3 trả về tổng hai số.
  • Đẩy code lên GitHub repo cá nhân (tạo repo mới, gắn .gitignore cho Java).
  • Đọc thêm về Maven lifecycle (compile, test, package, install) và viết tóm tắt khoảng 200 từ.

2. Module 2: REST Controller cơ bản

Mục tiêu cụ thể

  • Học viên nắm được các HTTP method và khi nào dùng method nào.
  • Sử dụng được các annotation Mapping của Spring để định nghĩa endpoint.
  • Truyền và nhận dữ liệu giữa client (Postman) và server bằng path variable, query param, request body.
  • Trả về response chuẩn với HTTP status code phù hợp.

Nội dung lý thuyết

  • REST API là gì: Khái niệm, nguyên tắc thiết kế URL theo resource, stateless.
  • HTTP methods: GET (đọc), POST (tạo mới), PUT (cập nhật toàn bộ), PATCH (cập nhật một phần), DELETE (xóa).
  • Các annotation chính: @RestController, @RequestMapping, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping.
  • Truyền dữ liệu: @PathVariable cho dữ liệu trong URL, @RequestParam cho query string, @RequestBody cho JSON body.
  • Trả response: Trả object trực tiếp, dùng ResponseEntity để kiểm soát status code và header.
  • HTTP status code thường dùng: 200 OK, 201 Created, 204 No Content, 400 Bad Request, 404 Not Found, 500 Internal Server Error.

Demo và thực hành

  • Demo: Giảng viên xây dựng ProductController với một List<Product> in-memory, làm 5 endpoint CRUD đầy đủ và test bằng Postman.
  • Thực hành: Học viên tự xây dựng StudentController quản lý danh sách Học viên (id, hoTen, lop, diem) lưu trong List in-memory.

Yêu cầu hands-on chi tiết cho StudentController

  • GET /api/students - lấy toàn bộ danh sách.
  • GET /api/students/{id} - lấy một Học viên theo id.
  • GET /api/students/search?lop=CD23 - lọc Học viên theo lớp.
  • POST /api/students - thêm mới (nhận JSON từ Postman).
  • PUT /api/students/{id} - cập nhật thông tin.
  • DELETE /api/students/{id} - xóa.

Bài tập

  • Bổ sung endpoint GET /api/students/top?n=5 trả về 5 Học viên có điểm cao nhất.
  • Bổ sung endpoint GET /api/students/statistics trả về thống kê: tổng số, điểm trung bình, điểm cao nhất, điểm thấp nhất.
  • Tạo collection Postman lưu lại các request đã test, export ra file JSON và đẩy lên GitHub.

3. Module 3: Dependency Injection và kiến trúc 3 lớp

Mục tiêu cụ thể

  • Học viên hiểu được khái niệm IoC, Dependency Injection và lý do tại sao nên dùng.
  • Phân biệt được @Component, @Service, @Repository và biết khi nào dùng cái nào.
  • Tách project Module 2 ra 3 lớp Controller - Service - Repository đúng cách.
  • Viết được unit test cơ bản cho Service bằng JUnit 5 và Mockito.

Nội dung lý thuyết

  • IoC và DI: Inversion of Control là gì, container quản lý vòng đời object thay cho lập trình viên, lợi ích về mặt testability và bảo trì.
  • Bean và stereotype annotation: @Component (chung), @Service (tầng nghiệp vụ), @Repository (tầng truy cập dữ liệu), @Controller/@RestController (tầng giao tiếp).
  • Cách inject: Field injection (@Autowired trên field) - dễ nhưng không khuyến khích, Constructor injection - được khuyến khích vì rõ ràng và dễ test.
  • Bean scope (giới thiệu): Singleton (mặc định), Prototype - chỉ cần biết khái niệm, chưa cần dùng sâu.
  • Kiến trúc 3 lớp: Controller chỉ tiếp nhận request và trả response, Service chứa logic nghiệp vụ, Repository thao tác với dữ liệu. Mỗi tầng có trách nhiệm riêng (Single Responsibility).
  • Unit test : Khái niệm test, JUnit 5 (@Test, assertEquals), Mockito để mock dependency của Service.

Demo và thực hành

  • Demo: Giảng viên refactor StudentController Module 2 thành 3 lớp: StudentController, StudentService (interface và implementation), StudentRepository (interface và implementation đơn giản với HashMap). Sau đó viết 1 unit test cho method getTopStudents của Service.
  • Thực hành: Học viên tự refactor project ProductController của mình theo cùng cấu trúc.

Yêu cầu cấu trúc package

  • controller - chứa các REST controller.
  • service - chứa interface và implementation tầng nghiệp vụ.
  • repository - chứa interface và implementation tầng dữ liệu.
  • model (hoặc entity) - chứa các class POJO.

Bài tập

  • Hoàn thiện refactor project Product 3 lớp đầy đủ.
  • Viết tối thiểu 3 unit test cho ProductService: test khi tìm thấy sản phẩm, khi không tìm thấy, khi thêm mới hợp lệ.
  • Vẽ sơ đồ class diagram đơn giản (có thể vẽ tay rồi chụp ảnh) thể hiện quan hệ giữa 3 tầng.

4. Module 4: Spring Data JPA - Phần 1 (Cơ bản)

Mục tiêu cụ thể

  • Học viên hiểu được khái niệm ORM và vai trò của JPA/Hibernate.
  • Định nghĩa được Entity và mapping với bảng trong database.
  • Sử dụng JpaRepository để thực hiện CRUD mà không cần viết SQL.
  • Kết nối thành công ứng dụng Spring Boot với MySQL.

Nội dung lý thuyết

  • ORM là gì: Object-Relational Mapping, ánh xạ giữa class Java và bảng database, lý do dùng thay vì JDBC thuần.
  • JPA và Hibernate: JPA là chuẩn (specification), Hibernate là một implementation phổ biến, Spring Data JPA là lớp wrapper giúp dùng JPA dễ hơn.
  • Annotation entity cơ bản: @Entity, @Table(name = "..."), @Id, @GeneratedValue (chiến lược IDENTITY, AUTO), @Column với các thuộc tính nullable, length, unique.
  • Kiểu dữ liệu thường gặp: String, Integer/Long, Double/BigDecimal, LocalDate/LocalDateTime, Boolean, Enum (với @Enumerated).
  • JpaRepository: Kế thừa interface để có sẵn các method save, findAll, findById, deleteById, count...
  • Derived queries: Các method findByName, findByPriceGreaterThan, findByNameContaining... Spring tự sinh SQL từ tên method.
  • Cấu hình DataSource: spring.datasource.url, username, password, driver, spring.jpa.hibernate.ddl-auto (create/update/none) và spring.jpa.show-sql.

Demo và thực hành

  • Demo phần 1 (H2): Giảng viên thêm dependency Spring Data JPA và H2, tạo entity Product, tạo ProductRepository extends JpaRepository, refactor ProductService để dùng repository thật. Mở H2 console xem dữ liệu.
  • Demo phần 2 (MySQL): Chuyển từ H2 sang MySQL, đổi dependency, đổi cấu hình application.properties, tạo database trong MySQL Workbench, chạy lại ứng dụng.
  • Thực hành: Học viên áp dụng cùng quy trình cho project Student của mình, tạo entity Student và lưu/đọc dữ liệu thật từ MySQL.

Bài tập

  • Tạo thêm entity Course (id, ten, soTinChi, moTa) và CourseRepository, viết CRUD đầy đủ.
  • Viết các derived query: findByNameContaining (tìm theo tên có chứa từ khóa), findBySoTinChiGreaterThan (lọc theo số tín chỉ).
  • Insert sẵn 10 record mẫu vào database (có thể dùng file SQL data.sql trong resources hoặc CommandLineRunner).

5. Module 5: Spring Data JPA - Phần 2 (Quan hệ và Truy vấn nâng cao)

Mục tiêu cụ thể

  • Thiết lập được quan hệ OneToMany và ManyToOne giữa các entity.
  • Hiểu và phân biệt được fetch type LAZY và EAGER, biết khi nào dùng.
  • Viết được câu truy vấn JPQL bằng @Query khi derived query không đủ mạnh.
  • Áp dụng được phân trang (pagination) và sắp xếp (sorting) cho API list.

Nội dung lý thuyết

  • Các loại quan hệ: @OneToOne, @OneToMany, @ManyToOne, @ManyToMany - chỉ tập trung vào OneToMany và ManyToOne (chiếm 80% trường hợp thực tế).
  • Quan hệ 2 chiều và 1 chiều: Khái niệm owner side, mappedBy, JoinColumn. Khuyến nghị bắt đầu với quan hệ 1 chiều ManyToOne để đơn giản.
  • Cascade: CascadeType.ALL, PERSIST, REMOVE - khi nào nên dùng và khi nào không nên (rủi ro xóa dữ liệu nhầm).
  • Fetch type: LAZY (mặc định cho OneToMany - tải khi cần) và EAGER (mặc định cho ManyToOne - tải ngay). Cảnh báo về LazyInitializationException và vấn đề N+1 query.
  • JPQL với @Query: Cú pháp JPQL khác SQL, dùng tên class và field thay vì tên bảng và tên cột, ví dụ minh họa với SELECT, WHERE, JOIN.
  • Pagination và Sorting: Pageable, Page<T>, PageRequest.of(page, size, Sort.by(...)), trả về metadata totalElements, totalPages, content.

Demo và thực hành

  • Demo: Tạo thêm entity Category và thiết lập quan hệ ManyToOne từ Product sang Category. Viết API lấy danh sách Product theo Category. Sau đó viết API GET /api/products?page=0&size=10&sort=price,desc với phân trang.
  • Thực hành: Học viên thêm entity Lop (Class) vào project Student với quan hệ: một Lớp có nhiều Học viên (OneToMany từ Lop và ManyToOne từ Student).

Yêu cầu hands-on

  • API GET /api/lop/{id}/students - lấy danh sách Học viên thuộc một lớp.
  • API GET /api/students - hỗ trợ phân trang và sắp xếp theo điểm hoặc theo tên.
  • Viết @Query JPQL: tìm Học viên có điểm trung bình lớn hơn X và thuộc lớp có tên chứa Y.

Bài tập

  • Hoàn thiện đầy đủ các API quan hệ Lop - Student.
  • Viết @Query đếm số lượng Học viên theo từng lớp.
  • Đọc tài liệu về N+1 query problem và viết giải thích ngắn (200 từ) về cách phát hiện và xử lý.

6. Module 6: Validation và Exception Handling

Mục tiêu cụ thể

  • Học viên áp dụng được Bean Validation để kiểm tra dữ liệu đầu vào.
  • Bắt và xử lý lỗi tập trung bằng @ControllerAdvice.
  • Trả về response lỗi có cấu trúc rõ ràng và nhất quán.
  • Hiểu được sự khác biệt giữa @Valid và @Validated.

Nội dung lý thuyết

  • Vì sao cần validation: Không tin client, kiểm tra ngay tại lớp Controller giúp logic Service sạch hơn, tránh dữ liệu rác trong DB.
  • Bean Validation annotations: @NotNull, @NotBlank, @NotEmpty (phân biệt rõ), @Size, @Min, @Max, @Email, @Pattern, @Past, @Future.
  • Áp dụng validation: Đặt annotation trên field của DTO/Entity, dùng @Valid trên tham số controller, lỗi sẽ tự động ném MethodArgumentNotValidException.
  • Custom validator (giới thiệu): Khi nào cần, mô tả cách tạo annotation và class validator, chưa cần đi quá sâu.
  • Exception Handling tập trung: @ControllerAdvice và @ExceptionHandler, bắt từng loại Exception cụ thể, trả về ResponseEntity với status code phù hợp.
  • Cấu trúc response lỗi chuẩn: Bao gồm timestamp, status, error, message, path - chuẩn này giúp frontend dễ xử lý hơn.
  • @Valid và @Validated: @Valid là chuẩn JSR (dùng ở Controller cho request body), @Validated là của Spring (hỗ trợ group validation và validation ở tầng Service).

Demo và thực hành

  • Demo phần 1 (Validation): Giảng viên thêm validation vào CreateProductRequest DTO, gửi request thiếu trường hoặc sai định dạng từ Postman để xem lỗi mặc định.
  • Demo phần 2 (Exception Handling): Tạo class GlobalExceptionHandler với @ControllerAdvice, định nghĩa class ApiError, bắt MethodArgumentNotValidException và ResourceNotFoundException.
  • Thực hành: Học viên áp dụng cho project Student: thêm validation cho CreateStudentRequest và xây dựng GlobalExceptionHandler.

Yêu cầu hands-on

  • hoTen: bắt buộc, độ dài 2-100 ký tự.
  • email: bắt buộc, đúng định dạng email.
  • ngaySinh: bắt buộc, phải là ngày trong quá khứ.
  • diem: bắt buộc, từ 0 đến 10.
  • Tạo class StudentNotFoundException và xử lý trả về HTTP 404.
  • Response lỗi validation phải liệt kê được tất cả các trường lỗi với message tương ứng.

Bài tập

  • Bổ sung validation cho UpdateStudentRequest (có thể khác với Create).
  • Tạo custom annotation @ValidPhoneNumber cho số điện thoại Việt Nam (10 số, bắt đầu bằng 0).
  • Test ít nhất 5 trường hợp lỗi khác nhau qua Postman và lưu vào collection.

7. Module 7: DTO, Mapping, Logging và Configuration

Mục tiêu cụ thể

  • Hiểu được vì sao không nên trả Entity trực tiếp ra ngoài và biết cách tách DTO.
  • Mapping giữa Entity và DTO bằng tay và bằng MapStruct/ModelMapper.
  • Sử dụng SLF4J để ghi log đúng cách thay vì System.out.println.
  • Cấu hình ứng dụng linh hoạt qua application.yml và profiles dev/prod.

Nội dung lý thuyết

  • Vì sao cần DTO: Tránh lộ thông tin nhạy cảm (mật khẩu, internal field), tránh lazy loading exception khi serialize, có thể tùy chỉnh shape dữ liệu cho từng API, dễ versioning API về sau.
  • Phân loại DTO: Request DTO (CreateXxxRequest, UpdateXxxRequest) và Response DTO (XxxResponse, XxxDetailResponse).
  • Mapping bằng tay: Viết constructor hoặc static method toResponse() và toEntity() - dễ hiểu, dễ debug, phù hợp project nhỏ.
  • MapStruct: Compile-time, sinh code tự động, hiệu năng tốt - khuyến nghị cho production.
  • ModelMapper: Runtime, dùng reflection, dễ dùng nhưng chậm hơn - phù hợp prototype.
  • Logging với SLF4J: Tại sao không dùng System.out.println, các level (TRACE, DEBUG, INFO, WARN, ERROR), cách khai báo Logger với @Slf4j (Lombok) hoặc LoggerFactory.
  • Cấu hình logging: logging.level trong application.properties, ghi log ra file với logging.file.name.
  • application.yml và profiles: YML thay cho properties (rõ ràng hơn), profile dev/prod, cách kích hoạt profile khi chạy, @Value và @ConfigurationProperties để đọc cấu hình.

Demo và thực hành

  • Demo phần 1 (DTO và Mapping): Tách CreateProductRequest, UpdateProductRequest, ProductResponse cho project Product. Viết mapper bằng tay trước, sau đó chuyển sang MapStruct.
  • Demo phần 2 (Logging): Thêm log INFO ở các action quan trọng (tạo mới, cập nhật, xóa), log WARN khi không tìm thấy, log ERROR khi có exception. Cấu hình ghi log ra file.
  • Demo phần 3 (Config): Tách application-dev.yml và application-prod.yml với cấu hình DB khác nhau. Tạo class AppProperties đọc các giá trị tùy chỉnh.
  • Thực hành: Học viên áp dụng tất cả 3 phần trên cho project Student.

Bài tập

  • Tách DTO đầy đủ cho cả Student, Lop, Course.
  • Bổ sung log ở tất cả các action CRUD của ít nhất 2 entity.
  • Tạo profile prod với cấu hình MySQL khác và logging.level WARN.
  • Test chạy với profile dev và profile prod, chụp ảnh log để chứng minh.

8. Module 8: SPRING BOOT SECURITY

Mục tiêu cụ thể

  • Hiểu được vì sao không nên trả Entity trực tiếp ra ngoài và biết cách tách DTO.
  • Mapping giữa Entity và DTO bằng tay và bằng MapStruct/ModelMapper.
  • Sử dụng SLF4J để ghi log đúng cách thay vì System.out.println.
  • Cấu hình ứng dụng linh hoạt qua application.yml và profiles dev/prod.

Nội dung lý thuyết

  • Giới thiệu Web Security.
  • Các kỹ thuật trong Spring Security
  • Phân tích AUTHENTICATION & AUTHORIZATION
  • Sử dụng SECURITY CONFIGURATION

Demo và thực hành

  • Demo AUTHENTICATION CASE STUDY Login form với SPRING BEAN AUTHSERVICE
  • Demo CUSTOM LOGIN FORM theo cấu hình các thông số kỹ
    thuật theo yêu cầu của Spring Security
  • Thực hành: xây dựng CUSTOM LOGIN FORM sử dụng Spring Security

Bài tập

  • Cài đặt ứng dụng web với Spring Boot Security
  • Cấu hình bean UserDetailsService để quản lý nguồn dữ liệu người dùng trực tiếp với InMemoryUserDetailsManager.
  • Cấu hình bean SecurityFilterChain với 2 chế độ cho phép và yêu cầu đăng nhập
  • Sử dụng authentication với form đăng nhập cấu hình mặc định và tùy biến.

9. Module 9: Project và Deploy

Mục tiêu cụ thể

  • Hoàn thiện một mini project tích hợp toàn bộ kiến thức 7 Module trước.
  • Build được file JAR và chạy độc lập không cần IDE.
  • Đóng gói ứng dụng bằng Docker đơn giản (Dockerfile cơ bản).
  • Deploy ứng dụng lên môi trường thật (Render/Railway/VPS) với URL công khai.

Đề xuất Mini Project (chọn 1)

  • Đề 1 - Quản lý Thư viện: Sách, Tác giả, Thể loại, Phiếu mượn. Có CRUD, validation, phân trang, log, exception handling.
  • Đề 2 - Quản lý Học viên - Lớp - Khóa học: Mở rộng từ project các Module đã làm. Học viên có thể đăng ký nhiều khóa học, có điểm số.
  • Đề 3 - Blog cá nhân: Bài viết, Chuyên mục, Tag, Bình luận. Có API tìm kiếm theo tag, lọc theo chuyên mục.
  • Đề 4 - Quản lý sản phẩm cho cửa hàng nhỏ: Sản phẩm, Danh mục, Đơn hàng, Khách hàng. Có thống kê doanh thu cơ bản.

Yêu cầu chung của Mini Project

  • Có ít nhất 4 entity với quan hệ rõ ràng.
  • Đầy đủ CRUD cho mỗi entity chính.
  • Có validation và exception handling tập trung.
  • Có phân trang cho ít nhất 1 API list.
  • Tách DTO Request/Response.
  • Có log đầy đủ.
  • Có file README.md mô tả: tên dự án, công nghệ, cách chạy, danh sách API, screenshot.
  • Học trực tuyến

  • Học tại Hồ Chí Minh

  • Học tại Hà Nội


Các khóa học khác