Why Spring Boot? π₯
β MongoRepository = FREE CRUD (no Mongoose models!)
β Docker 1-file deploy (Render/Vercel style)
β TypeScript-level safety (Java types)
β Enterprise-grade (Netflix/Amazon use)
β 120MB Docker image (super fast deploy)
My Stack: Spring Boot + MongoDB Atlas + Render Docker
Project Setup βοΈ
pom.xml:
<dependencies>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependencies>
Core Files π»
Todo.java:
@Document(collection = "todo")
@Data
public class Todo {
@Id @JsonProperty("_id") private String id;
private String title;
private Boolean status;
}
TodoRepository.java (EMPTY!):
public interface TodoRepository extends MongoRepository<Todo, String> {
// FREE: findAll(), save(), findById(), deleteById()
}
TodoController.java:
@RestController @RequestMapping("/api") @CrossOrigin("*")
public class TodoController {
@Autowired private TodoRepository todoRepository;
@GetMapping("/todos")
public ResponseEntity<Map<String, Object>> getAll() {
List<Todo> todos = todoRepository.findAll();
return ResponseEntity.ok(Map.of(
"success", true,
"message", "Todos fetched!",
"data", todos,
"count", todos.size()
));
}
}
Docker Magic π³
# STAGE 1: BUILD (Temporary - Heavy)
FROM maven:3.9.6-eclipse-temurin-17-alpine AS build
WORKDIR /app
COPY . . # Copy ALL files
RUN mvn clean package -DskipTests # Build JAR
# STAGE 2: RUNTIME (Lightweight - Production)
FROM eclipse-temurin:17-jdk-alpine
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar # JAR ONLY!
EXPOSE $PORT
ENTRYPOINT ["java", "-jar", "app.jar"]
Render Deployment (EXACT Steps) π
Step 1: Create Dockerfile
Project root (same level as pom.xml):
βββ Dockerfile β EXACT name, NO extension!
Step 2: GitHub Push
git add Dockerfile
git commit -m "Add multi-stage Docker"
git push origin main
Step 3: Render.com (5 Clicks)
1. render.com β Sign up (GitHub)
2. "New +" β "Web Service"
3. Connect GitHub repo β Select branch "main"
4. βοΈ Settings:
βββ Name: firstcrud-spring
βββ Runtime: **Docker** β
βββ Build Command: (EMPTY)
βββ Start Command: (EMPTY)
5. Environment β Add Variable:
βββ Key: SPRING_DATA_MONGODB_URI
βββ Value: mongodb+srv://user:pass@cluster0...
6. "Create Web Service" β Deploy!
Step 4: Watch Magic (3-5 mins)
Render Logs:
β
Cloning GitHub repo
β
Building Docker image
β
Maven: BUILD SUCCESS
β
JAR created: 25MB
β
Deploying β LIVE!

Step 5: Test Live API
GET: https://firstcrud-spring.onrender.com/api/todos
POST: https://firstcrud-spring.onrender.com/api/todos
Auto-deploy: git push β Render LIVE in 2 mins! π
Configuration (Secure!) π
application.yml (GitHub - Safe):
spring:
data:
mongodb:
uri: ${SPRING_DATA_MONGODB_URI:mongodb://localhost:27017/todos}
server:
port: ${PORT:8080}
Local: mvn spring-boot:run -Dspring.profiles.active=local
Security Checklist β
1. Atlas: New user (delete leaked db_user)
2. Network Access: 0.0.0.0/0
3. GitHub: NO secrets (use ${ENV_VAR})
4. Render: Environment Variables
5. CORS: @CrossOrigin("*")
Live Demo π
API: https://firstcrud-spring.onrender.com/api/todos
POST Body: {"title": "Buy Milk", "status": false}
Response:
{
"success": true,
"message": "Created!",
"data": {"_id": "abc123", "title": "Buy Milk"}
}
Frontend (Vite):
VITE_API_URL=https://firstcrud-spring.onrender.com/api
fetch(`${import.meta.env.VITE_API_URL}/todos`)
Stack Cost: $0 π°
β
MongoDB Atlas: 512MB free
β
Render: 750 hours free
β
GitHub: Free
β
Docker Hub: Free
You can see the live demo project here -: https://springboottodo.vercel.app/
Github Link -: Link
(Note : Render free tier is slow due to cold start of server so if the application is not active then it takes more time to respond in that case wait for 2 to 3 minutes.)
