Every website you came across has three main tools in its architecture as an X-Ray. Frontend, Backend and Database
In this workshop, we will try to understand Frontend, Backend and Workshops by building an e-commerce project.
You will understand how exactly sites like Amazon, flipkart works in an X-ray level as we are going to build our own e-commerce project here.
π ️Tools to Install
Before we start, make sure you have these tools installed.
If you are using Windows, I would recommend installing Ubuntu WSL as it makes project easier and you can use linux commands in windows machine
Download Java
For MacOs
brew install openjdk@21
java --version
Note: In case, Java version does not show up. it means your MacOS is reading Java files from default path. so we will use symbolic link here for MacOs
sudo ln -sfn /opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-21.jdk
For Windows (Open Ubuntu WSL)
sudo apt update
sudo apt install openjdk-21-jdk
Java --version
Note: if java version is not shown in windows, run following commands in Ubuntu WSL
echo 'export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64' >> ~/.bashrc
source ~/.bashrc
java --version
Postgresql ( please make sure to save password that you set)
π» Use VS code Terminal
Check tools installed. and we will understand why each tool is installed and its significance as we build our project
Open Visual Studio, select Terminal from Menu tab and check if all tools required are installed with following commands.
If you are using windows, click on +icon on right bottom of screen and change it to Ubuntu WSL and then run mentioned below commands.
π Verify tools
git --version
node --version
npm --version
java -version
mvn -version
psql --version
We will be using VS code terminal for whole project
Note: Windows users must use Ubuntu WSL from VS code in terminal to use linux commands
Maaya Store E-commerce
Now let us understand our project by building an e-commerce project. create a folder with name of your choice. For this Demo. let us assume that we run a business called Maaya store and our business has warehouse where we sell different brands, apparels, Mobiles, electronics. Our store was never online though we posted as third party sellers in site like Amazon, flipkart. Genuinity of our products is still questioned and a dear friend of ours suggested that people trust if you have website of your own.
So we decided to make it online but before and want to build our website from scratch and as we start building it, we start learning technology behind on how the websites are created.
so, lets begin.
Note: We will be using Linux commands in this project
create a folder
mkdir maaya-store
mkdir is a command in linux, make directory which creates folder in the path that we run this command. In linux. folders are often referred as directories.
Now in Visual Studio from Menu bar, click on Open folder and select folder that we created
select the folder that has been created.
FrontEnd
Now let us create front-end folder. make sure you are inside maaya-store directory
mkdir frontend
Now Navigate inside frontend directory
cd frontend
Here cd stands for 'Change directory'. this is used to navigate inside specific directory but if you want to come out of this directory, we use 'cd ..' , gets one step back from directory. you can think of it as back button inside folders of windows.
Now, we have installed Nodejs, let us install react.
We will be using Vite Library with React template. this is will be our frontend.
npm create vite@latest . -- --template react.
once you run this command, you will observe list of folders created in our frontend and also our application is running on localhost:5173
And also if you try to access localhost:5173
You can stop this application from Terminal, pressing Ctrl+C
Now let us install few tools that we require from npm. npm is node package manager and you have all the required tools available here
npm install axios
Axios is a JavaScript library that we will use to make HTTP requests from your frontend to a backend API.
everytime we run an install command, notice that package.json file gets update with this particular dependency
and also lets install lucide-react
npm install lucide-react
lucide react is a library that contains stylized icons and helps us making our website look better
Now lets run install command.
npm install
Here npm install command reads package from package.json and downloads those packages into node_modules folder
Now let us use test our front-end application again.
go to App.jsx file and update Function App()
function App() {
return (
<div>
<h1>Maaya Store</h1>
<p>Our e-commerce platform is coming soon.</p>
</div>
);
}
export default App
For this project, enable Auto Save as it is easier for us whenever we make a change in the files
and once it is done, In terminal , enter command
npm run dev
the above command builds our application.
Now if you access localhost:5173 on your browser
Backend
Now let us build our backend application. just like we used vite library, we will be using Spring Boot for our Backend application.
Navigate to Spring Intializer

| Setting | Value |
|---|---|
| Project | Maven |
| Language | Java |
| Spring Boot | Current stable |
| Group | com.maayastore |
| Artifact | backend |
| Name | Maaya Store Backend |
| Package name | com.maayastore.backend |
| Packaging | Jar |
| Java | 21. |
for now we will add only Spring Web dependencies
Other dependencies that we will use in project
Spring Web, Spring Data JPA, PostgreSQL Driver ,Validation, Lombok
Spring Web is used to build our REST API
Spring Data JPA is used for communicating with databases, it converts our java code to SQL queries
Lombok - to avoid repetitive code
Adding other dependency will only only cause our project to fail in build as it is not connected to database yet.
fill the details as shown in screenshot and click generate. you will have file named "backend.zip" in your downloads
Now copy or move this backend folder inside maaya-store folder that we created
Now let us test our backend java application
create a folder called controller at src/main/java/com/maayastore/backend/
and a file called HelloController.java
Now add following contents to it
HelloController.java
package com.maayastore.backend.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/api/hello")
public String hello() {
return "Hello from Maaya Store Backend!";
}
}
Now run the following command
mvn spring-boot:run
And can now try accessing http://localhost:8080/api/hello
What happened here?
Database
brew services start postgresql@18
psql postgres
CREATE DATABASE maaya_store_database;
\l
\c maaya_store_database
\q
psql postgres -c "\du"
Connecting Database to Backend
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
spring.datasource.url=jdbc:postgresql://localhost:5432/maaya_store_database
spring.datasource.username=sagar
spring.datasource.password=
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
mvn spring-boot:run
create a folder called Entity at src/main/java/com/maayastore/backend/and create a file called Product.java
package com.maayastore.backend.entity;
import jakarta.persistence.*;
import java.math.BigDecimal;
@Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
private String description;
@Column(nullable = false)
private BigDecimal price;
private Integer stock;
public Product() {
}
public Product(String name, String description, BigDecimal price, Integer stock) {
this.name = name;
this.description = description;
this.price = price;
this.stock = stock;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
}
mvn spring-boot:run
psql maaya_store_database
\dt
Configuring Controller, Repository and Service
create a folder called repository at src/main/java/com/maayastore/backend/and create a file called ProductRepository.java
package com.maayastore.backend.repository;
import com.maayastore.backend.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductRepository extends JpaRepository<Product, Long> {}
create a folder called service at src/main/java/com/maayastore/backend/and create a file called ProductService.java
package com.maayastore.backend.service;
import com.maayastore.backend.entity.Product;
import com.maayastore.backend.repository.ProductRepository;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ProductService {
private final ProductRepository productRepository;
public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
public List<Product> getAllProducts() {
return productRepository.findAll();
}
}
crate ProductController.java
package com.maayastore.backend.controller;
import com.maayastore.backend.entity.Product;
import com.maayastore.backend.service.ProductService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/api/products")
public class ProductController {
private final ProductService productService;
public ProductController(ProductService productService) {
this.productService = productService;
}
@GetMapping
public List<Product> getAllProducts() {
return productService.getAllProducts();
}
}
mvn spring-boot:run
Testing GET API
psql maaya_store_database
INSERT INTO products
(name, description, price, stock)
VALUES
(
'Nike Air Max',
'Premium running shoes',
14999.00,
25
);
Adding Images path
package com.maayastore.backend.entity;
import jakarta.persistence.*;
import java.math.BigDecimal;
@Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
private String description;
@Column(nullable = false)
private BigDecimal price;
private Integer stock;
private String imagePath; // added line
public Product() {
}
public Product(String name, String description, BigDecimal price, Integer stock, String imagePath) { // added Imagepath constructor
this.name = name;
this.description = description;
this.price = price;
this.stock = stock;
this.imagePath = imagePath; // added line for image
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
public String getImagePath() { // added line for image
return imagePath;
}
}
create a folder called config at src/main/java/com/maayastore/backend/and create a file called WebConfig.java
package com.maayastore.backend.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/images/**")
.addResourceLocations("file:images/");
}
}
Configuring POST API
@PostMapping
public Product createProduct(@RequestBody Product product) {
return productService.saveProduct(product);
}
public Product saveProduct(Product product) {
return productRepository.save(product);
}
mvn spring-boot:run
{
"name": "Nike Air Max",
"description": "Premium running shoes",
"price": 14999,
"stock": 25,
"imagePath": "/images/nike-air-max.jpg"
}
Configuring PUT API
@PutMapping("/{id}")
public Product updateProduct(@PathVariable Long id,@RequestBody Product product) {
return productService.updateProduct(id, product);
}
public Product updateProduct(Long id, Product product) {
Product existingProduct = productRepository.findById(id)
.orElseThrow(() -> new RuntimeException("Product not found"));
existingProduct.setName(product.getName());
existingProduct.setDescription(product.getDescription());
existingProduct.setPrice(product.getPrice());
existingProduct.setStock(product.getStock());
existingProduct.setImagePath(product.getImagePath());
return productRepository.save(existingProduct);
}
public void setImagePath(String imagePath) {
this.imagePath = imagePath;
}
mvn spring-boot:run
{
"name": "Nike Air Max",
"description": "Premium running shoes",
"price": 14999,
"stock": 25,
"imagePath": "/images/nike-air-max.jpg"
}
DELETE from products where id=2;
FrontEnd to BackEnd Application Connectivity
import { useEffect, useState } from "react";
import axios from "axios";
function App() {
const [products, setProducts] = useState([]);
useEffect(() => {
axios
.get("http://localhost:8080/api/products")
.then(response => {
setProducts(response.data);
})
.catch(error => {
console.error("Error fetching products:", error);
});
}, []);
return (
<div>
<h1>Maaya Store</h1>
<h2>Products</h2>
{products.map(product => (
<div key={product.id}>
<h3>{product.name}</h3>
<img
src={`http://localhost:8080${product.imagePath}`}
alt={product.name}
width="200"
/>
<p>{product.description}</p>
<p>₹{product.price}</p>
<p>Stock: {product.stock}</p>
</div>
))}
</div>
);
}
export default App;
npm run dev
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:5173")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS");
}
{
"name": "iPhone",
"description": "Latest Apple smartphone",
"price": 79999,
"stock": 15,
"imagePath": "/images/iphone.jpg"
}
{
"name": "Classic T-Shirt",
"description": "Comfortable cotton T-shirt",
"price": 1499,
"stock": 50,
"imagePath": "/images/tshirt.jpg"
}
✅This concludes our Workshop here.
π§For next workshop, you can register and explore for more at DevOps Maaya
π What We Have Learned
Throughout this hands-on workshop, we learned how the different components of a real-world full-stack application work together — from the Frontend to the Backend and finally to the Database.
-
How do CRUD Operations work?
Understand how Create, Read, Update, and Delete (CRUD) operations are implemented using REST APIs to manage application data.
-
How does an API work?
Understand how the frontend communicates with the backend through HTTP requests and REST API endpoints such as GET, POST, PUT, PATCH, and DELETE.
-
How do Controller → Service → Repository layers work together?
Understand how a request flows through the Controller → Service → Repository → Database layers while building and configuring APIs.
-
How do we connect the Frontend, Backend, and Database?
Understand how React → Spring Boot → PostgreSQL work together to build a complete full-stack application.
-
How does Spring Data JPA work?
Understand how Java entities are mapped to database tables and how Spring Data JPA and Hibernate handle database operations by generating and executing the required SQL queries.
-
What is CORS and how do we troubleshoot it?
Understand why browsers can block requests between the frontend and backend and how to identify and resolve CORS issues when connecting applications running on different origins.
π‘ In One Line
We learned how a real full-stack application works from Frontend → API → Backend → Database, and how these components communicate with each other.
How to Add the DevOps Maaya Hands-On Workshop to Your LinkedIn & Resume
If you participated in the DevOps Maaya Free Hands-On Workshop, you can showcase the experience on both your LinkedIn profile and resume.
The most important point is:
Don't simply mention that you attended a workshop. Highlight what you actually built, implemented, tested, and learned.
πΌ LinkedIn Profile
Participants can add the workshop to their LinkedIn profile under Licenses & Certifications, Courses, Projects, or Featured, depending on how they want to showcase their experience.
Recommended LinkedIn Description
DevOps Maaya — Free Hands-On Workshop
Participated in a hands-on application development workshop focused on building an end-to-end E-Commerce application.
Worked with:
- React.js
- Spring Boot
- REST APIs
- PostgreSQL
- Spring Data JPA / Hibernate
- Maven
- Axios
Hands-on activities included:
- Frontend development
- Backend REST API development
- Product CRUD operations
- Database integration
- Frontend-backend API integration
- CORS configuration
- API testing and troubleshooting
- Application build and development workflows
Short LinkedIn Version
DevOps Maaya — Hands-On E-Commerce Workshop
Built an end-to-end E-Commerce application using React.js, Spring Boot, REST APIs and PostgreSQL. Implemented product CRUD operations, database integration and frontend-backend API integration using Axios.
π Resume Templates
Choose the template that best matches your experience level and career goal.
π¨π Template 1 — Freshers
For freshers, the hands-on project can be included prominently under the Projects section.
Recommended Resume Format
E-Commerce Application
Technologies: React.js, Spring Boot, REST APIs, PostgreSQL, Spring Data JPA, Hibernate, Maven, Axios
- Developed a full-stack E-Commerce application using React.js for the frontend and Spring Boot for the backend.
- Implemented RESTful APIs for product management using Spring Boot and Spring Data JPA.
- Developed CRUD operations for managing product information, including product details, pricing, inventory, and images.
- Integrated PostgreSQL with the Spring Boot application for persistent data storage.
- Connected the React frontend with backend REST APIs using Axios.
- Implemented and tested GET, POST, PUT and PATCH API operations.
- Configured CORS to enable communication between the React frontend and Spring Boot backend.
- Built and tested the application across the frontend, backend, API and database layers.
Shorter Version for a One-Page Resume
E-Commerce Application | React.js, Spring Boot, PostgreSQL, REST APIs
- Built a full-stack E-Commerce application using React.js and Spring Boot.
- Implemented product CRUD operations using REST APIs, Spring Data JPA and PostgreSQL.
- Integrated frontend and backend using Axios and configured CORS for API communication.
- Worked across frontend, backend and database layers to build and test an end-to-end application.
π¨π» Template 2 — Experienced Professionals / Seniors
If you already have professional experience, don't present the workshop as your primary professional project.
Instead, add it under Professional Development, Training, Certifications & Training, or Hands-on Learning.
Recommended Resume Format
DevOps Maaya — Hands-On E-Commerce & Application Development Workshop
Technologies: React.js, Spring Boot, REST APIs, PostgreSQL, Spring Data JPA, Hibernate, Maven, Axios
- Gained hands-on experience building an end-to-end application spanning frontend, backend, API and database layers.
- Worked with React.js, Spring Boot, REST APIs and PostgreSQL to understand modern application development workflows.
- Implemented and tested REST APIs supporting product CRUD operations.
- Integrated frontend and backend services using Axios and configured CORS for cross-origin communication.
- Applied practical troubleshooting across application, API, database and frontend integration layers.
- Strengthened understanding of the application lifecycle from development through deployment concepts.
Short Version
DevOps Maaya — Hands-On Workshop
- Built and integrated a full-stack E-Commerce application using React.js, Spring Boot and PostgreSQL.
- Implemented REST APIs and CRUD operations using Spring Data JPA/Hibernate.
- Gained practical experience with frontend-backend integration, API troubleshooting and database connectivity.
π Template 3 — Career Switchers
If you are moving from one technology or domain to another, the workshop can demonstrate your hands-on transition into the new technology stack.
Career Transition into DevOps
DevOps Maaya — Hands-On Application & DevOps Workshop
- Gained hands-on experience working with an end-to-end application consisting of React.js frontend, Spring Boot backend and PostgreSQL database.
- Built and tested REST APIs and worked with application build and dependency management using Maven.
- Developed practical understanding of how application components interact across frontend, backend and database layers.
- Troubleshot application integration issues involving APIs, CORS, database connectivity and application configuration.
- Strengthened understanding of the application lifecycle and the relationship between software development and DevOps practices.
Short Version
DevOps Maaya — Hands-On Workshop
- Worked on an end-to-end E-Commerce application using React.js, Spring Boot, PostgreSQL and REST APIs.
- Gained practical understanding of application architecture, API integration, database connectivity and build workflows.
- Applied troubleshooting skills across multiple application layers.
☕ Template 4 — Java / Spring Boot Professionals
If your existing profile is focused on Java or Spring Boot, emphasize the backend work.
E-Commerce Application — Hands-On Project
Technologies: Java, Spring Boot, Spring Data JPA, Hibernate, PostgreSQL, REST APIs, Maven
- Developed RESTful APIs using Spring Boot for E-Commerce product management.
- Implemented CRUD functionality using Spring Data JPA and Hibernate.
- Integrated PostgreSQL for persistent product data storage.
- Implemented API endpoints for retrieving, creating and updating products.
- Worked with entity, repository, service and controller layers in a Spring Boot application.
- Built and packaged the application using Maven.
- Troubleshot API, database and application configuration issues during development.
⚙️ Template 5 — DevOps Professionals
If you are already working in DevOps, don't claim that the workshop made you a DevOps engineer. Instead, highlight the application-development knowledge you gained.
DevOps Maaya — Hands-On Application & DevOps Workshop
- Worked with an end-to-end application consisting of frontend, backend and database components.
- Gained practical understanding of application dependencies, build processes and backend API integration.
- Built and packaged a Spring Boot application using Maven.
- Worked with PostgreSQL-backed application services and REST APIs.
- Troubleshot application-level issues involving APIs, CORS, database connectivity and configuration.
- Strengthened understanding of how application development workflows connect with DevOps and deployment processes.
π§ͺ Template 6 — QA / SDET Professionals
E-Commerce Application — Hands-On Project
Technologies: React.js, Spring Boot, REST APIs, PostgreSQL, Axios
- Developed and tested REST APIs supporting product CRUD operations.
- Validated frontend-to-backend API integration using HTTP-based REST endpoints.
- Tested GET, POST, PUT and PATCH operations for product management.
- Verified database persistence using PostgreSQL.
- Troubleshot API integration, CORS and backend application issues.
- Worked across frontend, backend and database layers to understand end-to-end application behavior.
π️ Template 7 — Tech Lead / Architect / Senior Engineer
Hands-On Full-Stack Application Development
- Worked with an end-to-end application architecture integrating React.js, Spring Boot REST APIs and PostgreSQL.
- Applied practical understanding of interactions between presentation, service, persistence and database layers.
- Implemented product-management APIs and database persistence using Spring Data JPA/Hibernate.
- Investigated integration issues across API, frontend and database layers.
- Strengthened practical understanding of application architecture and development-to-deployment workflows.
π Template 8 — Very Short Resume Entry
DevOps Maaya — Hands-On Workshop
Built an end-to-end E-Commerce application using React.js, Spring Boot, REST APIs and PostgreSQL, implementing product CRUD operations and frontend-backend integration using Axios.
⭐ Template 9 — Fresher With No Previous Projects
E-Commerce Web Application
React.js | Spring Boot | PostgreSQL | REST APIs | Axios | Maven
- Developed an end-to-end E-Commerce application from frontend to database.
- Created a React.js frontend for displaying and managing products.
- Developed Spring Boot REST APIs for product management.
- Implemented product CRUD operations using Spring Data JPA and Hibernate.
- Integrated PostgreSQL for storing product information.
- Connected frontend APIs using Axios.
- Configured CORS for frontend-backend communication.
- Tested and debugged application, API and database integration issues.
⚠️ Important: Don't Add Technologies You Didn't Use
Your resume should reflect what you actually worked on.
For example, don't add:
- Docker
- Kubernetes
- Jenkins
- AWS
- Azure
- Terraform
- GitHub Actions
- CI/CD
- Ansible
unless you actually used them during the workshop.
A smaller list of technologies with genuine hands-on experience is much stronger than a large list of technologies you only heard about.
π‘ What Should You Use Based on Your Experience?
| Profile | Best Resume Section | Main Focus |
|---|---|---|
| Fresher | Projects | What you built |
| Student | Academic/Personal Projects | Hands-on implementation |
| Junior Developer | Projects / Experience | Technical implementation |
| Java Developer | Professional Development / Project | Spring Boot & APIs |
| DevOps Engineer | Professional Development | Application lifecycle & deployment |
| QA / SDET | Projects / Professional Development | API & integration testing |
| Senior Developer | Professional Development | Architecture & integration |
| Tech Lead | Professional Development | Architecture & system understanding |
| Career Switcher | Professional Development | Hands-on transition |
π Best Resume Formula
When writing your resume, try to follow this structure:
Action + Technology + What You Built + Result/Purpose
Instead of:
❌ "Learned Spring Boot."
Write:
✅ "Developed REST APIs using Spring Boot for product management."
Instead of:
❌ "Learned PostgreSQL."
Write:
✅ "Integrated PostgreSQL with Spring Data JPA for persistent product data storage."
Instead of:
❌ "Attended a DevOps workshop."
Write:
✅ "Built and tested an end-to-end E-Commerce application spanning frontend, backend, API and database layers."
π Final Recommendation
For Freshers
Use: Project → Technologies → 3–5 strong implementation bullets
For Experienced Professionals
Use: Professional Development / Training → Technologies → 2–4 bullets showing practical upskilling
For Career Switchers
Use: Hands-on Project → Technologies → bullets that demonstrate relevant skills for the target role
The goal is not to make the resume say:
"I attended a workshop."
The goal is to demonstrate:
"I have hands-on experience working with these technologies and building a real application."
Important: Only include claims that accurately reflect the work you personally completed during the workshop.

























































Comments
Post a Comment