<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jörg Loos</title>
    <description>The latest articles on Forem by Jörg Loos (@jrg_loos_ae4027718d64899).</description>
    <link>https://forem.com/jrg_loos_ae4027718d64899</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3846800%2Fafa7af73-94d2-467a-8bd8-5235c8e31e61.jpeg</url>
      <title>Forem: Jörg Loos</title>
      <link>https://forem.com/jrg_loos_ae4027718d64899</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jrg_loos_ae4027718d64899"/>
    <language>en</language>
    <item>
      <title>Modernizing a Legacy Java 8 Application Instead of Rewriting Everything</title>
      <dc:creator>Jörg Loos</dc:creator>
      <pubDate>Tue, 12 May 2026 15:33:43 +0000</pubDate>
      <link>https://forem.com/jrg_loos_ae4027718d64899/modernizing-a-legacy-java-8-application-instead-of-rewriting-everything-4b3h</link>
      <guid>https://forem.com/jrg_loos_ae4027718d64899/modernizing-a-legacy-java-8-application-instead-of-rewriting-everything-4b3h</guid>
      <description>&lt;p&gt;Many companies still run critical systems on Java 8 in 2026.&lt;/p&gt;

&lt;p&gt;Not because they “love old technology” — but because these systems still handle real business processes every day:&lt;br&gt;
internal tools&lt;br&gt;
ERP integrations&lt;br&gt;
warehouse systems&lt;br&gt;
finance workflows&lt;br&gt;
customer portals&lt;br&gt;
The problem is usually not that the software is old.&lt;br&gt;
The problem is that over the years the codebase became harder to maintain, deploy and extend.&lt;br&gt;
Recently I started building a public showcase project focused on legacy modernization strategies instead of full rewrites.&lt;br&gt;
Typical Legacy Problems&lt;br&gt;
The original structure intentionally simulates issues often found in older enterprise applications:&lt;br&gt;
tightly coupled services&lt;br&gt;
large controller classes&lt;br&gt;
business logic mixed everywhere&lt;br&gt;
duplicated code&lt;br&gt;
outdated dependencies&lt;br&gt;
manual deployments&lt;br&gt;
missing API structure&lt;br&gt;
weak separation of concerns&lt;br&gt;
Example:&lt;br&gt;
Java&lt;br&gt;
public class CustomerController {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public void updateCustomer(Customer customer) {

    Database db = new Database();

    db.connect();

    if(customer != null) {
        db.update(customer);
        Logger.log("Updated");
    }

    db.close();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
This kind of code works.&lt;br&gt;
But scaling and maintaining it becomes painful over time.&lt;br&gt;
Modernization Goals&lt;br&gt;
Instead of rewriting everything from scratch, I focused on incremental improvements:&lt;br&gt;
Improvements&lt;br&gt;
cleaner package structure&lt;br&gt;
service layer separation&lt;br&gt;
dependency injection&lt;br&gt;
REST API organization&lt;br&gt;
Docker support&lt;br&gt;
environment configuration&lt;br&gt;
CI/CD preparation&lt;br&gt;
better maintainability&lt;br&gt;
improved readability&lt;br&gt;
modular architecture approach&lt;br&gt;
Example Refactoring&lt;br&gt;
Before:&lt;br&gt;
Java&lt;br&gt;
public class OrderService {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public void save(Order order) {
    Connection connection = DriverManager.getConnection(...);

    // logic
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
After:&lt;br&gt;
Java&lt;br&gt;
@Service&lt;br&gt;
@RequiredArgsConstructor&lt;br&gt;
public class OrderService {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private final OrderRepository orderRepository;

public Order save(Order order) {
    return orderRepository.save(order);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
The goal is not “perfect architecture”.&lt;br&gt;
The goal is reducing technical debt step by step without breaking existing systems.&lt;br&gt;
Why Legacy Modernization Matters&lt;br&gt;
A lot of businesses cannot simply stop operations for a full rewrite.&lt;br&gt;
Incremental modernization is often more realistic:&lt;br&gt;
lower risk&lt;br&gt;
lower costs&lt;br&gt;
easier migration&lt;br&gt;
continuous operation&lt;br&gt;
better maintainability&lt;br&gt;
Especially in Java environments, many systems are still running on older stacks while businesses continue growing around them.&lt;br&gt;
Current Stack&lt;br&gt;
Backend:&lt;br&gt;
Java 8&lt;br&gt;
Spring Boot&lt;br&gt;
REST APIs&lt;br&gt;
Frontend:&lt;br&gt;
React + TypeScript&lt;br&gt;
Infrastructure:&lt;br&gt;
Docker&lt;br&gt;
Linux&lt;br&gt;
GitLab&lt;br&gt;
Nginx&lt;br&gt;
Final Thoughts&lt;br&gt;
Legacy systems are not “dead systems”.&lt;br&gt;
Most companies rely on them every single day.&lt;br&gt;
Modernizing existing software often creates more value than endlessly rebuilding everything from scratch.&lt;br&gt;
I’ll continue sharing architecture improvements, refactoring examples and modernization approaches as the project evolves.&lt;br&gt;
Portfolio: &lt;a href="//www.jloos.dev"&gt;jloos.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>java</category>
      <category>softwaredevelopment</category>
      <category>springboot</category>
    </item>
  </channel>
</rss>
