Logo

Kode$word

πŸš€ My First Spring Boot Backend

πŸš€ My First Spring Boot Backend

From Zero to Deployed API on Render via Docker file.

42 views
0
0

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.)