<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Syed Zubyl N | Software Developer - Java</title>
      <link>https://syedzubyl.space</link>
      <description>Syed Zubyl N — Software Developer focused on Java, Spring Boot, backend development, REST APIs, databases, Flutter and production-oriented applications.</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://syedzubyl.space/tags/java/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Fri, 12 Jun 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Understanding Java Backend Development by Building Real Projects</title>
          <pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate>
          <author>Syed Zubyl N</author>
          <link>https://syedzubyl.space/blog/understanding-java-backend-development/</link>
          <guid>https://syedzubyl.space/blog/understanding-java-backend-development/</guid>
          <description xml:base="https://syedzubyl.space/blog/understanding-java-backend-development/">&lt;h3 id=&quot;the-problem&quot;&gt;The Problem&lt;&#x2F;h3&gt;
&lt;p&gt;Learning Java syntax is easy. Understanding how to build a production-grade backend system is hard. Many tutorials stop at creating a simple &lt;code&gt;HelloWorldController&lt;&#x2F;code&gt;, leaving developers confused about how to structure a large application, manage dependencies, and handle complex business logic.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;context&quot;&gt;Context&lt;&#x2F;h3&gt;
&lt;p&gt;When I started diving deep into Java and Spring Boot, I wanted to move past theoretical examples and understand the actual mechanics of a production backend. How do services communicate? How do we handle transactions? Where does business logic actually live?&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-tried&quot;&gt;What I Tried&lt;&#x2F;h3&gt;
&lt;p&gt;I initially tried to learn by reading textbooks on Design Patterns and Object-Oriented Programming (OOP) in isolation. I studied Singleton, Factory, and Strategy patterns.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-failed&quot;&gt;What Failed&lt;&#x2F;h3&gt;
&lt;p&gt;While I understood the patterns conceptually, I had no idea when or why to use them in a real web server. The abstractions felt unnecessary. Writing an interface for a simple database query seemed like over-engineering when I could just write the logic directly in the controller.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-worked-technical-explanation&quot;&gt;What Worked &amp;amp; Technical Explanation&lt;&#x2F;h3&gt;
&lt;p&gt;The “aha” moment came when I stopped reading isolated examples and built a real REST API managing complex data relationships.&lt;&#x2F;p&gt;
&lt;p&gt;Suddenly, the concepts clicked:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;1. Dependency Injection (DI)&lt;&#x2F;strong&gt;
I finally understood why Spring’s &lt;code&gt;@Autowired&lt;&#x2F;code&gt; (or constructor injection) is brilliant. Instead of a Service instantiating a specific Database class (tight coupling), the framework injects it. This meant I could swap my production database repository for a Mock repository during testing without changing a single line of business logic.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;2. Interfaces and Implementations&lt;&#x2F;strong&gt;
I used an interface &lt;code&gt;PaymentProcessor&lt;&#x2F;code&gt;. In development, I injected a &lt;code&gt;MockPaymentProcessor&lt;&#x2F;code&gt;. In production, I injected a &lt;code&gt;StripePaymentProcessor&lt;&#x2F;code&gt;. The controller didn’t care; it just called &lt;code&gt;paymentProcessor.charge()&lt;&#x2F;code&gt;. This is OOP in actual practice.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;3. Exception Handling&lt;&#x2F;strong&gt;
Instead of scattering &lt;code&gt;try-catch&lt;&#x2F;code&gt; blocks everywhere, I utilized Spring’s &lt;code&gt;@ControllerAdvice&lt;&#x2F;code&gt;. I threw custom exceptions (&lt;code&gt;UserNotFoundException&lt;&#x2F;code&gt;) deep in the service layer, and a global handler automatically translated them into formatted &lt;code&gt;404 Not Found&lt;&#x2F;code&gt; JSON responses.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;lessons-learned&quot;&gt;Lessons Learned&lt;&#x2F;h3&gt;
&lt;p&gt;You cannot learn enterprise architecture by writing isolated Java classes. You learn it by encountering the pain of tightly coupled code in a growing project, and then discovering how frameworks like Spring Boot use DI and interfaces to solve that exact pain.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-i-would-do-differently&quot;&gt;What I Would Do Differently&lt;&#x2F;h3&gt;
&lt;p&gt;I would have focused on Test-Driven Development (TDD) from day one. Writing unit tests forces you to use Dependency Injection and interfaces properly. If a class is hard to test, it’s usually because it’s poorly architected. Testing is the ultimate feedback loop for good Java design.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
