hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
      • Spring Boot
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Lập trình Python
    • Git và Github
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
    • Mạng và truyền thông
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Spring Boot
Spring Boot bài 04: Kiến trúc Controller–Service–Repository và cấu hình profile
Java và Spring Boot – MVC và REST API

Spring Boot bài 04: Kiến trúc Controller–Service–Repository và cấu hình profile

  • 18-10-2026
  • Toanngo92
  • 0 Comments

Giáo trình Spring Boot MVC và REST API · Chương 2/12: Bean, kiến trúc và cấu hình · Bài 04/28 · Biên soạn tháng 10/2026.

← Bài 03 · Mục lục 12 chương · Bài 05 →

Mục lục

  • Mục tiêu bài học
  • Một yêu cầu không nên làm mọi việc trong Controller
  • Cấu hình thuộc về môi trường
  • Dùng profile MySQL
  • Theo dấu luồng dữ liệu
  • Lỗi thường gặp và lưu ý
  • Ghi nhớ
  • Tài liệu đối chiếu

Mục tiêu bài học

Chia trách nhiệm theo tầng, đọc cấu hình từ môi trường và dùng profile mà không đưa bí mật vào nguồn.

Một yêu cầu không nên làm mọi việc trong Controller

Controller nhận dữ liệu HTTP, gọi nghiệp vụ và quyết định trả template, redirect hay JSON. Service thực hiện quy tắc nghiệp vụ và xác định biên giao dịch. Repository truy xuất dữ liệu. Entity mô tả dữ liệu được quản lý bởi JPA; DTO mô tả dữ liệu ứng dụng muốn chuyển ra ngoài.

Trong HVC Academy, CourseWebController và CourseApiController cùng gọi CourseService. Nhờ vậy quy tắc kiểm tra danh mục tồn tại, sửa thông tin khóa học hay xóa dữ liệu không phải viết lại cho hai loại giao diện. Không có yêu cầu phải tạo interface cho mọi Service; thêm trừu tượng khi có nhu cầu thay thế thực sự, không chỉ để tăng số tệp.

Cấu hình thuộc về môi trường

Tên cơ sở dữ liệu, mật khẩu, địa chỉ dịch vụ ngoài và nơi lưu tệp có thể khác giữa máy học và máy triển khai. application.properties chứa cấu trúc và giá trị mặc định phù hợp cục bộ. Placeholder ${…} lấy giá trị môi trường; placeholder không có mặc định sẽ buộc môi trường cung cấp cấu hình đó.

AppSettings gom cấu hình hvc thành một record có kiểu cụ thể, thay vì rải nhiều chuỗi @Value trong mọi class. @ConfigurationProperties kết hợp @Validated giúp lỗi thiếu cấu hình xuất hiện ngay lúc khởi động. Đây cũng là lý do không nên xóa validation chỉ để ứng dụng chạy qua màn hình lỗi đầu tiên.

Tệp trong mã nguồn mẫu: src/main/java/com/hocvietcode/academy/AppSettings.java. Đoạn dưới được trích từ tệp này; xem bản tải về để có đủ import và phần còn lại.

package com.hocvietcode.academy;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
import jakarta.validation.constraints.*;
import java.nio.file.Path;
import java.net.URI;
@Validated @ConfigurationProperties(prefix="hvc")
public record AppSettings(@NotBlank @Size(min=12) String demoPassword,@NotNull Path uploadDir,@NotNull URI externalBaseUrl,boolean remindersEnabled,@NotBlank String allowedOrigin) {}

Dùng profile MySQL

application-mysql.properties chỉ ghi phần khác với cấu hình chung. Khi bật profile mysql, các thuộc tính trong đó được dùng để kết nối MySQL; những phần chung như kích thước upload vẫn được kế thừa. Profile không phải biện pháp giữ bí mật: một mật khẩu viết trực tiếp trong tệp profile vẫn là mật khẩu đã nằm trong nguồn.

Tệp trong mã nguồn mẫu: src/main/resources/application-mysql.properties. Đoạn dưới được trích từ tệp này; xem bản tải về để có đủ import và phần còn lại.

spring.datasource.url=${HVC_DB_URL}
spring.datasource.username=${HVC_DB_USER}
spring.datasource.password=${HVC_DB_PASSWORD}
spring.jpa.hibernate.ddl-auto=validate

Đặt SPRING_PROFILES_ACTIVE=mysql cùng HVC_DB_URL, HVC_DB_USER, HVC_DB_PASSWORD trước khi chạy. Bài 13 hướng dẫn chuẩn bị database và kiểm tra migration. Không bật mysql nếu chưa có máy chủ tương ứng. Cấu hình test trong src/test/resources chỉ dùng khi chạy test và không được đóng gói làm cấu hình runtime.

Theo dấu luồng dữ liệu

Ví dụ POST thêm khóa học đi từ CourseForm đã bind dữ liệu đến Controller kiểm tra validation, Service tìm Category, Repository lưu Course và cuối cùng trả DTO. Với MVC, Controller redirect về danh sách; với API, nó trả 201 cùng JSON. Tầng dưới không cần biết request đến từ HTML hay Postman.

Khi debug, đặt breakpoint ở đầu Controller và đầu Service để quan sát giá trị đã bind. Log nên ghi sự kiện, mã đối tượng và nguyên nhân có ích, tránh ghi mật khẩu, cookie hay toàn bộ nội dung tệp người dùng. Không cần bật SQL debug trong mọi môi trường chỉ để xác nhận một request đã chạy.

Lỗi thường gặp và lưu ý

  • Không trộn truy vấn SQL, xử lý HTTP và gửi email vào cùng một phương thức Controller.
  • Profile chỉ chọn cấu hình, không tự tạo MySQL hay cấp quyền cho tài khoản DB.

Ghi nhớ

Kiến trúc giúp hai giao diện dùng chung nghiệp vụ; cấu hình có kiểu và profile giúp cùng mã nguồn chạy ở nhiều môi trường.

Tài liệu đối chiếu

  • Externalized Configuration

← Bài 03 · Mục lục 12 chương · Bài 05 →

Bài viết liên quan:

Java và Spring Boot – MVC và REST API
Spring Boot bài 19: CSRF, CORS và gọi API có session đúng cách
Java và Spring Boot – MVC và REST API
Spring Boot bài 20: REST Controller, JSON và DTO cho API danh sách
Java và Spring Boot – MVC và REST API
Spring Boot bài 21: REST CRUD: POST, PUT, DELETE và mã trạng thái
Java và Spring Boot – MVC và REST API
Spring Boot bài 22: Validation API, ProblemDetail và hợp đồng lỗi
Java và Spring Boot – MVC và REST API
Spring Boot bài 23: Gọi dịch vụ HTTP bằng RestClient và đặt timeout
Java và Spring Boot – MVC và REST API
Spring Boot bài 08: Fragment, layout và tài nguyên CSS trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 24: Gửi email và lập lịch tác vụ trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 09: Binding biểu mẫu tạo và sửa khóa học
Java và Spring Boot – MVC và REST API
Spring Boot bài 25: Unit test Service với JUnit và Mockito
Java và Spring Boot – MVC và REST API
Spring Boot bài 10: Validation và BindingResult: báo lỗi ngay trên biểu mẫu
Java và Spring Boot – MVC và REST API
Spring Boot bài 26: Integration test MVC, API, database và Security
Java và Spring Boot – MVC và REST API
Spring Boot bài 11: Post/Redirect/Get, flash message và session

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 05: Đơn vị và kích thước: px, rem, %, min và max

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 02: Selector và class: chọn đúng phần tử cần sửa

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 01: Kết nối CSS với HTML và sửa quy tắc đầu tiên

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 20: Hoàn thiện website và sửa lỗi bằng DevTools

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 03: Vì sao CSS không có tác dụng? Cascade và specificity

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×