Thẻ
#spring

Security là chuỗi filter đứng trước controller chứ không nằm trong nó, SecurityContext giữ Authentication trong ThreadLocal, phân biệt authentication 401 với authorization 403 — và bẫy hasRole so với hasAuthority.

Checklist bảy vấn đề theo thứ tự đáng sửa trước: N+1 query và ba cách chữa, projection, keyset pagination, index khóa ngoại, transaction gọn, batch ghi — và nguyên tắc đo trước, cache cuối cùng.

Soft delete với @SQLDelete và bốn cái bẫy của nó, optimistic locking bằng @Version chống lost update, và mapping enum — vì sao ORDINAL mặc định là cái bẫy nguy hiểm nhất của tầng entity.

Khai datasource thứ hai là tắt auto-config: ba bean phải tự dựng cho mỗi DB, @Primary và tách package entity, @Transactional gọi tên manager — cùng giới hạn không trải transaction qua hai database.

Đưa cache ra khỏi tiến trình: spring.cache.type redis và TTL, đổi serializer JDK sang JSON, RedisTemplate cho counter và rate limit, session store dùng chung — cùng bốn cái bẫy khi Redis chết.

Tốc độ lớn nhất là không truy vấn: cache abstraction với @Cacheable, key SpEL và hai luật sống còn, bộ đôi @CacheEvict/@CachePut giữ cache thật, TTL với Caffeine — và bốn cái bẫy caching.

Khi nào bỏ JPA viết SQL tay: JdbcTemplate với RowMapper và batchUpdate, JdbcClient mới của Boot 3.2 với tham số có tên và tự map record — cùng công thức trộn JPA + JDBC và bẫy flush.

Vì sao ddl-auto là thảm họa production, quy ước V__ và flyway_schema_history, ba quy tắc migration (bất biến, nhỏ, expand→contract) — và phân vai chuẩn với JPA.
