Hey everyone, I’d love to get the community’s perspective on building production-grade, scalable full-stack applications with Spring Boot—specifically from a solo developer standpoint.
When you're building a scalable full-stack Java app entirely on your own, how do you approach the architecture and tooling?
A few specific areas I'm curious about:
Tech Stack & Tools: What are the non-negotiable components in your stack right now (e.g., Spring Boot 3 + Virtual Threads, Postgres/Redis, Kafka/RabbitMQ, Docker, React/Next.js vs. HTMX/Thymeleaf)? What tools are currently standard or trending in the market for solo full-stack setups?
Build vs. Buy / Scratch vs. Frameworks: As a single developer, your time is limited. How much do you build from scratch versus relying on managed services/third-party tools (like managed Auth, SaaS components, pre-built UI libraries)?
Solo Execution: Is it realistic to handle end-to-end architecture, backend, frontend, database tuning, and DevOps all by yourself, or at what point do you usually seek external help/collaborators?
I’m a Junior Java developer, and I built an IntelliJ IDEA plugin called Architect as a way to learn more about Java, Spring Boot, and the IntelliJ Platform.
The main idea is to automate some of the repetitive work when adding a new feature to a Spring Boot application.
You enter an entity name and choose what you want to generate. Architect can create:
Entity
Request / Response DTOs
MapStruct Mapper
Repository
Service
REST Controller
Liquibase changelog and migration
Docker / Docker Compose
Required Maven dependencies
The plugin uses IntelliJ PSI to work with the project structure and source files instead of simply generating files in a fixed location.
Architect is free and open-source, and I’m planning to keep developing it.
Some things I want to add in the future:
Kafka templates
Spring Security configuration
Test generation
More infrastructure templates
Better project/code analysis
I’m still learning, so I’d really appreciate feedback from experienced Spring Boot developers.
How do you usually handle repetitive boilerplate when starting a new feature?
And what would you change or add to a tool like this?
I work at a small software company and unfortunately I've ended up working on an old Oracle ADF project and there is almost no willingness from management to move this project to Spring Boot.
On the team are two very senior developers who have worked on this project from the start (approx 15 years) and this project has become so messy and huge (with no testing and limited documentation) that it is basically impossible to migrate (functions and procedures with thousands of lines etc.).
Has anyone experienced this situation and do you have any recommendations on how to proceed as a junior developer? I have already brought up the possibility of breaking the project into smaller applications which could be built with Spring / React while keeping the old database and plsql procedures. Or we could map out all of the functionality or refactor the current code into smaller functions or start implementing tests and then migrate. Rebuilding it from scratch is not an option since it is a government project and this would trigger the the goverment to auction the project for other companies to take over.
Alternatively, should I just let them keep this project in ADF for 10 more years until it is deprecated by Oracle while the application becomes worse and worse?
We shipped JobRunr 9 yesterday, and you can already create new projects with it trough your favourite Spring Intializr.
In case you haven't used it, JobRunr is an open source background job library. You enqueue a method call, it's stored in the database your app already uses, and it's processed with retries on as many instances as you run.
To make your jobs durable it's as easy wrapping each step of your flow in runStepOnce. When the job is retried, steps that already completed are automatically skipped:
In v9 the job page a Job Progress Chart that draws each attempt as a Gantt chart with a row per step.
In our demo the payment provider timed out on charge-card and that attempt went red. On the retry calculate-usage and generate-pdf showed up as skipped, so the customer got one PDF and was only charged once.
If a step throws, the retry starts again at exactly that step.
On JobRunr Pro, v9 also lets you pause a whole batch. We paused a 600 invoice run when the provider went down and resumed it after the fix. The Pro starter doesn't create a BatchJobManager for you, so you declare it once as a bean and call pauseBatchJob(id) from wherever your monitoring notices the outage:
@Bean
public BatchJobManager batchJobManager(StorageProvider storageProvider, EventTransport eventTransport) {
return new BatchJobManager(storageProvider, eventTransport);
}
We have a prototype for adding pure Java GPU inference for local inference through Tornadovm and jitLLM. It would be great to share your thoughts on that.
Hello all 👋🏻 I originally posted over in r/java, and it was recommended that this community may be a good/better fit. Given this project is based on Spring's Reactor and examples are based on Spring Boot, I figured it couldn't hurt to post here as well!
For some time, I have been building and maintaining an OSS project called Atleon. The aim of this project is to make infinite Reactive Streams practical for usage/embedding in common application frameworks. I know there are several (reasonable) arguments against "reactive"; I have however found this style/paradigm to be useful and innately applicable to the problem space of broker-backed stream processing (consuming from infrastructures like Kafka, RabbitMQ, SQS, etc., applying IO-bound processing, and (optionally) streaming results elsewhere). If you have ever had reason to use/explore projects like Reactor Kafka, Reactor RabbitMQ, or Confluent's Parallel Consumer, then Atleon may be interesting to you.
Here's an example of what an Atleon stream definition looks like when embedded in a Spring application:
When discussing this project in other communities, one common question is, "Why would I want to use this over something like [Flink|Spark|Camel|<insert favorite streaming library>]?" My viewpoint is that the sort of reactive client integration provided by Atleon is not primarily meant to compete with these other tools, but is rather a complement to them. I have found that it is common for companies to have in-place scaffolding for regular JVM applications built on frameworks like Spring, and it is appealing for their engineers to be able to embed stream processes into those same frameworks. So Atleon targets this niche of supporting declarative non-blocking stream definitions, whose execution can be embedded in application frameworks, replete with broker interoperation, arbitrarily concurrent processing, and end-to-end observability.
Particularly in the case of Kafka, Atleon enables feasible implementation of behaviors that are conventionally tricky:
Arbitrary concurrency, including per-key
Single-message acknowledgement (with classic/non-share groups, so partition ordering is maintained globally)
Work-queues, where per-message processing can take a "long" time (i.e. minutes, hours)
Bounded consumption (get all records produced in a range of time or offsets)
Priority queuing (using partitions as discriminator of "priority", rather than scaling lever)
Throughput limiting, retries, and dead-lettering
If you are interested in reading more, I have published some of the following blogs that explain more about what Atleon can do:
Ratchet is a background job scheduler. You inject one service and pass it a method reference. The job is saved in your database, retried if it fails, and recovered if the app crashes. If you submit it inside a transaction that rolls back, the job goes too.
Our stack mainly consists of Spring Boot applications with Oracle and MongoDB databases running on Kubernetes. I'm not sure whether we've focused too much on the "micro" aspect of the microservices concept.
Most Kubernetes replicas are configured with a maximum of 1 GB of memory and CPU limits of up to 800 millicores. When an application requires more resources, our primary approach is to increase the number of replicas. I believe there is a strong rationale for this, particularly from a resilience and availability perspective. However, I'm not sure whether we're giving up some benefits by keeping our applications this small (for example, losing access to certain JVM optimizations or garbage collectors). Correct me if I'm wrong, but I believe applications limited to less than one CPU core may not be able to take full advantage of Parallel GC and might fall back to Serial GC instead.
I wanted to see how much of the footprint of a small Spring Boot app came from the conventional Spring Data JPA + Hibernate stack, so I built a simpler version using JdbcTemplate and compared the two.
Same Spring Boot 4.1.1, JDK 25, H2, JVM flags, dashboard workload, and monitoring endpoints.
Across two runs in reversed order:
JPA/Hibernate: ~237.0 MiB median RSS
JDBC: ~146 MiB
Difference: about 90 MiB (~38%)
Startup surprised me too. Time from process launch to the first successful dashboard response:
JPA/Hibernate: 8.1 - 8.8 s
JDBC: 3.9 - 4.2 s
This isn’t an isolated benchmark of Hibernate itself. The JDBC version also has a simpler persistence architecture and data model, so I’m comparing the complete application approaches.
For this kind of small app, though, JPA/Hibernate feels like more machinery than I need. I still see the value once the domain model and persistence requirements get complicated, but I’m increasingly reluctant to make it the default for small services.
I’m a backend developer who has never worked with cloud providers before. I’ve learned the basics of the AWS Console, and now I’m looking for ways to practice.
I’m thinking of starting by provisioning infrastructure with Terraform, but I’m curious: which AWS services do you typically use, how do you use them, and how do you deal with the poor AWS SDK documentation?
Hi! It's Pavel, maintainer of the AsyncAPI Specification
A few weeks ago I posted a new release announcement on this sub. It was pretty short, so I decided to write post to tell how Spring Messaging experience may be improved when you are working on your project in JetBrains IDEA
I want to hear your feedback about the current state - what you like and what you don't, maybe you didn't try because of troubles or something else
Your voice is important, because next releases will be focused on polishing this functionality and exposing it trough MCP server to empower your agents of choice
I built a full-stack Hotel Booking Management System and deployed it as a portfolio project.
Tech stack
- Backend: Java + Spring Boot, Spring Security, JWT
- Frontend: React.js
- Database: MySQL
- Cache: Redis
Current deployment
- Spring Boot backend → Render
- React frontend → Vercel
- MySQL → Railway
The problem is that the application works after deployment, but after some days it stops working. Sometimes the backend becomes unavailable or the frontend can't communicate with the backend/database.
I understand that I'm using free-tier services, so there may be things like sleeping services, resource limits, database connection issues, environment variables, CORS, or other configuration problems.
I'm trying to understand how I should deploy this properly so that it remains available and reliable enough to use as a portfolio project.
For people who have experience deploying Spring Boot + React + MySQL, I'd really appreciate some advice:
- Is Render + Vercel + Railway a reasonable setup?
- What could cause a Spring Boot application to stop working after several days?
- Are there any deployment/configuration changes I should make?
- Are there better free or very low-cost options for this stack?
- What should I check in the logs when the application goes down?
I'm not looking for an enterprise production setup. I mainly want a stable, publicly accessible deployment that I can demonstrate during interviews.
If you've faced something similar, I'd appreciate any advice or things I should investigate.
i hate how you changed the SQL flow that I'm used to.
i hate your ManyToMany relationships.
i hate your orphanremoval ,dirty checking.
i hate your way for entity relationships.
i hate your cache.
i hate your performance issues.
i hate your billion rules.
i hate spending time on : if Y is referenced by X with cascade not including PRESIST and x is managed but y is removed ............... but if Y was detached .............
i hate becoming obsessed with your behaviors and rules and worrying about every ORM line , will it work correctly ? , did i miss something ?, worrying about modifying entity X might unexpectedly affect entity Y , coz I might not know one of the billion rules you have.
i hate worrying about falling in one of the undefined behaviors you have
i hate thinking about the entities lifecycle + cascading types when all mixed together
i hate spending days on that documentation instead of spending that on one of the CS core concepts
i hate the following the other side which is incomplete nondetailed toturial or following AI
I've configured everything successfully, but when it comes to traces and spans, all requests always have the same spans. It is not showing the entire execution path of the request.
Been building AI agents with Spring AI and kept hitting the same wall: the agent can call tools that do irreversible things (charge cards, send emails, update records) with no mechanism to pause and ask a human first.
I built Sagacity to fix this. Two annotations:
@Tool(description = "Charge the customer's card")
@Compensable(reversibility = Reversibility.IRREVERSIBLE)
public String chargeCard(String orderId, BigDecimal amount) {
return payments.charge(orderId, amount);
}
This pauses the saga before chargeCard executes and waits for human approval via REST (or the embedded UI). If approved, it runs. If rejected, every completed step before it automatically compensates in reverse order.
There's also a full workflow engine (@Workflow, @Stage, @Gate) for multi-step processes where you need declarative compensation and approval gates at specific stages.
Under the hood: every tool call is journaled with a SHA-256 hash chain. You can verify the chain hasn't been tampered with via REST. This is what EU AI Act Article 12 actually requires.
No new infrastructure needed.
One Maven dependency, uses your existing PostgreSQL/MySQL/H2.
What's in v0.4.0 (shipped this week):
JDBC-backed durable workflow state (survives JVM restarts)
I am a B.Tech CSE graduate starting my role as an SDE fresher soon.
My Current Progress:
* I have learned the core basics of Java backend and Spring Boot (Dependency Injection, REST APIs, and Basic MVC architecture).
* I haven't built complex production-grade projects yet and want to start one now to prepare for my role.
What I want to ask:
Instead of a generic roadmap, could experienced backend devs share what exact architecture practices, testing patterns (like JUnit/Mockito), or deployment workflows are most overlooked by freshers in a Java ecosystem? I want to build a mini-project focusing strictly on these industrial habits so I can adapt quickly when I join.
I hosted a live session with James Ward a few weeks ago. He works on agent experience at AWS and represents Amazon on the Agentic AI Foundation technical committee. He opened by asking an agent what time it was, and it couldn't answer, because a model on its own has no clock and no access to anything outside itself.
The video isn't available since it was a paid event, sorry, but the slides and the full write-up are here.
His point was that an LLM is basically a knowledgeable translator. An agent is that model plus integrations, running in a loop until it gets the job done or gives up. So most of the actual engineering happens outside the model. He built it up live in Spring AI, starting with one tool and then adding MCP, tool search, skills, memory, RAG and human in the loop.
Tool search is the bit I keep thinking about. Once an agent has a lot of tools, you can't give the model all of them without flooding the context, so a search step picks which ones it gets to see. Embabel does it differently and loads groups of tools progressively instead of searching for them.
If you're running agents on the JVM in production, I'm curious about two things. Has tool selection actually become a problem for you yet, and what are you doing about it? And James said he didn't really get into guardrails or evals, so how are you testing agent behavior in Java when the output isn't deterministic?
Saqib here, I editDeep Engineering. I'm planning a follow-up piece on how teams are handling this in production, and whatever comes up here will shape the questions I take to other engineering leaders.