Not every API should return Entity objects. Spring Boot experts use DTOs and Projections for read performance. Most developers do this: @GetMapping("/users") public List<User> getUsers() { return userRepository.findAll(); } It works… but it’s not optimal. ⸻ ❌ Problem Returning Entity: • Loads unnecessary fields • Fetches relationships lazily • Slower response • Tight coupling with DB ⸻ 🧠 Better Option 1 — DTO public class UserDto { private String name; private String email; } Mapping: return users.stream() .map(user -> new UserDto( user.getName(), user.getEmail())) .toList(); ⸻ ⚡ Best Option — Projection (Expert Way) Spring Boot supports interface-based projections: public interface UserProjection { String getName(); String getEmail(); } Repository: List<UserProjection> findAllProjectedBy(); Only required fields are fetched. ⸻ 💡 When to Use Use Entity → write operations Use DTO → API responses Use Projection → read-only optimized queries ⸻ 🧠 Expert Rule Write APIs for write flexibility Read APIs for performance ⸻ Day 18 of becoming production-ready with Spring Boot. Question: Do you use DTO or Projection for read APIs? ⸻ #Java #SpringBoot #BackendEngineering #Performance #SoftwareArchitecture
Optimize Spring Boot API Performance with DTOs and Projections
More Relevant Posts
-
In a Spring Boot application, code is structured into layers to keep things clean, maintainable, and scalable. The most common layers are Controller, Service, and Repository each with a clear responsibility. i)Controller * Entry point of the application. * Handles incoming HTTP requests (GET, POST, etc.). * Accepts request data (usually via DTOs). * Returns response to the client. ii)Service * Contains business logic. * Processes and validates data. * Converts DTO ↔ Entity. iii)Repository * Connects with the database. * Performs CRUD operations. * Works directly with Entity objects. Request Flow (Step-by-Step): Let’s understand what happens when a user sends a request: 1. Client sends request Example: `POST /users` with JSON data. 2. Controller receives request * Maps request to a method. * Accepts data in a DTO. ``` @PostMapping("/users") public UserDTO createUser(@RequestBody UserDTO userDTO) { return userService.createUser(userDTO); } ``` 3. Controller → Service * Passes DTO to Service layer. 4. Service processes data * Applies business logic. * Converts DTO → Entity. ``` User user = new User(); user.setName(userDTO.getName()); ``` 5. Service → Repository * Calls repository to save data. ``` userRepository.save(user); ``` 6. Repository → Database * Data is stored in DB. 7. Response Flow Back * Repository → Service → Controller. * Entity converted back to DTO. * Response sent to client. Why DTO is Used: * Prevents exposing internal entity structure. * Controls input/output data. * Improves security. * Keeps layers independent. Why This Architecture Matters: * Clear separation of concerns * Easier debugging & testing * Scalable and maintainable codebase #Java #Spring #SpringBoot #BackendDevelopment #SoftwareEngineering #JavaDeveloper
To view or add a comment, sign in
-
-
🚀 Spring Boot – Full Flow & Clean Architecture Today I focused on understanding the complete end-to-end flow of a Spring Boot application and how real-world backend systems are structured. 🧠 Core Flow: Client → Controller → DTO (Validation) → Service → Repository → Database → JSON Response ⚠️ Error Flow: Validation/Exception → Global Handler → Structured Error Response 💡 Key Learnings: ✔️ DTO handles validation and safe data transfer ✔️ Service layer contains business logic (application brain) ✔️ Repository interacts with the database using JPA ✔️ Global exception handling ensures clean and consistent APIs 🏗️ Project Structure (Industry Standard): controller • service • repository • dto • entity • exception • config ✨ This separation of concerns makes applications scalable, maintainable, and team-friendly. 💻 DSA Practice: • Two Sum (HashMap optimization) • Reverse string & valid palindrome 🔍 Understanding how each layer connects has given me much better clarity on building production-ready backend systems. #SpringBoot #Java #BackendDevelopment #RESTAPI #Microservices #CleanArchitecture #DSA #LearningInPublic #SoftwareEngineering
To view or add a comment, sign in
-
🚀 Day 28 – Bean Scopes: Managing Object Lifecycles the Right Way In Spring-based systems, Bean Scope defines how long an object lives and how many instances are created. It directly impacts memory usage, performance, and thread safety — making it an important architectural decision. 🔹 1. Singleton (Default Scope) ✔ One instance per Spring container ✔ Shared across the application ➡ Best for: Stateless services Utility components ⚠️ Be careful with mutable state (thread-safety concerns) 🔹 2. Prototype Scope ✔ New instance every time requested ➡ Best for: Stateful objects Short-lived processing logic ⚠️ Spring does NOT manage full lifecycle (e.g., destruction) 🔹 3. Request Scope (Web Apps) ✔ One bean per HTTP request ➡ Best for: Request-specific data User context 🔹 4. Session Scope ✔ One bean per user session ➡ Best for: User preferences Session-level caching ⚠️ Can increase memory usage if misused 🔹 5. Application Scope ✔ One bean per ServletContext ➡ Shared across the entire application lifecycle ➡ Rarely used but useful for global configs 🔹 6. Choosing the Right Scope Matters Wrong scope can lead to: ❌ Memory leaks ❌ Concurrency issues ❌ Unexpected behavior ➡ Always align scope with object responsibility & lifecycle 🔹 7. Stateless Design is King Prefer singleton + stateless beans ➡ Easier scaling ➡ Better performance ➡ Fewer concurrency bugs 🔹 8. Scope + Dependency Injection Gotcha Injecting prototype into singleton? ➡ You’ll still get a single instance unless handled properly ➡ Use ObjectFactory / Provider for dynamic resolution 🔥 Architect’s Takeaway Bean scope is not just configuration — it’s an architectural decision. Choosing the right scope ensures: ✔ Efficient memory usage ✔ Better scalability ✔ Thread-safe designs ✔ Predictable behavior 💬 Which bean scope do you use the most — and have you ever faced issues due to wrong scope? #100DaysOfJavaArchitecture #SpringBoot #BeanScopes #Java #Microservices #SystemDesign #TechLeadership
To view or add a comment, sign in
-
-
I stopped treating backend development as “just CRUD APIs” and started building systems the way they actually run in production. Recently, I designed and implemented a user management service using Spring Boot with a focus on clean architecture and real-world constraints. Instead of just making endpoints work, I focused on: • Strict layer separation (Controller → Service → Repository) • DTO-based contracts to avoid leaking internal models • Validation at the boundary using @Valid and constraint annotations • Centralized exception handling with @RestControllerAdvice • Pagination & filtering using Pageable for scalable data access • Query design using Spring Data JPA method derivation • Handling edge cases like null/empty filters and invalid pagination inputs I also implemented authentication with password hashing (BCrypt) and started integrating JWT-based stateless security. One thing that stood out during this process: Building features is easy. Designing them to be predictable, scalable, and secure is where real backend engineering begins. This project forced me to think beyond “does it work?” and start asking: How does this behave under load? What happens when input is invalid? How does the system fail? That shift in thinking changed everything. Always open to feedback and discussions around backend architecture, API design, and Spring ecosystem. #SpringBoot #BackendEngineering #Java #SystemDesign #RESTAPI #SoftwareEngineering
To view or add a comment, sign in
-
-
🚀 Mastering Spring Boot - Step by Step (Day 8) Today I explored the core layers of a Spring Boot application — the foundation of clean backend architecture. 💡 Every request in Spring Boot flows through these layers: ➡️ Controller (Presentation Layer) Handles incoming requests & returns responses ➡️ Service Layer Contains business logic & decision making ➡️ Repository (Persistence Layer) Interacts with the database 📌 What I learned today: ✔️ Presentation Layer → Uses @RestController → Handles APIs using @GetMapping, @PostMapping, etc. → Accepts input via @RequestBody, @PathVariable ✔️ Service Layer → Acts as a bridge between controller & database → Contains actual business logic → Keeps code clean & scalable ✔️ Persistence Layer (JPA) → Uses @Entity to map objects to DB tables → Uses JpaRepository for CRUD operations → Hibernate works behind the scenes ⚡ Why this matters: Without layers → messy code ❌ With layers → clean, scalable & maintainable code ✅ 💬 What I built/understood today: → How controller talks to service → How service interacts with repository → How data flows from API → DB → API 🔥 Big takeaway: Good developers write code. Great developers design clean architecture. 🎯 Next Up: Input Validation + Exception Handling #Day8 #SpringBoot #Java #BackendDevelopment #CleanArchitecture #LearningInPublic #100DaysOfCode
To view or add a comment, sign in
-
-
🚀 DAY 41/100 – Controller Design Best Practices & DTO vs Entity In backend development, writing APIs is not enough. How you structure your controllers and manage data flow defines the quality, scalability, and maintainability of your application. Two concepts that every Spring Boot developer must master early: 👉 Controller Design Best Practices 👉 DTO vs Entity separation A well-designed controller should act only as a request handler, not a business logic layer. Key principles: • Keep controllers thin (delegate logic to service layer) • Use proper HTTP methods & status codes • Validate requests using @Valid • Maintain consistent API structure (/api/v1/...) • Handle exceptions using global handlers (@RestControllerAdvice) 📘 DTO vs Entity (Critical Concept) One of the most common mistakes in early backend projects is exposing entities directly. Why this is a problem: • Security risks (sensitive fields exposed) • Tight coupling between API & database • Poor flexibility for future changes Solution: ✔ Use DTOs for request/response ✔ Keep entities internal to persistence layer ✔ Map between DTO ↔ Entity in service layer 📘 What’s Covered in the Document • Controller responsibilities & anti-patterns • DTO vs Entity deep comparison • Mapping strategies (manual + tools) • Layered architecture breakdown • Interview questions with detailed answers 📄 I’ve compiled everything into a clean, revision-friendly document with examples and code snippets. If you're preparing for Java / Spring Boot / Backend roles (0–3 YOE): 📌 Save this — these are core concepts asked in interviews 🔁 Repost — helps others learning backend fundamentals Follow Surya Mahesh Kolisetty and continue the journey with #100DaysOfBackend #Java #SpringBoot #BackendDevelopment #API #CFBR #Connections #SoftwareEngineering #InterviewPrep #Developers #Programming #LearningInPublic #CleanCode #SystemDesign
To view or add a comment, sign in
-
If your Spring Boot project looks clean, your life as a developer becomes much easier. Here is a simple way to structure a production-ready Spring Boot application. Start with the Controller layer. This is your entry point. All REST APIs come here. Keep it very thin. Only handle requests and responses. Do not write business logic here. Next is the Service layer. This is where your real logic lives. All calculations, validations, and decisions should be written here. The controller should call the service, nothing else. Then comes the Repository layer. This layer talks to the database. Use JPA repositories here. Do not write business logic in Repository. Next is Model or Entity. These are your database tables mapped as Java classes. Each entity represents one table. Now define DTOs. DTO means Data Transfer Object. This is what your API sends and receives. Never expose your Entity directly in APIs. Add a Config package. Keep all configurations here. Security setup, beans, filters, anything related to application setup. Finally, handle Exceptions properly. Create a global exception handler. Do not handle errors in every controller. One central place makes your code clean and consistent. So the flow becomes simple. Request comes to the Controller. The controller calls the Service. Service uses Repository. Repository talks to DB. Response is sent back using DTO. This structure keeps your code clean, testable, and easy to scale. #CleanCode #Spring #SpringBoot #ProjectStructure #Project #LazyProgrammer
To view or add a comment, sign in
-
-
Spring Boot in Real Projects — Day 19 We already know how APIs return data. But what happens when your application grows and starts handling hundreds or even thousands of tasks daily whether from a single user or many users? For example: User1 → 50 tasks User2 → 120 tasks User3 → 300 tasks It's simple to fetch data for user-1 and next user-2 with 120 tasks gets heavy to fetch and for the next user-3 its hard to fetch and the API response may gets slow, to solve this Pagination & Sorting come in What is Pagination? Pagination is the process of dividing data into smaller chunks (pages) and fetching only the required portion instead of loading everything at once. What is Sorting? Sorting allows us to order data based on a specific field like createdAt, title, etc. Flow Client → Controller → Pageable → Repository → Database (applies LIMIT, OFFSET, ORDER BY) → Returns Page → Response to Client #SpringBoot #Java #BackendDevelopment #Pagination #APIDesign #SoftwareEngineering
To view or add a comment, sign in
-
-
🏗️ Spring Boot Project Structure — What Actually Scales in Real Projects When working on Spring Boot applications, project structure may seem simple at the beginning. But as the project grows, a poor structure quickly turns into hard-to-maintain and messy code 😅 Over time, adopting a clean and structured approach makes a huge difference 👇 🔹 1. Controller Layer Handles API requests & responses — keep it thin, no business logic. 🔹 2. Service Layer (Interface) Defines business operations → improves flexibility & testability. 🔹 3. Service Implementation Contains core business logic → easy to modify without affecting other layers. 🔹 4. Repository Layer Handles DB operations using JPA → clean separation of persistence logic. 🔹 5. Entity Layer Represents database tables → avoid exposing entities directly in APIs. 🔹 6. DTO Layer Used for request/response → better control over API contracts. 🔹 7. Mapper Layer Converts Entity ↔ DTO → avoids repetitive code in services. 🔹 8. Configuration Layer Centralized configs (Security, CORS, Swagger, etc.). 🔹 9. Global Exception Handling Use @ControllerAdvice for consistent error responses. 🔹 10. Utility / Common Layer Reusable helpers (constants, validators, utilities). 🚀 What Changed Everything? Initially, a layer-based structure worked fine. But as the application scaled, switching to a feature-based structure (e.g., user/, payment/, expense/) made it: ✔ Easier to scale ✔ Easier to debug ✔ Easier to maintain 💡 Key Takeaways ✔ A clean structure saves time in the long run ✔ Keep layers loosely coupled ✔ Don’t mix responsibilities 👉 Good architecture isn’t overengineering — it’s future-proofing your codebase. #SpringBoot #Java #BackendDevelopment #SoftwareArchitecture #CleanCode
To view or add a comment, sign in
-
-
Day 24. My API was fast. Until it wasn't. I had this: return ResponseEntity.ok(userRepository.findAll()); 10 users in development. Works instantly. Feels perfect. Then production happened: → 50,000 users in the database → One API call loads everything → Response time: 40ms → 8 seconds → Memory spikes → API crashes That's not a performance issue. That's a design mistake. And it was there from day one. I just couldn't see it yet. That's when it clicked: Your API should never decide how much data to return. The client should. So I added pagination. (see implementation below 👇) What changed: → Performance — stable response time → Scalability — works at 100 or 100,000 rows → Stability — no memory spikes The hard truth: → findAll() works in tutorials → It breaks in production → Pagination is not an optimization — it's a requirement Fetching data is easy. Controlling how much you fetch is what makes your API scalable. Are you still using findAll() in production? 👇 Drop it below #SpringBoot #Java #BackendDevelopment #Performance #JavaDeveloper
To view or add a comment, sign in
-
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development
interface projections are underused and they give massive performance gains since Hibernate generates SELECT with only the needed columns. for write vs read API separation we use CQRS-lite where command endpoints use entities and query endpoints use projections. MapStruct for DTO mapping is also worth checking out