Para Gen Z seperti Saya mungkin bingung J2EE/Java EE/EJB itu apa. Sebelum internet dan WWW booming pada tahun 90an, sudah ada banyak bahasa pemrograman dan aplikasi yang kompleks. Seperti SAP, Aplikasi yang mengelola semua sistem perusahaan misal kepegawaian, keuangan, dan gudang. Aplikasi ini menggunakan Relasional Database SQL, dan aplikasi native sistem operasi (misal unix) untuk olah data dan antar mukanya.
Sedangkan internet sendiri sudah ada sebelum World Wide Web (WWW). Berikut timeline nya:
Tahun | Layer | Nama | Deskripsi |
1970 | Internet | NCP (Network Control Protocol) | |
1970 | Application | Telnet | |
1970 | Applicatoin | FTP | |
1980 | Internet | TCP/IP | |
1990 | Application | HTTP | World wide web |
World wide web hanya berisi situs berupa static page HTML berisi konten yang terstruktur (h1, h2, body, dll). Hyperlink (<a>) yang menyambungkan situs satu ke situslain nya. Mau mengirim pesan (CRUD) lewat web? tidak bisa karena hanya static file.
Oleh karena itu dibuatlah CGI (Common gateway interface) yang menyambungkan (gateway/jembatan) www/html dengan bahasa pemrograman.
Misal kita membuka abdillah.my.id/pesan?id=4 :
- Webserver (misal Apache) akan membuat proses baru pesan.exe yang Saya buat pakai bahasa C
- pesan.exe tersebut membaca path dan query string nya (/pesan?id=4). Lalu di ekstrak id pesan nya
- Mengambil pesan dengan id 4 dari database
- Data dari database di masukan ke layout HTML untuk dilihat user
- Output dari html nya dikirimkan dari pesan.exe ke webserver
- Webserver mengirim file html tersebut ke user.
CGI bisa pakai bahasa apa saja. Karena CGI hanya akal akalan saja, sehingga performanya tidak terlalu bagus. Sekarang umumnya cgi sudah tidak digunakan lagi. Kecuali bahasa stateless seperti PHP. Karena selain bahasa PHP, bisa langsung buka port http tanpa menggunakan webserver. Sehingga tidak perlu perantara, dan membuat proses baru setiap request masuk.
Walaupun umumnya kita juga tetap menggunakan Webserver. Namun komunikasinya menggunakan proxy (bukan CGI). Proxy seperti Apache, Nginx digunakan untuk:
- Load balancing. Karena proxy itu ringan dan cepat. Satu proxy mendistribusikan request ke banyak Aplikasi
- Cache
Contoh kode CGI menggunakan python :
# Contoh kode CGI menggunakan python. sumber : https://en.wikipedia.org/wiki/Common_Gateway_Interface
#!/usr/bin/env python3
import cgi, cgitb
input_data = cgi.FieldStorage()
print('Content-Type: text/html') # HTML is following
print('<h1>Addition Results</h1>')
num1 = int(input_data["num1"].value)
num2 = int(input_data["num2"].value)
print('<output>{0} + {1} = {2}</output>'.format(num1, num2, num1 + num2))
Pada masa itu CGI cukup banyak digunakan karena mudah. Tapi bagaimana dengan aplikasi bisnis yang kompleks? Sayangnya pilihan bahasa terbatas. Java, bahasa baru pada saat itu terlihat menjanjinkan. Karena bahasa lain seperti C++ lebih sulit. Microsoft agak telat masuk ke pasar ini(ASP/J++/C#/.NET). PHP sekarang berbeda dengan dulu, Object oriented baru ada di PHP versi 3 (1998), namepsace di PHP versi 5.3(2009).
Ada perusahaan yang menambah fitur di java (anggep saja seperti membikin framework), lalu di bungkus dengan nama Application Server. sehingga programmer tidak perlu mengurus yang ribet ribet. Contoh application server pertama adalah Weblogic(Sebelum diakuisi Bea, lalu Oracle), NetDynamic/iPlanet(Sun), Websphere(IBM).
Semua application server ini tidak compatible. Kalau kita ngoding di weblogic, tidak akan bisa dijalankan di websphere dan sebaliknya. Oleh karena itu pada tahun 1999 dibuatlah standar/spesifikasi agar Application Server ini bisa kompatible. Kalau kita ngoding lalu di build menjadi file WAR, file WAR nya ini bisa kita deploy di weblogic maupun di appilcation server lain tanpa mengubah kode. Nama standar/spesifikasi ini adalah J22E dan pada tahun 2005 ganti nama menjadi Java EE dan pada tahun 2019 ganti lagi jadi Jakarta EE.
Apa isi spesifikasi/standar J2EE?. Ada banyak. Webcontainer yang isinya Servlet dan JSP. Dan EJB Container untuk mengurus proses bisnis. Servlet ini memudah kan kita sehingga tidak perlu mengurus CGI dan Webserver lagi, serta performanya lebih cepat. Karena servlet adalah webserver. JSP isinya adalah templating engine untuk HTML. Sehingga HTML yang tadinya statis bisa dinamis berubah isinya. Tidak perlu melakukan “print(‘<h1>’, judul_1, </h1>)” atau concat concat string untuk menjadi html seperti contoh python CGI tadi.
Selain itu ada fitur seperti clustering(menjalankan aplikasi di lebih dari satu server), monitoring, connection pooling lengkap dah pokoknya. Kalau pakai CGI tadi, harus di setting lagi untuk monitoring dan clustering nya. Kalau J2EE? tinggal install app server di setiap server, sisanya semua beres diurus Application Server. Lebih mudah kan pakai J2EE?.
Tapi ada juga yang bikin pusing seperti EJB. developer merasa EJB itu overkill. Kata Rod Johnson di buku nya, 80 % fitur/teknik pada EJB sebenernya hanya untuk 20 % masalah di dunia ini. Dan kebanyakan dari kita hanya membutuhkan 20% fitur pada EJB. Sehingga lahir lah buku “Expert one to one J2EE development without EJB” yang menjadi cikal bakal lahirnya Spring Framework yang masih berjaya sampai sekarang. Komponen yang baik dari J2EE seperti webcontainer (Servlet+JSP) kita tetep pake, sedangkan yang bikin pusing seperti EJB di ganti ke alternatif yang lebih mudah, yaitu spring.
Dan sekarang application server J2EE misal Weblogic, Websphere, Glassfish, Jboss sudah jarang digunakan jika menggunakan Spring. Di Spring kita menggunakan application server Tomcat yang tidak sesuai standar J2EE karena hanya mengimplementasi spesifikasi WebContainer(Servlet+JSP), tidak ada EJB dan lain lain. Bisa dibilang lebih ringan memory dan startup nya karena tidak memuat semua kompnen J2EE yang tidak dipakai di Spring.
Misal di Spring untuk membuat Restful API kita menggunakan Spring MVC rest(alternatif dari JAX-RS di J2EE). Maka library Spring MVC Rest tersebut tidak di bundle di Application Server tomcat, melainkan akan di bundle bersama WAR/JAR aplikasi Spring nya. Untuk clustering supaya aplikasi bisa dijalankan di banyak server bagimana? Bisa memakai Autoscaling Virtual Machine dari cloud seperti AWS EC2, atau Kubernetes.
Ini spesifikasi lengkap untuk J2EE:
https://stackoverflow.com/questions/37082364/a-summary-of-all-java-ee-specifications
https://dzone.com/articles/why-its-better-to-trust-in-java-ee
Perbandingan J2EE dan Spring :
Kalau anda pensaran, silahkan kotorkan tangan anda dengan dengan download, jalankan, dan bandingkan biar lebih paham :
Sun J2EE Petstore | https://www.oracle.com/java/technologies/petstore-v1312.html |
J2EE Without EJB Petsrore (Spring) (2004) | https://www.wiley.com/en-us/Expert+One+on+One+J2EE+Development+without+EJB-p-9780764573903 |
Petsore Spring Jaman Now (2020) | https://github.com/apache/juneau-petstore |