DEV Community

Cover image for Spring Boot + React/Next.js: How to Build a Full-Stack App in 2025
Devlink Tips
Devlink Tips

Posted on

Spring Boot + React/Next.js: How to Build a Full-Stack App in 2025

This is a step-by-step guide for creating a full-stack application with Spring Boot on the backend and React/Next.js on the frontend, including authentication, state management, and deployment.

Introduction:

Rapid change in web development means that in 2025, developers will still depend on potent frameworks, such as React/Next.js for the frontend and Spring Boot for the backend. With its strong ecosystem, Spring Boot streamlines Java-based backend development; React/Next.js uses reusable components, server-side rendering, and enhanced state management to enable effective frontend development.

This article leads you through creating a full-stack application using React/Next.js and Spring Boot. This tutorial will equip you with a working application supporting data storage, authentication, API communication, and deployment at its finish.

You will learn how to:
Establish a RESTful API Spring Boot backend. Connect a Postgres database for ongoing storage. Create a React/Next.js frontend capable of backend communication. Using JWT authentication will help to protect user sessions. Handle frontend states with efficiency. Install the frontend as well as the backend in an environment ready for production.

1. Why Choose Spring Boot and React/Next.js in 2025?

Spring Boot together with React/Next.js are a perfect tech stack for contemporary apps since they complement each other nicely.

Why use Spring Boot in the backend?

  • Still among the most often used Java-based backend systems, Spring Boot’s perfect for dissecting apps into smaller, doable services is microservices compatibility.
  • With Spring Boot 3.x and Java 21, performance enhancements have been somewhat notable.
  • Security: JWT and OAuth2 have built-in authentication support.
  • It functions effectively with both relational (SQL) and NoSQL databases.

React/Next.js: Why Use It for the Frontend?

  • Reactions and Next.js keep making frontend decisions based on reusability and maintainability that are promoted in component-based architecture.
  • Next. JS 14 then supports server components for the best rendering.
  • Next.js provides faster loading times through server-side rendering (SSR) and static site generation (SSG).
  • Easy connection with technologies like Relic, React Query, or Zustand will help with state management.

Image description

2. Arranging the Spring Boot backend:

Let us build up our backend before starting any programming.

Start a Spring Boot Project:
We will create our Spring Boot project using Spring Initializr.

  1. Visit Spring Initializr.
  2. Select the configurations shown below:
  • Java version: 21
  • Spring Boot version: 3.x

Dependence:

  • Spring Web: Designed to generate REST APIs.
  • Database interaction: Spring Data JPA.
  • Spring Security: Regarding login.
  • PostgreSQL Driver: To connect with PostgreSQL.
  • Lombok: To lower boilerplate codes.
  • Click Generate, grab the project, then open it in an IDE like Reverse Code or IntelliJ IDEA.

3. Linking a Postgres database:

Data storage and management of a backend application depend on a database. We will take advantage of the strong and extensively utilized relational database PostgreSQL.

Step 1: Install PostgreSQL:

Download PostgreSQL from this page if you haven’t installed it already. Create a fresh database once set up with:

CREATE DATABASE mydatabase;
Enter fullscreen mode Exit fullscreen mode

Step 2: Configure Spring Boot to use PostgreSQL:

Change application.properties found in src/main/resources/:

spring.datasource.url=jdbc:postgresql://localhost:5432/mydatabase

spring.datasource.username=postgres
spring.datasource.password=yourpassword
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
Enter fullscreen mode Exit fullscreen mode

This setup instructs Spring Boot on Postgres connectivity.

Using Spring Boot, building a REST API:

To let the frontend interface with the database, the backend requires an API. We shall design a basic user API.

Step 1: Define the User Entity:
Create a User Model at src/main/java/com/example/demo/model/User.java:

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Constructors, Getters, and Setters
}
Enter fullscreen mode Exit fullscreen mode

This class stands in for a database user table.

Step 2: Create the Repository:
Make UserRepository.java.

public interface UserRepository extends JpaRepository<User, Long> {
}
Enter fullscreen mode Exit fullscreen mode

This repository interface lets us access the database without creating intricate searches.

Step 3: Create the REST Controller
Define API endpoints in UserController.java:

@RestController
@RequestMapping("/api/users")
public class UserController {

    private final UserRepository userRepository;

    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @GetMapping
    public List<User> getUsers() {
        return userRepository.findAll();
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }
}
Enter fullscreen mode Exit fullscreen mode

This controller shows two REST API endpoints:

  • GET/api/users: Fetch every user.
  • POST/api/users: Create a fresh user.

5. Setting Up React/Next.js Frontend

Let us now generate a Next.js frontend.

Step 1: Install Next.js
Run

npx create-next-app@latest myapp --typescript
cd myapp
npm install axios react-query
Enter fullscreen mode Exit fullscreen mode

Step 2: Get users from the backend:
Modify pages/index.tsx:

import { useQuery } from "@tanstack/react-query";
import axios from "axios";

const fetchUsers = async () => {
    const { data } = await axios.get("http://localhost:8080/api/users");
    return data;
};

export default function Home() {
    const { data, error, isLoading } = useQuery(["users"], fetchUsers);

    if (isLoading) return <p>Loading...</p>;
    if (error) return <p>Error fetching users</p>;

    return (
        <ul>
            {data.map((user) => (
                <li key={user.id}>{user.name} ({user.email})</li>
            ))}
        </ul>
    );
}
Enter fullscreen mode Exit fullscreen mode

This code shows users gathered via our Spring Boot API.

6. Deploying the Full-Stack App:

Activate Spring Boot on Fly.io:
A simple cloud platform for Java apps is Fly.io. Install using:

fly launch
Enter fullscreen mode Exit fullscreen mode

Share Next.js with Vercel: Perfect for hosting Next.js apps is Vercel. Install with:

vercel deploy
Enter fullscreen mode Exit fullscreen mode

Final Thought:

Congratulations! With Spring Boot and React/Next.js, you have created a full-stack application rather successfully. We addressed frontend development, backend configuration, database integration, API construction, and deployment techniques.

Regarding more reading:
Spring Boot Official Documentation

Next.js Documentation

PostgreSQL Docs

Image of Datadog

The Future of AI, LLMs, and Observability on Google Cloud

Datadog sat down with Google’s Director of AI to discuss the current and future states of AI, ML, and LLMs on Google Cloud. Discover 7 key insights for technical leaders, covering everything from upskilling teams to observability best practices

Learn More

Top comments (0)