
Explore the course curriculum, plan your time, and gain hands-on experience building a complete Java backend stack—from design to deployment, including security, optimization, and testing.
Maxwell, an experienced software engineer and AWS-certified cloud practitioner, introduces his passion for accessible, practical teaching and promises step-by-step guidance to build real-world applications using professional development practices.
Prepare project for docker by creating a two-stage docker file that builds the jar with maven and runs it with java 17, and use docker-compose to run on port 8080.
Resolve the missing data source by converting the application.properties to application.yaml and restarting the container. The app starts successfully, with the PostgreSQL data source configuration deferred to the next module.
Register a pgAdmin server named bookhub and connect it to PostgreSQL using the service name in the same Docker network, then log in to verify the connection.
Open localhost:8080/swaggerui.html to test endpoints in Swagger UI, view available routes, and verify results in pgadmin. Gain a visual understanding of your code from the API to the database.
Replace the plain author string with a many-to-one relationship from book to author, establishing a one-to-many relation from author to books and letting JPA manage the foreign key.
Make the author–book relationship bidirectional in JPA by configuring one-to-many and many-to-one, reusing the existing author_id foreign key, and applying json managed and back references to prevent infinite recursion.
Visualize PostgreSQL tables with pgadmin after starting containers to verify JPA created correct tables and relationships automatically, then prepare to save and retrieve data via repositories.
Eliminate boilerplate data access by defining a repository interface that extends JPA repository, letting Spring Data JPA generate implementations and handle queries by method names with pagination and sorting.
Create a repository interface in Spring Data JPA to access a specific entity's database, marked as a Spring-managed component, and extend JPA repository for save, findById, findAll, and deleteById.
Use the @Query annotation to write custom JPQL queries in Spring Boot, map results to a list of book objects via named parameters, and keep queries independent of database tables.
Discover how pagination and sorting manage large datasets with spring data jpa by paging results using findAll with a pageable parameter, tested via swagger.
Apply separation of concerns by moving business logic from the controller to a dedicated service layer. Use a BookService interface and implementation to enable flexible, testable code.
Explore creating data with a Spring Boot service by defining a bookService interface, implementing bookServiceImplementation, and using bookRepositorySave to create or update records.
Implement read operations for books by adding findById and findAll in the book service, throwing a not-found exception when a single item is missing and returning an empty list.
Implement a safe delete by checking record existence before DeleteById, perform a permanent database removal, and consider soft delete as a safer alternative for real applications.
Expose the service layer through a clean book controller to implement full CRUD endpoints using post, get, put, and delete mappings, tested with Swagger and pgAdmin.
Understand how transactions ensure multiple database operations either all succeed or all fail, avoiding inconsistent states such as orphaned authors or books. Spring's @Transactional enforces atomicity in operations like createBook.
See a live rollback demonstration: transactional annotation prevents partial saves when saving author and title during a simulated failure, and shows how unchecked exceptions trigger rollback.
Explore isolation and propagation in java backend systems, covering dirty reads, non-repeatable reads, and phantom reads, and when to apply default or requires new propagation.
Learn how the Criteria API builds dynamic queries by adding filters only when values are provided. Start with an empty condition list and apply title or author filters as needed.
Learn the difference between authentication and authorization, and how Spring Security integrates with Spring Boot to secure Bookhub, from basics to in-memory testing and read-database-backed authentication.
Learn to spot a missing return statement in Spring Security configuration and fix it by returning the securityFilterChain using the HTTP.BUILD method, while reading error messages carefully and testing endpoints.
Test security with in-memory authentication in a Spring Boot app by configuring SecurityConfig, creating in-memory users with roles, and setting up a password encoder.
Hash passwords with a one-way algorithm using bcrypt via a password encoder, which adds a random salt so passwords yield different hashes; Spring Security compares hashes, never decrypts the password.
Build a public registration endpoint that hashes passwords with bigcrypt via the password encoder and saves new users to the database using the user entity and repository.
demonstrates how returning null instead of saving a user causes a 200 ok with no data, and shows the fix by calling userRepository.save to persist and return the saved entity.
Update the AuthorizeHttpRequest block in the security filter chain to use hasRole and hasAnyRole, restricting delete to admins while allowing read and create for both roles, with authentication required.
Enable method security to close gaps from URF-based security by applying pre-authorized annotations on deleteBook. HasRoleAdmin ensures only an authenticated admin can execute the method, adding a second protection layer.
Test authentication and authorization for secured APIs by differentiating 401 unauthorized from 403 forbidden, using Postman with Spring Security and admin vs user rules.
Create a JVTUtil class in the config package, as a Spring component, to generate tokens, extract the subject, and validate them using getSigningKey and application.yaml.
Update security config to use the JWT filter instead of basic auth, by injecting the JWT auth filter and refining the security and JWT filter chain methods.
Fix authentication before testing by setting the token timeout to 180,000 ms, disabling auto-configured basic auth, updating security for get-api-books and get-api-books-star, and adjusting post /api/books roles; then rebuild containers.
Test the complete jwt flow in postman by logging in to obtain a token and using it to access all books and a specific book by id with bearer token.
Remove basic auth and make the API stateless by configuring Spring Security to disable unused mechanisms, ensuring explicit, production-ready authentication with the JVT feature in Spring Boot.
Master professional Java backend development by building a complete real-world application from scratch. In this course, you will create BookHub, a production-ready backend system while learning the entire software development lifecycle (SDLC), from planning and design to testing, deployment, and maintenance.
You will start by understanding how professional software projects are planned and structured before setting up a Spring Boot application using clean architecture principles. As the course progresses, you will build REST APIs, integrate PostgreSQL with Spring Data JPA and Hibernate, and design efficient database relationships and queries.
You will learn how to secure your application using Spring Security, implement authentication and authorization, and manage user roles and permissions. To improve performance, you will integrate Redis caching and explore strategies for handling data efficiently. You will also implement asynchronous communication using Apache Kafka and understand event-driven architecture.
The course goes beyond traditional backend development by introducing Docker containerization, CI/CD concepts, automated testing with JUnit and Mockito, integration testing, debugging techniques, and monitoring strategies.
You will also explore modern distributed systems using Spring Cloud, including Config Server, Eureka Service Discovery, and API Gateway.
By the end of this course, you will have built a complete enterprise-style Java backend application and gained practical skills used by professional backend engineers to develop scalable, secure, maintainable, and production-ready applications.