Java Backend Learning Roadmap
Java Backend Learning Roadmap
T
Novice to Production-Ready
elcome to the modern Java ecosystem. For decades, Java has been a titan in the
W
world of software development, powering large-scale enterprise systems, financial
applications, and big data platforms.1 Its reputation for stability, performance, and
cross-platform portability via the Java Virtual Machine (JVM) has made it an enduring
choice for building mission-critical software.1 While its history is long, the ecosystem
has evolved dramatically. The advent of modern frameworks and tools has made
developing with Java more productive, accessible, and powerful than ever before,
ensuring its continued relevance in the age of cloud computing and microservices.1
This guide is designed to be a comprehensive roadmap for anyone with a foundational
knowledge of Java syntax who wishes to master the art of modern backend
development.
efore writing the first line of code, a professional development environment must be
B
established. This setup is standard across the industry and will serve as the
foundation for all projects in this guide.
he JDK is the core software development kit required to compile and run Java
T
applications. It is crucial to use a modern, Long-Term Support (LTS) version of Java.
LTS versions receive security updates and bug fixes for many years, making them the
standard for production environments. The current LTS versions are 17 and 21. For
beginners, a distribution like BellSoft Liberica JDK is an excellent, free, and
well-supported choice.3
n IDE is a developer's most important tool. While several options exist,IntelliJ IDEA
A
is the de-facto standard for professional Java development, particularly within the
Spring ecosystem.1 Its deep integration with frameworks like Spring Boot, powerful
code completion, and robust debugging tools significantly accelerate the
development process. The free Community Edition is sufficient for this entire guide,
though the Ultimate Edition offers additional features for web and database
development.
Backend development often involves creating APIs that do not have a graphical user
interface. An API testing client is therefore an indispensable tool for interacting with
and testing the web services that will be built.Postmanis a popular and powerful
choice that allows developers to craft and send HTTP requests, inspect responses,
and organize tests into collections.5 It will be used extensively throughout the projects
in this guide.
he original Spring Framework is the bedrock of the entire ecosystem.8 At its heart, it
T
is a powerful but historically complex framework built around the principle of
I nversion of Control (IoC).8 It provides the core functionality that all other Spring
projects rely on, including a sophisticated container for managing application objects
(known as "Beans"), support for Aspect-Oriented Programming (AOP), and
foundational data access features.10
Spring MVC
pring MVC is a modulewithinthe larger Spring Framework, specifically designed for
S
building web applications.12 It implements the classic Model-View-Controller (MVC)
design pattern, providing the components necessary to handle HTTP requests,
process business logic, and render views. For backend developers, it is the foundation
for creating REST APIs.14
pring Boot is the most significant evolution in the Spring ecosystem and is the
S
standard for all new Spring applications. It is crucial to understand that Spring Boot is
nota replacement for the Spring Framework; it is an opinionatedextensiondesigned
to drastically simplify its use and get applications running with minimal effort.12 The
complexity of configuring the original Spring Framework was a significant barrier to
entry. Spring Boot was created to solve this problem through several key features:
● Auto-Configuration:This is the "magic" of Spring Boot. It intelligently examines
t he libraries (dependencies) present in a project and automatically configures the
necessary Spring Beans based on those dependencies.13 For example, if it detects
a web framework on the classpath, it automatically configures a web server and
the necessary components for Spring MVC.19 This eliminates thousands of lines of
manual XML or Java-based configuration that were previously required.20
Embedded Servers:Traditionally, Java web applications were packaged as WAR
●
(Web Application Archive) files and deployed to a separate, pre-installed
application server like Apache Tomcat. Spring Boot flips this model by bundling a
web server (Tomcat is the default) directly into the application's executable JAR
file.13 This means a complex web application can be run with a simple
java -jar command, with no external dependencies required.17
● Starter Dependencies:Spring Boot provides a curated set of "starters," which
are convenient dependency descriptors that can be added to a project's build
file.17 For example, including
spring-boot-starter-web not only adds Spring MVC but also includes a
compatible web server, JSON handling libraries, and other common web
development necessities.4 This solves the classic "dependency hell" problem by
providing a set of libraries that are guaranteed to be compatible with each other.
he existence of Spring Boot is a direct and successful response to the historical
T
complexity of Java enterprise development. It has lowered the barrier to entry so
dramatically that a beginner can now create and run a production-grade web service
in minutes, a task that once took hours or days of complex configuration. This
represents a fundamental shift in developer experience and is a primary reason for
Java's continued dominance in backend development.
o truly understand Spring, one must grasp its core philosophical principle: Inversion
T
of Control (IoC).8
● Inversion of Control (IoC):In a traditional program, your code is in control. It
reates the objects it needs, when it needs them (e.g., MyService service = new
c
MyService();). IoC inverts this relationship. The framework (the Spring IoC
container) is responsible for creating, configuring, and managing the lifecycle of
your application's objects (Beans). Your code simply declares what it needs, and
the framework provides it.8
Dependency Injection (DI):DI is the primarymechanismused to achieve IoC.15
●
Instead of an object creating its own dependencies, those dependencies are
"injected" into it by the framework. The most common and recommended form of
DI is constructor injection, where a class's dependencies are provided as
parameters to its constructor.26 This design leads to loosely coupled components,
as classes are not tied to specific implementations of their dependencies, which,
as will be seen in Module 5, is the key to effective testing.
efore creating a project, a developer must choose a build automation tool. These
B
tools are responsible for managing project dependencies, compiling source code,
running tests, and packaging the final application. In the Java world, two tools
dominate: Maven and Gradle.
● Maven:Apache Maven is the more established of the two. It operates on a strict
"convention over configuration" philosophy, meaning it expects projects to follow
standard directory structure and build process.27 Its configuration is defined in
a
an XML file named
pom.xml. While this XML can be verbose, it is also highly structured and
predictable.27 Maven uses a fixed, linear lifecycle composed of phases (e.g.,
validate, compile, test, package), and plugins are attached to these phases to
perform work.28
Gradle:Gradle is a more modern and flexible build tool. Its configuration is
●
defined using a concise Domain-Specific Language (DSL) in either the Groovy or
Kotlin programming language, which allows the build process itself to be treated
as code.27 Instead of a rigid lifecycle, Gradle models the build as a Directed
Acyclic Graph (DAG) of tasks.30 This model enables powerful performance
optimizations like incremental builds (only rebuilding what has changed) and a
build cache, which can make it significantly faster than Maven, especially for
large, multi-module projects.27
he choice between these tools is not merely technical but also philosophical. Maven
T
represents a structured, predictable path, enforcing conventions that are easy for a
team to follow. Gradle represents power and flexibility, trusting the developer to script
a highly customized and optimized build.
Configuration ML (pom.xml) -
X roovy/Kotlin DSL
G aven: XML is
M
Verbose, structured (build.gradle) - explicit and easier to
Concise, code-like grasp initially.
his first project walks through the creation of a simple web service from scratch,
T
demonstrating the power and simplicity of Spring Boot.
● Step 1: Spring Initializr:The journey begins at start.spring.io, a web-based tool
t hat generates a skeleton Spring Boot project.3 For this project, the following
options should be selected:
○ Project:Maven
○ Language:Java
○ Spring Boot: The latest stable version (e.g., 3.x.x)
○ Dependencies: Search for and add "Spring Web".
After clicking "Generate," a ZIP file containing the project template will be
downloaded.4
Step 2: Project Structure:Unzip the downloaded file and open the project folder
●
in IntelliJ IDEA. It is important to become familiar with the standard Maven project
structure:
○ src/main/java: Contains the Java source code for the application.
○ src/main/resources: Contains non-code resources, such as configuration files
(application.properties) and static assets.
○ src/test/java: Contains the source code for tests.
○ pom.xml: The Project Object Model file, which defines the project's
dependencies and build configuration for Maven.
● Step 3: The Main Application Class:Inside src/main/java, locate the main
pplication class (e.g., DemoApplication.java). This class contains the main
a
method that serves as the entry point for the application. It is annotated with
@SpringBootApplication. This single annotation is a convenience that combines
three other powerful annotations: @Configuration (tags the class as a source of
bean definitions), @EnableAutoConfiguration (triggers Spring Boot's
auto-configuration mechanism), and @ComponentScan (tells Spring to scan the
current package and its sub-packages for other components like controllers and
services).4
Step 4: Creating a REST Controller:To handle web requests, a controller is
●
needed. Create a new Java class named HelloController in the same package as
the main application class.
Java
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
publicclassHelloController {
@GetMapping("/hello")
publicStringsayHello(){
return"Hello, World!";
}
}
○ @RestController: This annotation marks the class as a controller where every
ethod returns a domain object instead of a view. It is shorthand for including
m
both @Controller and @ResponseBody.
○ @GetMapping("/hello"): This annotation maps HTTP GET requests for the
/hello path to the sayHello method.3
Step 5: Running the Application:The application can be started directly from
●
the IDE by running the main method, or from the command line by navigating to
the project's root directory and executing the Maven wrapper command: ./mvnw
spring-boot:run.19 The console will display logs, including lines indicating that the
embedded Apache Tomcat server has started on a default port, typically 8080.19
● Step 6: Verification:Open a web browser or Postman and make a GET request to
http://localhost:8080/hello. The response should be the string "Hello, World!",
confirming that the first backend service is successfully running.
Module 2: Building Web APIs - The Language of the Internet
ith a running web application, the next step is to make it useful by building
W
industry-standard REST APIs. This module covers the principles and practices of
creating APIs that allow different software systems to communicate over the web.
his combination of Spring Boot's @RestController and its seamless integration with
T
the Jackson library (for JSON conversion) creates a powerful abstraction layer. It
removes almost all of the low-level boilerplate associated with handling raw HTTP and
parsing JSON. This allows a developer to operate at a higher level of abstraction,
thinking in terms of Java objects and methods rather than the mechanics of the
transport protocol, which dramatically increases productivity and reduces the
potential for error.16
his project builds upon the "Hello, World" application by implementing a full set of
T
CRUD endpoints for a "Task" resource. To maintain focus on the API layer, the data will
be stored in a simple in-memory List or Map, meaning the data will be lost every time
the application restarts.
● Step 1: The Task Model:Create a simple POJO (Plain Old Java Object) named
Task.java. This class will represent the data structure for a single to-do item.
Java
publicclassTask {
privatelong id;
private String title;
private String description;
privateboolean completed;
● Step 2: The TaskController and In-Memory Store:Modify the controller from
Project 1 (or create a new TaskController.java) to manage a list of tasks.
ava
J
@RestController
@RequestMapping("/tasks")// Base path for all methods in this controller
publicclassTaskController {
privatefinal List<Task>
tasks =new ArrayList<>();
privatefinal AtomicLong counter =new AtomicLong();
his module marks a significant step forward, transforming the API from a temporary,
T
in-memory application into one that can store data permanently in a
professional-grade relational database.
pring Data JPA achieves its simplicity through a few core components and
S
conventions:
● @Entity:This JPA annotation is placed on a Java class to mark it as a database
ntity. Spring Data JPA and Hibernate will then know to map this class to a
e
corresponding table in the database.46 Other annotations like
@Id and @GeneratedValue are used to specify the primary key and its generation
strategy.48
JpaRepository:This is the central interface of Spring Data JPA. To create a data
●
access object (DAO), a developer simply defines a new Javainterfacethat
extends JpaRepository<YourEntity, YourIdType>. At runtime, Spring will
automatically detect this interface and generate a complete, concrete
implementation class that provides a full suite of standard CRUD methods, such
as save(), findById(), findAll(), and deleteById(), with no additional code
required.46 This powerful pattern of programming to an interface cleanly
separates the data access layer from the rest of the application, promoting loose
coupling and making the system far easier to test and maintain.
● Derived Queries:Perhaps the most powerful feature of Spring Data JPA is its
ability to automatically generate database queries directly from thenamesof
methods declared in a repository interface.51 The framework parses the method
name, looks for keywords like
FindBy, And, Or, and Containing, and constructs the appropriate JPQL (Java
Persistence Query Language) query. For example, a method signature like
List<Task> findByCompletedAndTitleContaining(boolean completed, String
keyword); will be automatically implemented by Spring Data to execute a query
that finds all tasks with a specific completion status whose titles contain a given
keyword. This eliminates the need to write most common queries by hand.
Project 3: Upgrading the To-Do List API with PostgreSQL
his project involves refactoring the To-Do List API from Module 2 to persist its data in
T
a PostgreSQL database.
● Step 1: Database Setup:First, a PostgreSQL database needs to be available.
his can be done by installing PostgreSQL locally or by running it in a Docker
T
container (as will be covered in Module 6). Using a database client like psql or a
graphical tool like DBeaver, create a new database (e.g., todo_db).50
Step 2: Add Dependencies:In the pom.xml file, two new dependencies are
●
required:
○ spring-boot-starter-data-jpa: This starter brings in Spring Data JPA,
Hibernate, and other necessary persistence libraries.46
○ postgresql: This is the JDBC driver that allows the Java application to
communicate with a PostgreSQL database.53
ML
X
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
○ The datasource properties define the connection URL, username, and
assword.48
p
○ spring.jpa.hibernate.ddl-auto=update: This is a very useful development-time
property. It instructs Hibernate to compare the defined @Entity classes with
the database schema on startup and automatically add any missing tables or
columns. While extremely convenient for development, it can be destructive
and should be used with caution or replaced with a more robust database
migration tool like Flyway in production environments.50
○ spring.jpa.show-sql=true: This prints the SQL queries generated by Hibernate
to the console, which is invaluable for debugging.
Step 4: Refactor the Task Model:The Task POJO must be converted into a JPA
●
entity by adding the appropriate annotations.
Java
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
publicclassTask {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String description;
privateboolean completed;
○ @Entity: Marks this class as a JPA entity, mapped to a table named task by
efault.47
d
○ @Id: Designates the id field as the primary key.
○ @GeneratedValue: Configures the primary key generation strategy. IDENTITY
delegates the key generation to the database's auto-increment column
feature.48
Step 5: Create TaskRepository:Create a new Java interface named
●
TaskRepository.java. This interface will be the heart of the data access layer.
Java
import org.springframework.data.jpa.repository.JpaRepository;
publicinterfaceTaskRepositoryextendsJpaRepository<Task, Long>{
// No methods needed here for basic CRUD!
}
publicList<Task>findAllTasks(){
return taskRepository.findAll();
}
publicTasksaveTask(Task task){
return taskRepository.save(task);
}
//... other service methods for get by ID, update, delete
}
○ Refactor the TaskController to remove the in-memory list and instead call the
new TaskService.
ava
J
@RestController
@RequestMapping("/tasks")
publicclassTaskController {
privatefinal TaskService taskService;
@Autowired
publicTaskController(TaskService taskService) {
this.taskService = taskService;
}
@GetMapping
publicList<Task>getAllTasks(){
return taskService.findAllTasks();
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
publicTaskcreateTask(@RequestBodyTask task){
return taskService.saveTask(task);
}
//... other controller methods
}
ecurity is a broad field, but for a web application, it primarily revolves around two
S
fundamental concepts:
● Authentication (AuthN):This is the process of verifying a user's identity. It
nswers the question, "Who are you?" This is typically achieved by asking for
a
credentials, like a username and password, and checking them against a trusted
source (e.g., a database).55
Authorization (AuthZ):This is the process of determining if an authenticated
●
user has permission to perform a specific action or access a particular resource.
It answers the question, "What are you allowed to do?" This is usually managed
through roles (e.g., USER, ADMIN) or fine-grained permissions.55
Spring Security
owever, not all hashing functions are equal. Fast algorithms like MD5 or SHA-256 are
H
unsuitable for passwords because they are vulnerable to brute-force and "rainbow
t able" attacks. Spring Security promotes the use of slow,adaptive hashing
algorithms, withBCryptbeing the most common and recommended choice.59 BCrypt
is deliberately computationally intensive, making it expensive for an attacker to try
many password guesses. Furthermore, it automatically incorporates a random "salt"
into each hash. This means that even if two users have the same password, their
stored hashes will be completely different, rendering pre-computed rainbow tables
useless.60 In a Spring application, the
SON Web Tokens (JWTs)are the modern solution for stateless authentication in
J
REST APIs and microservices.7 A JWT is a compact, self-contained token that securely
transmits information between parties as a JSON object. The move from stateful
session IDs to stateless JWTs was a necessary evolution driven by the architectural
shift to distributed systems. A JWT can be passed between different microservices,
and each service can independently verify its authenticity without needing to contact
a central session store, which directly supports the scalability and resilience goals of
modern backends.
his project integrates Spring Security and JWTs into the To-Do List API to protect its
T
endpoints.
● Step 1: Add Dependencies:Open the pom.xml and add the necessary
dependencies.
ML
X
<dependency>
<groupId>org.springframework.boot</groupId>
artifactId>spring-boot-starter-security</artifactId>
<
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
version>0.11.5</version>
<
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
/dependency>
<
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
scope>runtime</scope>
<
</dependency>
@Override
publicUserDetailsloadUserByUsername(String username)throws
UsernameNotFoundException{
return userRepository.findByUsername(username)
.map(SecurityUser::new)// Convert our User to Spring Security's UserDetails
.orElseThrow(() ->new UsernameNotFoundException("Username not found: " +
username));
}
}
he service fetches the custom User entity from the database and maps it to a
T
UserDetails object that Spring Security can understand.67
Step 4: Create Authentication Endpoints:A new AuthController is needed for
●
public-facing registration and login endpoints.
○ POST /auth/register: This endpoint will accept a new user's details, use the
BCryptPasswordEncoder to hash the password, and save the new User entity
to the database.
○ POST /auth/login: This endpoint will accept a username and password. It will
use Spring Security's AuthenticationManager to verify the credentials. If
s uccessful, it will generate a JWT containing the user's name and roles and
return it to the client.7
Step 5: Implement the JWT Authentication Filter:This is the core of the JWT
●
mechanism. A custom filter is created that executes for every request.
ava
J
@Component
publicclassJwtAuthenticationFilterextendsOncePerRequestFilter {
//... inject JWT service and UserDetailsService...
@Override
protectedvoiddoFilterInternal(...) {
final String authHeader = request.getHeader("Authorization");
if (authHeader ==null ||!authHeader.startsWith("Bearer ")) {
filterChain.doFilter(request, response);
return;
}
final String jwt = authHeader.substring(7);
final String username = jwtService.extractUsername(jwt);
his filter intercepts the request, looks for the Authorization: Bearer <token>
T
header, validates the token, and if valid, sets the authenticated user in the
SecurityContextHolder. This tells the rest of the application that the current
request is authenticated.7
Step 6: Configure the SecurityFilterChain:The modern way to configure Spring
●
Security (since Spring Boot 3) is by defining a SecurityFilterChain bean.
ava
J
@Configuration
@EnableWebSecurity
publicclassSecurityConfig {
//... inject JwtAuthenticationFilter and JpaUserDetailsService...
@Bean
publicSecurityFilterChainsecurityFilterChain(HttpSecurity http)throwsException{
http
.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(auth -> auth
.requestMatchers("/auth/**").permitAll()// Allow public access to auth endpoints
.anyRequest().authenticated()// Secure all other endpoints
)
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authenticationProvider(authenticationProvider())
.addFilterBefore(jwtAuthFilter,
UsernamePasswordAuthenticationFilter.class);
return http.build();
}
//... define beans for AuthenticationProvider, AuthenticationManager, and PasswordEncoder...
}
his configuration disables CSRF (not needed for stateless APIs), sets the session
T
policy to STATELESS, defines which URL paths are public and which are
protected, and crucially, inserts our custom JwtAuthenticationFilter into the
security filter chain.7
Step 7: Tying Tasks to Users:Finally, modify the Task entity to have a
●
@ManyToOne relationship with the User entity. The TaskService methods will be
updated to associate new tasks with the currently authenticated user (retrieved
from the SecurityContextHolder) and to only fetch tasks that belong to that user.
This enforces data ownership and authorization.
This guide focuses on the two foundational layers: unit and integration tests.
his project involves adding a comprehensive set of unit and integration tests for the
T
secured To-Do List API.
● Step 1: Unit Testing the Service Layer:The goal here is to test the business
logic in TaskService in complete isolation from the database.
○ The test class will be annotated with @ExtendWith(MockitoExtension.class) to
enable Mockito's features.70
○ Inside the test class, the TaskRepository dependency will be mocked using
the @Mock annotation. The TaskService itself will be instantiated with
@InjectMocks, which tells Mockito to inject any fields annotated with @Mock
into it.72
○ For each test case, the behavior of the mocked repository will be defined
using Mockito.when(...).thenReturn(...). For example:
when(taskRepository.findAll()).thenReturn(List.of(new Task()));. This tells the
mock that when its findAll method is called, it should return a specific list of
tasks.
○ The TaskService method is then called, and its result is verified using JUnit's
ssertion methods, like Assertions.assertEquals(...), to ensure it behaved
a
correctly given the controlled input from the mock.
Step 2: Testing the Web Layer (@WebMvcTest):This tests that the
●
TaskController is correctly configured to handle HTTP requests, serialize JSON,
and interact with the service layer, without needing a real database or a running
web server.
○ The test class will be annotated with @WebMvcTest(TaskController.class). This
slice annotation tells Spring Boot to load only the web-layer components (like
controllers and JSON converters) and to auto-configure a MockMvc object.72
○ Since this is a slice test, the real TaskService is not part of the context. Its
dependency must be provided as a mock using the @MockBean annotation.
This adds a Mockito mock of the service to the application context.72
○ The MockMvc object is then used to perform simulated HTTP requests and
make assertions on the response. For example:
ava
J
@Autowired
private MockMvc mockMvc;
@MockBean
private TaskService taskService;
@Test
voidshouldReturnListOfTasks()throwsException{
when(taskService.findAllTasks()).thenReturn(List.of(new Task()));
mockMvc.perform(get("/tasks"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.title").value("Sample Task"));
}
his test mocks the service layer, performs a fake GET request to /tasks, and
T
asserts that the HTTP status is 200 OK and that the JSON response has the
expected structure and content.19
Step 3: Testing the Data Layer (@DataJpaTest):This tests the persistence
●
layer, ensuring that JPA entity mappings are correct and that repository queries
work as expected.
○ The test class is annotated with @DataJpaTest. This slice annotation disables
full auto-configuration and applies only the configuration relevant to JPA
tests. By default, it configures an in-memory H2 database and rolls back
transactions after each test, ensuring tests are isolated from each other and
f rom the real PostgreSQL database.72
The real TaskRepository can be autowired directly into the test.
○
○ The test will then use the repository to perform actual database operations
(e.g., save a Task entity) and then use other repository methods (e.g.,
findById) to retrieve it and assert that the data was persisted and retrieved
correctly. This provides high confidence that the database layer is functioning
properly.
his final instructional module focuses on packaging and running the application in a
T
portable, consistent, and cloud-ready manner using Docker. Containerization is a
foundational skill for modern software deployment.
The Dockerfile
Dockerfile is a text file that contains a set of instructions for building a Docker
A
image.82 For optimal results, a
ulti-stage buildis a critical best practice. This technique separates the build-time
m
environment (which needs tools like the full JDK and Maven) from the final run-time
environment (which only needs the JRE), resulting in a much smaller, more secure,
and faster-to-deploy production image.
A professional multi-stage Dockerfile for a Spring Boot application looks like this:
Code snippet
● Stage 1 (builder):Starts from a base image that contains Maven and the JDK. It
opies the project source code and uses Maven to build the executable JAR file.79
c
Stage 2 (Final Image):Starts from a new, minimal base image that only contains
●
the Java Runtime Environment (jre-slim). It then copiesonlythe compiled JAR file
from the builder stage into the final image.80
● ENTRYPOINT: Specifies the command that will be executed when a container is
started from this image.83
Docker Compose
his project takes the completed application and packages it for deployment using
T
Docker and Docker Compose.
● Step 1: Create the Dockerfile:Add the multi-stage Dockerfile described above
t o the root directory of the Spring Boot project.
Step 2: Build the Docker Image:From the project's root directory, run the
●
docker build command to create the image.
Bash
docker build -t my-todo-app:1.0.
his command tells Docker to build an image from the Dockerfile in the current
T
directory (.) and tag it (-t) with the name my-todo-app and version 1.0.
Step 3: Create docker-compose.yml:In the same root directory, create a
●
docker-compose.yml file to define the complete application stack.
YAML
v ersion:'3.8'
services:
app:
build:.
image:my-todo-app:1.0
ports:
-"8080:8080"
environment:
-SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/todo_db
-SPRING_DATASOURCE_USERNAME=postgres
-SPRING_DATASOURCE_PASSWORD=password
depends_on:
-db
db:
image:postgres:15-alpine
ports:
-"5432:5432"
environment:
-POSTGRES_DB=todo_db
-POSTGRES_USER=postgres
-POSTGRES_PASSWORD=password
volumes:
-postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
his command will read the docker-compose.yml file, build the app image if it
T
doesn't exist, and start both the PostgreSQL and Spring Boot application
containers.
Step 5: Verification:Once both services are running, the entire application is
●
accessible at http://localhost:8080. Use Postman to create and retrieve tasks. The
application is now fully containerized, with both the backend and the database
running in isolated, portable Docker containers.
his final section provides the architectural blueprint for a significant capstone
T
project. This project is designed to be built independently, allowing the developer to
synthesize and apply all the skills acquired throughout the previous modules. It is a
substantial undertaking that, when completed, will serve as a powerful centerpiece for
a professional portfolio.
Project Vision
The project is to build the backend for a modern e-commerce application. It will be
rchitected as a"modular monolith."This is a pragmatic and highly recommended
a
approach for new applications. It involves building a single, deployable application (a
monolith) but with its internal code structure organized into clean, well-defined, and
loosely coupled modules (e.g., User service, Product service, Order service).
he e-commerce platform will be broken down into several logical services, each
T
mapping to the concepts learned in the preceding modules.
● User & Authentication Service (Module 4):
○ Functionality:Handles all user-related concerns.
○ Endpoints:
■ POST /auth/register: Allows a new user to create an account.
■ POST /auth/login: Authenticates a user and returns a JWT.
■ GET /users/me: A protected endpoint for a user to retrieve their own
rofile information.
p
○ Security:Implements role-based access control (RBAC) with at least two
roles: USER and ADMIN.
Product Catalog Service (Modules 2, 3):
●
○ Functionality:Manages the inventory of products.
○ Endpoints:
■ GET /products: A public endpoint to list all available products, with
support for pagination.
■ GET /products/{id}: A public endpoint to view the details of a single
product.
■ POST /products, PUT /products/{id}, DELETE /products/{id}: Admin-only
endpoints, protected by Spring Security, for creating, updating, and
eleting products.
d
Shopping Cart Service (Modules 2, 3, 4):
●
○ Functionality:Allows authenticated users to manage a persistent shopping
cart.
○ Endpoints:
■ GET /cart: Retrieves the contents of the current authenticated user's cart.
■ POST /cart/items: Adds a product to the user's cart.
■ PUT /cart/items/{productId}: Updates the quantity of a product in the cart.
■ DELETE /cart/items/{productId}: Removes a product from the cart.
○ Persistence:The cart's state will be stored in the database and linked to the
user's ID.
● Order Service (Modules 2, 3, 4):
○ Functionality:Handles the checkout process.
○ Endpoints:
■ POST /orders: A highly transactional endpoint that converts a user's
current shopping cart into a permanent Order record, clears the cart, and
returns the created order.
■ GET /orders: Allows a user to view their own order history.
■ GET /orders/{id}: Allows a user to view the details of a specific past order.
o make the project even more industry-relevant, this section provides guidance on
T
how to integrate more advanced technologies, demonstrating a path for future
learning.
● Asynchronous Notifications with RabbitMQ:
○ Problem:When a user places an order, they shouldn't have to wait for the
s ystem to send a confirmation email. This synchronous process makes the API
call slow and brittle (if the email service is down, the order might fail).
Solution:Decouple the systems using a message queue.20 When an order is
○
successfully created in the
OrderService, instead of sending the email directly, it will publish an
OrderCreatedEvent message to aRabbitMQexchange.84 A separate,
independent
NotificationService will act as a consumer, listening to the RabbitMQ queue.
When it receives an OrderCreatedEvent message, it will handle the logic of
s ending the confirmation email. This makes the checkout process faster and
more resilient.86
Enhanced Search with Elasticsearch:
●
○ Problem:Searching for products using standard SQL LIKE queries is
inefficient and provides a poor user experience for full-text search.
○ Solution:Integrate a dedicated search engine likeElasticsearch.2 When a
product is created or updated in the
ProductService, an event can be published (e.g., via RabbitMQ) to a separate
indexing process. This process takes the product data and indexes it in
Elasticsearch. The application's main search endpoint (GET
/products/search?q=...) will then query the highly optimized Elasticsearch
index instead of the primary SQL database, providing fast, relevant, and
feature-rich search results.
he core of the database would consist of several JPA entities with defined
T
relationships:
● User (id, username, password, role)
● Product (id, name, description, price, stockQuantity)
● Cart (id, user) -> @OneToOne relationship with User
● CartItem (id, cart, product, quantity) -> @ManyToOne relationships with Cart and
roduct
P
Order (id, user, orderDate, status, totalAmount) -> @ManyToOne relationship with
●
User
● OrderItem (id, order, product, quantity, price) -> @ManyToOne relationships with
Order and Product
his guide has charted a comprehensive path from foundational Java knowledge to
T
the ability to design, build, test, and containerize a sophisticated, secure, and
data-driven backend application. The journey began with the core principles of the
Spring ecosystem, progressed through the creation of industry-standard REST APIs,
delved into data persistence with Spring Data JPA, secured the application with
Spring Security and JWTs, established a professional testing discipline with JUnit and
Mockito, and concluded with modern deployment practices using Docker.
he completion of the modular projects and the capstone blueprint signifies the
T
acquisition of a robust and highly sought-after skill set. However, the journey of a
software developer is one of continuous learning. This solid foundation is the
launching point for exploring more advanced and specialized topics that define
senior-level engineering.
Works cited
1. Learn to become a modern Java developer - Developer Roadmaps, accessed
ugust 12, 2025,https://roadmap.sh/java
A
2. Top 10 Technologies to Learn for a Java Backend Developer - Sharpener Tech,
accessed August 12, 2025,
https://www.sharpener.tech/blog/technologies-to-learn-for-a-java-backend-dev
eloper/
3. Quickstart - Spring, accessed August 12, 2025,https://spring.io/quickstart/
4. Spring Boot - Getting Started - GeeksforGeeks, accessed August 12, 2025,
https://www.geeksforgeeks.org/advance-java/spring-boot-getting-started/
5. What Is a REST API? Examples, Uses & Challenges - Postman Blog, accessed
August 12, 2025,https://blog.postman.com/rest-api-examples/
6. Spring Boot Data Access with Spring Data JPA and MySQL | by Khair Muhammad |
Medium, accessed August 12, 2025,
https://medium.com/@khairmuhammadmemon/spring-boot-data-access-with-s
pring-data-jpa-and-mysql-afe90e28b05d
7. Spring Boot 3.0 - JWT Authentication with Spring Security using MySQL Database
- GeeksforGeeks, accessed August 12, 2025,
https://www.geeksforgeeks.org/springboot/spring-boot-3-0-jwt-authentication-
with-spring-security-using-mysql-database/
8. Spring Framework - Wikipedia, accessed August 12, 2025,
https://en.wikipedia.org/wiki/Spring_Framework
9. Spring Framework Reference Documentation, accessed August 12, 2025,
https://devdoc.net/javaweb/spring/Spring-4.2.3/spring-framework-reference/html
single/
10.Spring Framework Documentation - VMware, accessed August 12, 2025,
https://docs.spring.vmware.com/spring-framework/reference/index.html
11. Spring Framework Documentation :: Spring Framework, accessed August 12,
2025,https://docs.spring.io/spring-framework/reference/index.html
12.Can someone explain to me the difference between Spring, Spring MVC and
Spring Boot? : r/javahelp - Reddit, accessed August 12, 2025,
https://www.reddit.com/r/javahelp/comments/py3m2r/can_someone_explain_to_
me_the_difference_between/
13.Spring vs Spring Boot vs Spring MVC - GeeksforGeeks, accessed August 12,
2025,https://www.geeksforgeeks.org/spring-vs-spring-boot-vs-spring-mvc/
14.Difference between Spring MVC and Spring Boot [closed] - Stack Overflow,
accessed August 12, 2025,
https://stackoverflow.com/questions/32922914/difference-between-spring-mvc-
and-spring-boot
15.What is Java Spring Boot? - Microsoft Azure, accessed August 12, 2025,
https://azure.microsoft.com/en-us/resources/cloud-computing-dictionary/what-is
-java-spring-boot
16.Spring Boot (Baeldung Perspective) | by yugal-nandurkar | Medium, accessed
August 12, 2025,
https://medium.com/@yugalnandurkar5/spring-boot-baeldung-perspective-d2b8
5c481909
17.What Is Java Spring Boot? - IBM, accessed August 12, 2025,
ttps://www.ibm.com/think/topics/java-spring-boot
h
18.Spring Boot Tutorial - GeeksforGeeks, accessed August 12, 2025,
https://www.geeksforgeeks.org/advance-java/spring-boot/
19.Getting Started | Building an Application with Spring Boot, accessed August 12,
2025,https://spring.io/guides/gs/spring-boot/
20.Top 16 Technologies for Java Backend Developers - Solvedex, accessed August
12, 2025,https://solvedex.com/blog/java-backend-developers/
21.Spring Boot Tutorial for Beginners: Step-by-Step Guide | Coding Shuttle,
accessed August 12, 2025,
https://www.codingshuttle.com/spring-boot-handbook/spring-boot-tutorial-a-co
mprehensive-guide-for-beginners
22.Spring Boot, accessed August 12, 2025,https://spring.io/projects/spring-boot/
23.Spring Boot for Beginners - Daily.dev, accessed August 12, 2025,
https://daily.dev/blog/spring-boot-for-beginners
24.Understanding Spring Framework: Core Philosophy, IoC/DI, and AOP - DEV
Community, accessed August 12, 2025,
https://dev.to/kouta222/understanding-spring-framework-core-philosophy-iocdi-
and-aop-56fp
25.Getting Started with Spring Boot: A Beginner's Guide - DEV Community,
accessed August 12, 2025,
https://dev.to/nilan/getting-started-with-spring-boot-a-beginners-guide-3e5h
26.Spring Boot Tutorial for Beginners [2025] - YouTube, accessed August 12, 2025,
https://www.youtube.com/watch?v=gJrjgg1KVL4
27.Maven vs. Gradle: A Detailed Comparison of Pros and Cons with Examples -
Medium, accessed August 12, 2025,
https://medium.com/@ahmettemelkundupoglu/maven-vs-gradle-a-detailed-com
parison-of-pros-and-cons-with-examples-594ba33cc57f
28.stackify.com, accessed August 12, 2025,
https://stackify.com/gradle-vs-maven/#:~:text=Gradle%20and%20Maven%20fun
damentally%20differ,%2C%20are%20the%20%E2%80%9Cworkhorses.%E2%80
%9D
29.Gradle vs Maven for Java Developers - Medium, accessed August 12, 2025,
https://medium.com/@AlexanderObregon/gradle-vs-maven-for-java-developers-
145f4e5d1603
30.Gradle vs. Maven: Performance, Compatibility, Speed, & Builds - Stackify,
accessed August 12, 2025,https://stackify.com/gradle-vs-maven/
31.Gradle and Maven Comparison, accessed August 12, 2025,
https://gradle.org/maven-and-gradle/
32.Maven vs Gradle: Which one to pick? | Build Tools | Geekific - YouTube, accessed
August 12, 2025,https://www.youtube.com/watch?v=L2S41-pgG7I
33.Difference between Gradle and Maven 2025 - Aalpha Information Systems,
accessed August 12, 2025,
https://www.aalpha.net/articles/gradle-vs-maven-which-is-better/
34.Maven vs Gradle, which is right for you? - Buildkite, accessed August 12, 2025,
ttps://buildkite.com/resources/comparison/maven-vs-gradle/
h
35.What Is a REST API? - F5, accessed August 12, 2025,
https://www.f5.com/glossary/rest-api
36.What Is a REST API (RESTful API)? - IBM, accessed August 12, 2025,
https://www.ibm.com/think/topics/rest-apis
37.What is a RESTful API? Definition of Web Service Interface - AWS, accessed
August 12, 2025,https://aws.amazon.com/what-is/restful-api/
38.What is a REST API? - Red Hat, accessed August 12, 2025,
https://www.redhat.com/en/topics/api/what-is-a-rest-api
39.Hibernate Tutorial - GeeksforGeeks, accessed August 12, 2025,
https://www.geeksforgeeks.org/java/hibernate-tutorial/
40.Hibernate Tutorial - Tutorialspoint, accessed August 12, 2025,
https://www.tutorialspoint.com/hibernate/index.htm
41.Comprehensive Guide to Spring Data JPA with Example Codes - Medium,
accessed August 12, 2025,
https://medium.com/@vijayskr/comprehensive-guide-to-spring-data-jpa-with-ex
ample-codes-8db0c9683b0f
42.Hibernate Tutorials - HowToDoInJava, accessed August 12, 2025,
https://howtodoinjava.com/hibernate/hibernate-tutorials/
43.Hibernate Tutorial For Beginners - DigitalOcean, accessed August 12, 2025,
https://www.digitalocean.com/community/tutorials/hibernate-tutorial-for-beginn
ers
44.What is Spring Data JPA? - GeeksforGeeks, accessed August 12, 2025,
https://www.geeksforgeeks.org/springboot/what-is-spring-data-jpa/
45.Spring Data JPA, accessed August 12, 2025,
https://spring.io/projects/spring-data-jpa/
46.Getting Started | Accessing Data with JPA - Spring, accessed August 12, 2025,
https://spring.io/guides/gs/accessing-data-jpa/
47.Spring Boot with PostgreSQL: A Step-by-Step Guide | by Pabitra Priyadarshini
Jena, accessed August 12, 2025,
https://talesofdancingcurls.medium.com/spring-boot-with-postgresql-a-step-by
-step-guide-c451848f0184
48.JPA with Spring Boot: A Comprehensive Guide with Examples - Medium,
accessed August 12, 2025,
https://medium.com/@bshiramagond/jpa-with-spring-boot-a-comprehensive-gu
ide-with-examples-e07da6f3d385
49.Spring Boot - Spring Data JPA - GeeksforGeeks, accessed August 12, 2025,
https://www.geeksforgeeks.org/java/spring-boot-spring-data-jpa/
50.Using Postgres Effectively in Spring Boot Applications - HackerNoon, accessed
August 12, 2025,
https://hackernoon.com/using-postgres-effectively-in-spring-boot-applications
51.Spring Data JPA Tutorial - Petri Kainulainen, accessed August 12, 2025,
https://www.petrikainulainen.net/spring-data-jpa-tutorial/
52.Introduction to Spring Data JPA - Baeldung, accessed August 12, 2025,
https://www.baeldung.com/the-persistence-layer-with-spring-data-jpa
53.Spring Boot Integration With PostgreSQL as a Maven Project - GeeksforGeeks,
ccessed August 12, 2025,
a
https://www.geeksforgeeks.org/springboot/spring-boot-integration-with-postgre
sql-as-a-maven-project/
54.Spring Boot Connect to PostgreSQL Database Examples - CodeJava.net,
accessed August 12, 2025,
https://www.codejava.net/frameworks/spring-boot/connect-to-postgresql-datab
ase-examples
55.Spring Security Tutorial - GeeksforGeeks, accessed August 12, 2025,
https://www.geeksforgeeks.org/advance-java/spring-security-tutorial/
56.Spring Security Tutorial - Tutorialspoint, accessed August 12, 2025,
https://www.tutorialspoint.com/spring_security/index.htm
57.Getting Started | Securing a Web Application - Spring, accessed August 12, 2025,
https://spring.io/guides/gs/securing-web/
58.Spring Security - Implementation of BCryptPasswordEncoder - GeeksforGeeks,
accessed August 12, 2025,
https://www.geeksforgeeks.org/advance-java/spring-security-implementation-of
-bcryptpasswordencoder/
59.Password Storage :: Spring Security, accessed August 12, 2025,
https://docs.spring.io/spring-security/reference/features/authentication/password
-storage.html
60.BCrypt (spring-security-docs 6.5.2 API), accessed August 12, 2025,
https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/s
ecurity/crypto/bcrypt/BCrypt.html
61.Registration with Spring Security – Password Encoding - Baeldung, accessed
August 12, 2025,
https://www.baeldung.com/spring-security-registration-password-encoding-bcr
ypt
62.Password hashing using BCrypt in spring security. (PART-8) | by Tharushka
Heshan, accessed August 12, 2025,
https://tharushkaheshan.medium.com/password-hashing-using-bcrypt-in-spring
-security-part-8-d867a83b8695
63.Spring Security with JWT - Tutorialspoint, accessed August 12, 2025,
https://www.tutorialspoint.com/spring_security/spring_security_with_ jwt.htm
64.Easy JWT Authentication & Authorization with Spring Security | Step-by-Step
Guide, accessed August 12, 2025,
https://www.youtube.com/watch?v=RnZmeczS_DI
65.Implementing JWT Authentication in a Simple Spring Boot Application with Java -
Medium, accessed August 12, 2025,
https://medium.com/@victoronu/implementing-jwt-authentication-in-a-simple-s
pring-boot-application-with-java-b3135dbdb17b
66.Spring Boot Security Authentication with JPA, Hibernate and MySQL -
CodeJava.net, accessed August 12, 2025,
https://www.codejava.net/frameworks/spring-boot/spring-boot-security-authenti
cation-with-jpa-hibernate-and-mysql
67.Spring Security For Beginners — Part 2 - DEV Community, accessed August 12,
025,
2
https://dev.to/therealdumbprogrammer/spring-security-for-beginners-part-2-4e
9
68.Spring Security JWT Authentication Tutorial - CodeJava.net, accessed August 12,
2025,
https://www.codejava.net/frameworks/spring-boot/spring-security-jwt-authentic
ation-tutorial
69.Implement JWT authentication in a Spring Boot 3 application | by Eric Cabrel
Tiogo | Medium, accessed August 12, 2025,
https://medium.com/@tericcabrel/implement-jwt-authentication-in-a-spring-boo
t-3-application-5839e4fd8fac
70.Spring Boot, Mockito and JUnit 5 Example - HowToDoInJava, accessed August 12,
2025,
https://howtodoinjava.com/spring-boot2/testing/spring-boot-mockito-junit-exam
ple/
71.Unit Testing in Spring Boot Project using Mockito and Junit - GeeksforGeeks,
accessed August 12, 2025,
https://www.geeksforgeeks.org/unit-testing-in-spring-boot-project-using-mocki
to-and-junit/
72.Spring Boot Testing JUnit & Mockito | Medium, accessed August 12, 2025,
https://medium.com/@AlexanderObregon/mastering-spring-boot-testing-with-ju
nit-and-mockito-8bec9b4911fc
73.How to use Junit and Mockito for unit testing in Java - DEV Community, accessed
August 12, 2025,
https://dev.to/whathebea/how-to-use-junit-and-mockito-for-unit-testing-in-java
-4pjb
74.Mockito framework site, accessed August 12, 2025,https://site.mockito.org/
75.The Difference Between JUnit and Mockito | Baeldung, accessed August 12, 2025,
https://www.baeldung.com/junit-vs-mockito
76.Spring Boot Testing Tutorial - Code With Arho, accessed August 12, 2025,
https://www.arhohuttunen.com/spring-boot-testing-tutorial/
77.Getting Started | Testing the Web Layer - Spring, accessed August 12, 2025,
https://spring.io/guides/gs/testing-web/
78.Dockerizing your Java Spring Boot application with Maven, along with a
PostgreSQL database - DEV Community, accessed August 12, 2025,
https://dev.to/kailashnirmal/dockerizing-your-java-spring-boot-application-with-
maven-along-with-a-postgresql-database-2kpl
79.How to dockerize Spring Boot apps | TheServerSide, accessed August 12, 2025,
https://www.theserverside.com/video/Simplify-a-cloud-native-Spring-Boot-Dock
er-deployment
80.How To Dockerize A Spring Boot Application With Maven ? - GeeksforGeeks,
accessed August 12, 2025,
https://www.geeksforgeeks.org/springboot/how-to-dockerize-a-spring-boot-ap
plication-with-maven/
81.Dockerizing a Spring Boot Application - Baeldung, accessed August 12, 2025,
ttps://www.baeldung.com/dockerizing-spring-boot-application
h
82.Getting Started with Spring Boot and Docker - Diffblue, accessed August 12,
2025,
https://www.diffblue.com/resources/getting-started-with-spring-boot-and-dock
er/
83.Getting Started | Spring Boot with Docker, accessed August 12, 2025,
https://spring.io/guides/gs/spring-boot-docker/
84.Java Spring Boot REST Server with RabbitMQ | CodeNOW Documentation,
accessed August 12, 2025,
https://docs.codenow.com/java-spring-boot-complex-examples/java-spring-boo
t-rest-server-with-rabbitmq
85.Getting Started | Messaging with RabbitMQ - Spring, accessed August 12, 2025,
https://spring.io/guides/gs/messaging-rabbitmq/
86.RabbitMQ tutorial - "Hello World!" | RabbitMQ, accessed August 12, 2025,
https://www.rabbitmq.com/tutorials/tutorial-one-spring-amqp
87.Part 1: RabbitMQ for beginners - What is RabbitMQ? - CloudAMQP, accessed
August 12, 2025,
https://www.cloudamqp.com/blog/part1-rabbitmq-for-beginners-what-is-rabbit
mq.html
88.Guides - Spring, accessed August 12, 2025,https://spring.io/guides/