Kembali ke Beranda
Web Development

Dari Struts ke Spring Boot: Evolusi Arsitektur Rendering Web Java Modern

Evolusi arsitektur pengembangan aplikasi web Java dari Apache Struts menuju Spring Boot. Dijelaskan bagaimana Struts mengandalkan konfigurasi XML (struts-config.xml) untuk mengatur routing dan rendering JSP, sementara Spring Boot mengadopsi pendekatan berbasis annotation dan prinsip convention over configuration. Artikel juga mengulas alasan perubahan paradigma tersebut, mulai dari kemudahan pengembangan, refactoring, hingga dukungan terhadap arsitektur modern seperti Thymeleaf, REST API, Single Page Application (SPA), dan microservices. Di akhir, disajikan perbandingan implementasi beserta contoh singkat untuk membantu developer memahami kapan masing-masing pendekatan lebih tepat digunakan.

Bagi developer Java yang telah berkecimpung sejak era 2000-an hingga awal 2010-an, nama Apache Struts tentu sudah tidak asing lagi. Pada masanya, Struts menjadi framework web Java paling populer untuk membangun aplikasi enterprise.

Namun jika sekarang kita berpindah ke Spring Boot, banyak developer yang bertanya:

"Mengapa di Spring Boot tidak ada file seperti struts-config.xml untuk mengatur halaman JSP?"

Jawabannya sederhana:

Karena filosofi desain framework telah berubah.

Artikel ini akan membahas evolusi tersebut secara mendalam, mulai dari cara kerja Struts, perubahan paradigma pada Spring MVC, hingga implementasi modern menggunakan REST API.


Sedikit Sejarah

Perjalanan framework web Java secara umum dapat digambarkan sebagai berikut.

Servlet
     │
     ▼
Apache Struts
     │
     ▼
Spring MVC
     │
     ▼
Spring Boot
     │
     ▼
REST API + SPA (React/Vue/Angular)

Setiap generasi berusaha mengurangi kompleksitas framework sebelumnya.


Bagaimana Struts Bekerja?

Pada Struts, hampir seluruh navigasi aplikasi diatur melalui file konfigurasi.

Misalnya terdapat URL:

http://server/login.do

Request tersebut tidak langsung menuju class Java.

Alurnya adalah:

Browser
    │
    ▼
login.do
    │
    ▼
struts-config.xml
    │
    ▼
LoginAction
    │
    ▼
success
    │
    ▼
login_success.jsp

Semua hubungan tersebut didefinisikan di dalam XML.

Contohnya:

<action
    path="/login"
    type="com.nirantara.LoginAction"
    name="loginForm">

    <forward
        name="success"
        path="/WEB-INF/jsp/home.jsp"/>

    <forward
        name="failed"
        path="/WEB-INF/jsp/login.jsp"/>

</action>

Kemudian Action:

public class LoginAction extends Action {

    public ActionForward execute(...) {

        if(validUser){
            return mapping.findForward("success");
        }

        return mapping.findForward("failed");
    }
}

Perhatikan bahwa Action bahkan tidak mengetahui lokasi JSP.

Ia hanya mengembalikan nama:

success

Kemudian XML yang menentukan halaman sebenarnya.


Kelebihan Pendekatan Struts

Pada masanya pendekatan ini memiliki beberapa keuntungan.

  • Seluruh routing berada di satu tempat.
  • Mudah dipahami oleh tim besar.
  • Pergantian halaman tidak perlu mengubah source Action.
  • Semua alur aplikasi dapat dibaca dari XML.

Untuk aplikasi enterprise tahun 2005-an, pendekatan ini sangat masuk akal.


Kekurangan Struts

Semakin besar aplikasi, file konfigurasi menjadi semakin sulit dipelihara.

Contoh:

struts-config.xml

500 baris
1000 baris
3000 baris
5000 baris

Sering ditemukan konfigurasi seperti:

<action path="/customerCreate"...>

<action path="/customerEdit"...>

<action path="/customerDelete"...>

<action path="/customerSearch"...>

<action path="/customerExport"...>

<action path="/customerPrint"...>

Semua berada dalam satu file besar.

Masalah lain yang sering muncul:

  • typo pada XML
  • path JSP salah
  • forward salah
  • merge conflict Git/SVN
  • sulit melakukan refactoring

XML menjadi bottleneck pengembangan.


Spring MVC Mengubah Paradigma

Spring memperkenalkan pendekatan yang jauh lebih sederhana.

Alih-alih menyimpan konfigurasi di XML, informasi tersebut ditempel langsung pada kode melalui annotation.

Contohnya:

@Controller
public class LoginController {

    @GetMapping("/login")
    public String login() {

        return "login";
    }

}

Tidak ada lagi:

  • struts-config.xml
  • action mapping XML
  • forward XML

Semuanya berada di dalam controller.


Alur Request Spring MVC

Browser
    │
    ▼
/login
    │
    ▼
DispatcherServlet
    │
    ▼
LoginController
    │
    ▼
return "login"
    │
    ▼
View Resolver
    │
    ▼
login.html

Perhatikan bahwa proses menjadi jauh lebih pendek.


View Resolver

Spring tetap memiliki konsep resolver.

Misalnya konfigurasi:

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

Controller:

@GetMapping("/dashboard")
public String dashboard() {
    return "dashboard";
}

Spring otomatis mencari:

/WEB-INF/jsp/dashboard.jsp

Controller tidak perlu mengetahui lokasi file secara penuh.


Mengapa XML Ditinggalkan?

Ada beberapa alasan utama.

1. Lebih Mudah Dibaca

Struts:

Controller
↓

XML

↓

JSP

Spring:

Controller

↓

View

Lebih sedikit "lompatan" ketika membaca source code.


2. Refactoring Lebih Mudah

IDE seperti Eclipse atau IntelliJ dapat melakukan:

  • Rename Class
  • Rename Method
  • Find Usage
  • Navigation

Karena semua hubungan berada di source Java.


3. Compile-Time Checking

Annotation dapat diperiksa compiler.

Sedangkan XML baru diketahui salah ketika aplikasi dijalankan.


4. Mengurangi Boilerplate

Bandingkan.

Struts:

Action

Form Bean

XML

Forward

JSP

Spring:

Controller

View

Jauh lebih ringkas.


Apakah Spring Boot Masih Bisa Menggunakan JSP?

Jawabannya:

Bisa.

Walaupun sekarang bukan pilihan utama.

Contoh struktur:

WEB-INF

    jsp

        home.jsp

        login.jsp

Controller:

@GetMapping("/")
public String home() {

    return "home";

}

Konfigurasi:

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

Spring tetap dapat merender JSP seperti aplikasi Java klasik.


Lalu Mengapa Banyak Orang Beralih ke Thymeleaf?

Karena lebih modern.

Contoh:

templates

    home.html

    login.html

Controller:

@GetMapping("/")
public String home(Model model){

    model.addAttribute("user","Sena");

    return "home";
}

HTML:

<h2 th:text="${user}"></h2>

Tidak perlu lagi scriptlet JSP seperti:

<%= user.getName() %>

atau

<c:forEach>

HTML tetap valid walaupun dibuka tanpa server.


Evolusi Selanjutnya: REST API

Saat ini banyak aplikasi bahkan tidak melakukan rendering HTML sama sekali.

Spring Boot hanya mengembalikan JSON.

Browser

↓

React

↓

REST API

↓

Spring Boot

↓

Database

Controller menjadi:

@RestController
public class UserController {

    @GetMapping("/users")
    public List<User> users(){

        return userService.findAll();

    }

}

Response:

[
  {
    "id":1,
    "name":"Sena"
  },
  {
    "id":2,
    "name":"Nirantara"
  }
]

Frontend bertugas membangun tampilan.


Contoh Implementasi Berdasarkan Arsitektur

1. Struts + JSP

Cocok untuk:

  • Aplikasi enterprise lama
  • Sistem pemerintahan
  • Legacy system

Alur singkat:

URL
↓

struts-config.xml
↓

Action
↓

JSP

2. Spring Boot + JSP

Cocok untuk:

  • Migrasi dari aplikasi lama
  • Intranet perusahaan
  • Sistem internal sederhana

Alur singkat:

URL
↓

Controller
↓

JSP

3. Spring Boot + Thymeleaf

Cocok untuk:

  • Admin panel
  • Dashboard internal
  • CMS
  • Portal perusahaan

Alur singkat:

URL
↓

Controller
↓

HTML (Thymeleaf)

4. Spring Boot + REST API

Cocok untuk:

  • Mobile application
  • React
  • Vue
  • Angular
  • Flutter
  • Desktop application

Alur singkat:

Browser / Mobile
↓

REST API

↓

JSON

5. Microservices

Cocok untuk:

  • Sistem berskala besar
  • Cloud Native
  • Kubernetes

Alur singkat:

Gateway

↓

REST API

↓

Service A

Service B

Service C

Masing-masing service memiliki tanggung jawab yang spesifik dan saling berkomunikasi melalui API.


Perbandingan Singkat

AspekStrutsSpring Boot
RoutingXMLAnnotation
KonfigurasiBesarMinimal
RefactoringSulitMudah
BoilerplateBanyakSedikit
ViewJSPJSP / Thymeleaf / JSON
REST APITidak alamiNative
PengembanganLebih lambatLebih cepat

Apakah Konsep Struts Salah?

Tidak.

Struts adalah hasil dari kebutuhan zamannya.

Pada era ketika annotation belum populer dan IDE belum secanggih sekarang, pendekatan XML memberikan struktur yang jelas dan terpusat.

Namun seiring berkembangnya bahasa Java, tooling, serta kebutuhan aplikasi web modern, pendekatan annotation menawarkan produktivitas yang lebih tinggi, lebih mudah dipelihara, dan lebih aman saat melakukan refactoring. Inilah alasan mengapa Spring MVC dan kemudian Spring Boot menjadi standar de facto dalam pengembangan aplikasi Java modern.


Penutup

Perbedaan terbesar antara Struts dan Spring Boot bukan sekadar hilangnya struts-config.xml, melainkan perubahan filosofi desain.

Struts berorientasi pada configuration-driven development, di mana perilaku aplikasi banyak ditentukan melalui berkas konfigurasi XML. Sebaliknya, Spring Boot mengedepankan convention over configuration, dengan memanfaatkan annotation, auto-configuration, dan konvensi yang telah disepakati sehingga developer dapat lebih fokus pada logika bisnis daripada konfigurasi.

Akibatnya, kode menjadi lebih ringkas, lebih mudah dibaca, lebih mudah diuji, dan lebih sederhana untuk dipelihara. Itulah sebabnya mayoritas proyek Java modern kini menggunakan Spring Boot sebagai fondasi utama, sementara Struts lebih banyak dijumpai pada aplikasi legacy yang masih berjalan di berbagai organisasi besar.

javaspring bootspring mvcapache strutsstrutsjspthymeleafmvcrest apijsonannotationconvention over configurationxml configurationjava webenterprise javajakarta eeservletdispatcherservletview resolvercontrollerlegacy systemmodern javamicroservicesreactvue.jsangularweb developmentbackend developmentsoftware architecturenirantara
Nirantara Logo

Published by Nirantara

Nirantara is an Indonesian Enterprise AI company specializing in Enterprise AI, RAG, Intelligent Search, and AI Automation. Article written by jsturana.

Learn more about Nirantara