<?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: issam1991</title>
    <description>The latest articles on Forem by issam1991 (@issam1991).</description>
    <link>https://forem.com/issam1991</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%2F3593587%2F44784aa4-f25c-41ce-8bc7-d501412b0014.jpg</url>
      <title>Forem: issam1991</title>
      <link>https://forem.com/issam1991</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/issam1991"/>
    <language>en</language>
    <item>
      <title>Quarkus Native vs JVM: Real-World Performance Comparison</title>
      <dc:creator>issam1991</dc:creator>
      <pubDate>Mon, 17 Nov 2025 04:04:06 +0000</pubDate>
      <link>https://forem.com/issam1991/quarkus-native-vs-jvm-real-world-performance-comparison-40a4</link>
      <guid>https://forem.com/issam1991/quarkus-native-vs-jvm-real-world-performance-comparison-40a4</guid>
      <description>&lt;p&gt;Discover the real-world performance differences between Quarkus Native Image and Quarkus JVM. Compare build times, Docker image sizes, startup times, and memory usage with actual measurements from a production-ready application. Make informed decisions about which deployment option suits your use case.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Quarkus offers two primary deployment options: &lt;strong&gt;Native Image&lt;/strong&gt; (compiled ahead-of-time with GraalVM) and &lt;strong&gt;Traditional JVM&lt;/strong&gt; (running on the Java Virtual Machine). Both have their strengths, but choosing the right one depends on your specific requirements.&lt;/p&gt;

&lt;p&gt;This article presents a comprehensive, real-world comparison using the same Quarkus application built and deployed in both modes. We'll measure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build Time&lt;/strong&gt;: How long it takes to compile and package&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Image Size&lt;/strong&gt;: Final container image size&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Startup Time&lt;/strong&gt;: Application startup time (from initialization to ready state, measured by Quarkus)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Usage&lt;/strong&gt;: At startup and under load&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Artifact Size&lt;/strong&gt;: Native executable vs JAR file&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Methodology
&lt;/h2&gt;

&lt;p&gt;All measurements were taken using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Application&lt;/strong&gt;: User Management System (Quarkus 3.15.1 + Java 21)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: MariaDB 12&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container Runtime&lt;/strong&gt;: Docker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Startup Time Measurement&lt;/strong&gt;: Quarkus application logs (internal measurement)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other Measurements&lt;/strong&gt;: Docker stats and build tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Environment&lt;/strong&gt;: Windows 11, Docker Desktop, 8GB RAM allocated to Docker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST API with JAX-RS&lt;/li&gt;
&lt;li&gt;Hibernate ORM Panache for data access&lt;/li&gt;
&lt;li&gt;OpenAPI/Swagger documentation&lt;/li&gt;
&lt;li&gt;Database migrations with Flyway&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Build Time Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Native Image Build
&lt;/h3&gt;

&lt;p&gt;Building a Quarkus Native Image involves ahead-of-time compilation, which is computationally intensive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;quarkus
./mvnw &lt;span class="nt"&gt;-Pnative&lt;/span&gt; &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.native.container-build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true &lt;/span&gt;clean package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Results:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build Time&lt;/strong&gt;: ~210 seconds (3.5 minutes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process&lt;/strong&gt;: Compiles Java bytecode to native machine code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requirements&lt;/strong&gt;: GraalVM native-image compiler (runs in Docker container)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  JVM Build
&lt;/h3&gt;

&lt;p&gt;Building for JVM is a standard Java compilation process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;quarkus
./mvnw &lt;span class="nt"&gt;-Pjvm&lt;/span&gt; clean package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Results:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build Time&lt;/strong&gt;: ~15 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process&lt;/strong&gt;: Compiles Java to bytecode, packages into JAR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requirements&lt;/strong&gt;: Standard JDK&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Build Time Analysis
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Native Image&lt;/th&gt;
&lt;th&gt;JVM&lt;/th&gt;
&lt;th&gt;Difference&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Build Time&lt;/td&gt;
&lt;td&gt;~210 seconds&lt;/td&gt;
&lt;td&gt;~15 seconds&lt;/td&gt;
&lt;td&gt;195 seconds (1300% slower)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build Complexity&lt;/td&gt;
&lt;td&gt;High (AOT compilation)&lt;/td&gt;
&lt;td&gt;Low (Standard compilation)&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key Observations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native Image builds are significantly slower due to AOT compilation&lt;/li&gt;
&lt;li&gt;JVM builds are faster and more familiar to Java developers&lt;/li&gt;
&lt;li&gt;Native builds benefit from Docker layer caching&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Docker Image Size Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Native Image Dockerfile
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; quay.io/quarkus/quarkus-micro-image:2.0&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /work/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; target/*-runner /work/application/application&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["/work/application/application"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Results:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image Size&lt;/strong&gt;: 123 MB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base Image&lt;/strong&gt;: &lt;code&gt;quarkus-micro-image:2.0&lt;/code&gt; (minimal UBI-based image)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contents&lt;/strong&gt;: Native executable only&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  JVM Dockerfile
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; eclipse-temurin:21-jre-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /work/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; target/quarkus-app /work/application&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["java", "-jar", "/work/application/quarkus-run.jar"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Results:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image Size&lt;/strong&gt;: 254 MB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base Image&lt;/strong&gt;: &lt;code&gt;eclipse-temurin:21-jre-alpine&lt;/code&gt; (Alpine Linux with JRE)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contents&lt;/strong&gt;: JAR file + JRE&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Image Size Analysis
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Native Image&lt;/th&gt;
&lt;th&gt;JVM&lt;/th&gt;
&lt;th&gt;Difference&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Docker Image Size&lt;/td&gt;
&lt;td&gt;123 MB&lt;/td&gt;
&lt;td&gt;254 MB&lt;/td&gt;
&lt;td&gt;131 MB (107% larger for JVM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Base Image&lt;/td&gt;
&lt;td&gt;Minimal UBI&lt;/td&gt;
&lt;td&gt;Alpine + JRE&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application Artifact&lt;/td&gt;
&lt;td&gt;Native executable&lt;/td&gt;
&lt;td&gt;JAR + dependencies&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key Observations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native images are typically smaller (no JRE included)&lt;/li&gt;
&lt;li&gt;JVM images include the full JRE runtime&lt;/li&gt;
&lt;li&gt;Alpine base images help reduce JVM image size&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Startup Time Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Native Image Startup
&lt;/h3&gt;

&lt;p&gt;Native executables start almost instantly because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No JVM initialization&lt;/li&gt;
&lt;li&gt;No class loading&lt;/li&gt;
&lt;li&gt;No JIT compilation&lt;/li&gt;
&lt;li&gt;Pre-compiled machine code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Results:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Startup Time&lt;/strong&gt;: &lt;strong&gt;0.079 s (79 ms)&lt;/strong&gt; (from Quarkus application logs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Actual Log Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;quarkus-app  | 2025-11-16 23:09:36,900 INFO  [io.quarkus] (main) quarkus-native-users 1.0.0-SNAPSHOT native (powered by Quarkus 3.15.1) started in 0.079s. Listening on: http://0.0.0.0:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  JVM Startup
&lt;/h3&gt;

&lt;p&gt;JVM applications take longer to start because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JVM initialization&lt;/li&gt;
&lt;li&gt;Class loading&lt;/li&gt;
&lt;li&gt;JIT compilation (happens at runtime)&lt;/li&gt;
&lt;li&gt;Warmup period&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Results:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Startup Time&lt;/strong&gt;: &lt;strong&gt;2.292 s&lt;/strong&gt; (from Quarkus application logs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Actual Log Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;quarkus-jvm-app | 2025-11-16 23:11:45,553 INFO  [io.quarkus] (main) quarkus-native-users 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.15.1) started in 2.292s. Listening on: http://0.0.0.0:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; These startup times are measured by Quarkus itself and represent the actual application startup time (from application initialization to ready state), which is more accurate than external measurements that include container startup overhead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Startup Time Analysis
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Native Image&lt;/th&gt;
&lt;th&gt;JVM&lt;/th&gt;
&lt;th&gt;Difference&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Startup Time&lt;/td&gt;
&lt;td&gt;0.079 s (79 ms)&lt;/td&gt;
&lt;td&gt;2.292 s&lt;/td&gt;
&lt;td&gt;2.213 s (~29x faster for Native)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cold Start&lt;/td&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;td&gt;Requires warmup&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First Request&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Slower (JIT not warmed up)&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key Observations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native Image starts &lt;strong&gt;significantly faster&lt;/strong&gt; (often 10-100x faster)&lt;/li&gt;
&lt;li&gt;JVM requires warmup time for optimal performance&lt;/li&gt;
&lt;li&gt;Native Image is ideal for serverless and short-lived containers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Memory Usage Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Memory at Startup
&lt;/h3&gt;

&lt;p&gt;Memory usage immediately after application startup:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Native Image:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory Usage&lt;/strong&gt;: &lt;strong&gt;16.27 MiB&lt;/strong&gt; (at startup, measured from Docker stats)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container Limit&lt;/strong&gt;: 64 MiB (25.43% utilization)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Components&lt;/strong&gt;: Native executable, minimal runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;JVM:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory Usage&lt;/strong&gt;: &lt;strong&gt;113.5 MiB&lt;/strong&gt; (at startup, measured from Docker stats)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container Limit&lt;/strong&gt;: 128 MiB (88.69% utilization)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Components&lt;/strong&gt;: JVM heap, metaspace, code cache, JIT compiler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real Docker Stats Output (JVM at Startup):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CONTAINER ID   NAME               MEM USAGE / LIMIT     MEM %
40292f4fa0a6   quarkus-jvm-app    113.5MiB / 128MiB     88.69%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real Docker Stats Output (Native at Startup):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CONTAINER ID   NAME               MEM USAGE / LIMIT     MEM %
435d098f0299   quarkus-app        16.27MiB / 64MiB      25.43%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Memory Under Load
&lt;/h3&gt;

&lt;p&gt;Memory usage after handling API requests:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Native Image:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory Usage&lt;/strong&gt;: &lt;strong&gt;26.71 MiB&lt;/strong&gt; (under load, after creating users)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container Limit&lt;/strong&gt;: 64 MiB (41.74% utilization)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growth&lt;/strong&gt;: ~10.44 MiB from startup (from 16.27 MiB baseline)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real Docker Stats Output (Native Under Load):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CONTAINER ID   NAME               MEM USAGE / LIMIT     MEM %
435d098f0299   quarkus-app        26.71MiB / 64MiB      41.74%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;JVM:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory Usage&lt;/strong&gt;: &lt;strong&gt;122.6 MiB&lt;/strong&gt; (under load, after creating users)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container Limit&lt;/strong&gt;: 128 MiB (95.76% utilization)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growth&lt;/strong&gt;: ~9.1 MiB from startup (from 113.5 MiB baseline)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real Docker Stats Output (JVM Under Load):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CONTAINER ID   NAME               MEM USAGE / LIMIT     MEM %
40292f4fa0a6   quarkus-jvm-app    122.6MiB / 128MiB    95.76%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Memory Analysis
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Native Image&lt;/th&gt;
&lt;th&gt;JVM&lt;/th&gt;
&lt;th&gt;Difference&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Memory at Startup&lt;/td&gt;
&lt;td&gt;16.27 MiB&lt;/td&gt;
&lt;td&gt;113.5 MiB&lt;/td&gt;
&lt;td&gt;97.23 MiB (~86% less for Native)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory under Load&lt;/td&gt;
&lt;td&gt;26.71 MiB&lt;/td&gt;
&lt;td&gt;122.6 MiB&lt;/td&gt;
&lt;td&gt;95.89 MiB (~78% less for Native)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory Growth&lt;/td&gt;
&lt;td&gt;~10.44 MiB&lt;/td&gt;
&lt;td&gt;~9.1 MiB&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key Observations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native Image uses &lt;strong&gt;86% less memory&lt;/strong&gt; at startup (16.27 MiB vs 113.5 MiB)&lt;/li&gt;
&lt;li&gt;Under load, Native uses &lt;strong&gt;78% less memory&lt;/strong&gt; (26.71 MiB vs 122.6 MiB)&lt;/li&gt;
&lt;li&gt;Native Image grows by ~10.44 MiB under load, while JVM grows by ~9.1 MiB&lt;/li&gt;
&lt;li&gt;JVM has significant overhead from JIT compiler, code cache, and runtime structures&lt;/li&gt;
&lt;li&gt;Native Image uses only 25.43% of its 64MB limit at startup and 41.74% under load&lt;/li&gt;
&lt;li&gt;JVM uses 88.69% of its 128MB limit at startup and 95.76% under load&lt;/li&gt;
&lt;li&gt;JVM reaches 95.76% of its 128MB limit under load, leaving minimal headroom&lt;/li&gt;
&lt;li&gt;Native Image maintains significant headroom (58.26% available) even under load&lt;/li&gt;
&lt;li&gt;Native Image is ideal for memory-constrained environments&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Build Artifact Size
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Native Executable
&lt;/h3&gt;

&lt;p&gt;The compiled native executable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Size&lt;/strong&gt;: ~98.65 MB (native executable)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location&lt;/strong&gt;: &lt;code&gt;target/*-runner&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type&lt;/strong&gt;: Platform-specific binary&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  JVM JAR
&lt;/h3&gt;

&lt;p&gt;The packaged JAR file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Size&lt;/strong&gt;: ~48.67 MB (quarkus-app directory total)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location&lt;/strong&gt;: &lt;code&gt;target/quarkus-app/quarkus-run.jar&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type&lt;/strong&gt;: Java bytecode archive&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Artifact Size Analysis
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Native Executable&lt;/th&gt;
&lt;th&gt;JVM JAR&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;~99 MB&lt;/td&gt;
&lt;td&gt;~49 MB&lt;/td&gt;
&lt;td&gt;Native executable is larger but includes everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portability&lt;/td&gt;
&lt;td&gt;Platform-specific&lt;/td&gt;
&lt;td&gt;Cross-platform&lt;/td&gt;
&lt;td&gt;JAR runs on any JVM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance Summary
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Quick Comparison Table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Native Image&lt;/th&gt;
&lt;th&gt;JVM&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Build Time&lt;/td&gt;
&lt;td&gt;~210s (3.5 min)&lt;/td&gt;
&lt;td&gt;~15s&lt;/td&gt;
&lt;td&gt;JVM (14x faster)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker Image Size&lt;/td&gt;
&lt;td&gt;123 MB&lt;/td&gt;
&lt;td&gt;254 MB&lt;/td&gt;
&lt;td&gt;Native (52% smaller)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Startup Time&lt;/td&gt;
&lt;td&gt;0.079 s (79 ms)&lt;/td&gt;
&lt;td&gt;2.292 s&lt;/td&gt;
&lt;td&gt;Native (~29x faster)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory (Startup)&lt;/td&gt;
&lt;td&gt;16.27 MiB&lt;/td&gt;
&lt;td&gt;113.5 MiB&lt;/td&gt;
&lt;td&gt;Native (86% less)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory (Load)&lt;/td&gt;
&lt;td&gt;26.71 MiB&lt;/td&gt;
&lt;td&gt;122.6 MiB&lt;/td&gt;
&lt;td&gt;Native (78% less)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime Performance&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Excellent (after warmup)&lt;/td&gt;
&lt;td&gt;JVM (long-term)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When to Use Native Image
&lt;/h2&gt;

&lt;p&gt;Choose Native Image when:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Fast startup is critical&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serverless functions (AWS Lambda, Azure Functions)&lt;/li&gt;
&lt;li&gt;Microservices with frequent scaling&lt;/li&gt;
&lt;li&gt;Short-lived containers&lt;/li&gt;
&lt;li&gt;Kubernetes with aggressive scaling policies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Memory is constrained&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edge computing devices&lt;/li&gt;
&lt;li&gt;Resource-limited environments&lt;/li&gt;
&lt;li&gt;High-density deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Cold start performance matters&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Applications with infrequent traffic&lt;/li&gt;
&lt;li&gt;Batch processing jobs&lt;/li&gt;
&lt;li&gt;Scheduled tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Smaller deployments&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduced image sizes&lt;/li&gt;
&lt;li&gt;Faster container pulls&lt;/li&gt;
&lt;li&gt;Lower storage costs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to Use JVM
&lt;/h2&gt;

&lt;p&gt;Choose JVM when:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Build time is a concern&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frequent deployments&lt;/li&gt;
&lt;li&gt;CI/CD pipeline speed matters&lt;/li&gt;
&lt;li&gt;Development iterations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Maximum runtime performance needed&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long-running applications&lt;/li&gt;
&lt;li&gt;High-throughput systems&lt;/li&gt;
&lt;li&gt;After JIT warmup, JVM can outperform native&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Easier debugging and profiling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standard Java tooling works&lt;/li&gt;
&lt;li&gt;JVM profilers (JProfiler, VisualVM)&lt;/li&gt;
&lt;li&gt;Better reflection and dynamic features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Complex reflection/dynamic code&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frameworks with heavy reflection&lt;/li&gt;
&lt;li&gt;Dynamic class loading&lt;/li&gt;
&lt;li&gt;Some libraries not fully native-compatible&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configuration Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Building Native Image
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;quarkus
./mvnw &lt;span class="nt"&gt;-Pnative&lt;/span&gt; &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.native.container-build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.container-image.build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.container-image.name&lt;span class="o"&gt;=&lt;/span&gt;quarkus-native-users &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.container-image.tag&lt;span class="o"&gt;=&lt;/span&gt;latest &lt;span class="se"&gt;\&lt;/span&gt;
  clean package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Building JVM Image
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;quarkus
./mvnw &lt;span class="nt"&gt;-Pjvm&lt;/span&gt; &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.container-image.build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.container-image.name&lt;span class="o"&gt;=&lt;/span&gt;quarkus-jvm-users &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.container-image.tag&lt;span class="o"&gt;=&lt;/span&gt;latest &lt;span class="se"&gt;\&lt;/span&gt;
  clean package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Docker Compose
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Native:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;JVM:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose &lt;span class="nt"&gt;-f&lt;/span&gt; docker-compose.jvm.yml up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Serverless Functions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Native Image&lt;/strong&gt; is ideal for serverless:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ultra-fast cold starts&lt;/li&gt;
&lt;li&gt;Minimal memory footprint&lt;/li&gt;
&lt;li&gt;Cost-effective (pay per invocation)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Microservices
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Both&lt;/strong&gt; can work, but consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native&lt;/strong&gt;: If you need fast scaling and low memory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JVM&lt;/strong&gt;: If you have long-running services and need maximum throughput&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Batch Processing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Native Image&lt;/strong&gt; excels for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Short-lived batch jobs&lt;/li&gt;
&lt;li&gt;Scheduled tasks&lt;/li&gt;
&lt;li&gt;One-time processing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Traditional Web Applications
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;JVM&lt;/strong&gt; is often better for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long-running applications&lt;/li&gt;
&lt;li&gt;High-traffic websites&lt;/li&gt;
&lt;li&gt;Applications benefiting from JIT optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Both Quarkus Native Image and JVM have their place in modern Java development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native Image&lt;/strong&gt; wins on startup time, memory usage, and image size&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JVM&lt;/strong&gt; wins on build time, long-term performance (after warmup), and developer experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The choice depends on your specific requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Choose Native Image&lt;/strong&gt; for serverless, microservices with frequent scaling, and memory-constrained environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose JVM&lt;/strong&gt; for traditional applications, maximum runtime performance, and faster development cycles&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Native Image&lt;/strong&gt; offers ~29x faster startup (0.079s vs 2.292s) and 86% less memory at startup (16.27 MiB vs 113.5 MiB)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JVM&lt;/strong&gt; offers 14x faster builds (~15s vs ~210s) and better long-term performance after warmup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native Image&lt;/strong&gt; produces 52% smaller Docker images (123MB vs 254MB)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Both&lt;/strong&gt; are production-ready and well-supported by Quarkus&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure&lt;/strong&gt; your specific use case to make the best decision&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://quarkus.io/guides/building-native-image" rel="noopener noreferrer"&gt;Quarkus Native Image Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.graalvm.org/latest/reference-manual/native-image/" rel="noopener noreferrer"&gt;GraalVM Native Image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/issam1991/quarkus-native-angular-sample/tree/quarkus-jvm" rel="noopener noreferrer"&gt;Project Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;em&gt;Follow me on &lt;a href="https://github.com/issam1991" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and connect with &lt;a href="https://www.linkedin.com/company/fortekadvisor?trk=public_post_feed-actor-name" rel="noopener noreferrer"&gt;ForTek Advisor&lt;/a&gt; for more technical content and project updates.&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Originally published at &lt;a href="https://fortek-advisor.com" rel="noopener noreferrer"&gt;https://fortek-advisor.com&lt;/a&gt; on November 17, 2025.&lt;/p&gt;

</description>
      <category>quarkus</category>
      <category>java</category>
      <category>graalvm</category>
      <category>performance</category>
    </item>
    <item>
      <title>Crafting High-Performance Full-Stack Applications: Quarkus Native and Angular</title>
      <dc:creator>issam1991</dc:creator>
      <pubDate>Thu, 06 Nov 2025 02:56:36 +0000</pubDate>
      <link>https://forem.com/issam1991/crafting-high-performance-full-stack-applications-quarkus-native-and-angular-2eif</link>
      <guid>https://forem.com/issam1991/crafting-high-performance-full-stack-applications-quarkus-native-and-angular-2eif</guid>
      <description>&lt;p&gt;&lt;em&gt;Quick summary: How I built a production-grade full-stack app with ultra-fast startup and superior memory efficiency (20.72MiB backend + 2.625MiB frontend = ~23MiB total at startup) using Quarkus Native Image - 58% better than Spring Boot Native!&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 The Problem: Slow Java Application Startup
&lt;/h2&gt;

&lt;p&gt;Traditional Java applications are notorious for their slow startup times. A typical Java application can take 3-5 seconds to start, which becomes a significant bottleneck in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microservices architectures&lt;/strong&gt; where you need rapid scaling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serverless environments&lt;/strong&gt; where cold starts matter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development workflows&lt;/strong&gt; where you restart frequently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud deployments&lt;/strong&gt; where startup time affects user experience&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 The Solution: Quarkus + GraalVM Native Image
&lt;/h2&gt;

&lt;p&gt;Enter &lt;strong&gt;Quarkus&lt;/strong&gt; - the Supersonic Subatomic Java framework designed for cloud-native applications, combined with &lt;strong&gt;GraalVM Native Image&lt;/strong&gt; - a technology that compiles Java applications ahead-of-time into native executables. The results are astonishing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Startup time&lt;/strong&gt;: ~47ms vs ~3-5 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory footprint&lt;/strong&gt;: &lt;strong&gt;20.72MiB&lt;/strong&gt; backend at startup (58% less than Spring Boot Native's 50MiB!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend efficiency&lt;/strong&gt;: &lt;strong&gt;2.625MiB&lt;/strong&gt; with nginx at startup (vs 15.89 MiB with Node.js Alpine + http-server)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total application&lt;/strong&gt;: &lt;strong&gt;~23MiB&lt;/strong&gt; at startup (excluding database)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant scaling&lt;/strong&gt;: Perfect for cloud-native applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer experience&lt;/strong&gt;: Hot reload in development, optimized for production&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🏗️ Project Architecture
&lt;/h2&gt;

&lt;p&gt;I built a complete user management system with the following stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  ┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
  │   Angular 20+   │    │    Quarkus 3    │    │    MariaDB      │
  │   Frontend      │◄──►│   Native Image  │◄──►│    Database     │
  │   (Port 4200)   │    │   (Port 8080)   │    │   (Port 3306)   │
  └─────────────────┘    └─────────────────┘    └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Technology Stack:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Quarkus 3.15.1 + Java 21 + GraalVM Native Image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Angular 20.3.0 + TypeScript + Server-Side Rendering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: MariaDB with Hibernate ORM Panache&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containerization&lt;/strong&gt;: Docker + Docker Compose&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Documentation&lt;/strong&gt;: OpenAPI 3.0 / Swagger UI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔧 Implementation Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Backend Setup with Native Image Support
&lt;/h3&gt;

&lt;p&gt;Quarkus makes native compilation incredibly straightforward. I configured the Maven project with native support:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;  &lt;span class="nt"&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;quarkus.platform.version&amp;gt;&lt;/span&gt;3.15.1&lt;span class="nt"&gt;&amp;lt;/quarkus.platform.version&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;maven.compiler.release&amp;gt;&lt;/span&gt;21&lt;span class="nt"&gt;&amp;lt;/maven.compiler.release&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/properties&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;profiles&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;profile&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;native&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;quarkus.native.enabled&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/quarkus.native.enabled&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;quarkus.native.container-build&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/quarkus.native.container-build&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;quarkus.container-image.build&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/quarkus.container-image.build&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/properties&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/profile&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/profiles&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. User Entity with Panache
&lt;/h3&gt;

&lt;p&gt;Quarkus Panache makes data access incredibly simple. No need for repositories - the entity itself provides all CRUD operations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;  &lt;span class="nd"&gt;@Entity&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;PanacheEntity&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

      &lt;span class="nd"&gt;@Column&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nullable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

      &lt;span class="nd"&gt;@Column&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nullable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unique&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! No getters, setters, or repository interface needed. Panache provides all the methods like &lt;code&gt;User.listAll()&lt;/code&gt;, &lt;code&gt;User.findById()&lt;/code&gt;, &lt;code&gt;user.persist()&lt;/code&gt;, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. REST API Resource (JAX-RS)
&lt;/h3&gt;

&lt;p&gt;The REST API uses JAX-RS with Quarkus's RESTEasy Reactive for optimal performance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;  &lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/users"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nd"&gt;@Produces&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION_JSON&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nd"&gt;@Consumes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION_JSON&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserResource&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

      &lt;span class="nd"&gt;@GET&lt;/span&gt;
      &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listAll&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;

      &lt;span class="nd"&gt;@GET&lt;/span&gt;
      &lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/{id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="nf"&gt;byId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathParam&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NotFoundException&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;

      &lt;span class="nd"&gt;@POST&lt;/span&gt;
      &lt;span class="nd"&gt;@Transactional&lt;/span&gt;
      &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;dto&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;firstResult&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
              &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BadRequestException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"User with email already exists"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
          &lt;span class="n"&gt;dto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;persist&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dto&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;

      &lt;span class="nd"&gt;@PUT&lt;/span&gt;
      &lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/{id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nd"&gt;@Transactional&lt;/span&gt;
      &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathParam&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;dto&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NotFoundException&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
          &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
          &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;

      &lt;span class="nd"&gt;@DELETE&lt;/span&gt;
      &lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/{id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nd"&gt;@Transactional&lt;/span&gt;
      &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathParam&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deleteById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NotFoundException&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Angular Frontend with Modern Architecture
&lt;/h3&gt;

&lt;p&gt;I used Angular 20's standalone components for a modern, lightweight approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;UserListComponent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;styleUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User Management Application&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Service Layer for API Communication
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;providedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;apiUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:8080/api/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HttpClient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;getAllUsers&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UserRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Additional CRUD operations...&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📊 Performance Results
&lt;/h2&gt;

&lt;p&gt;The performance improvements were dramatic, and when compared to Spring Boot Native, Quarkus shows even better resource efficiency:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance Comparison (Native Images):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Startup Time:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traditional JVM: 3.2 seconds
&lt;/li&gt;
&lt;li&gt;Spring Boot Native: ~50ms
&lt;/li&gt;
&lt;li&gt;Quarkus Native: ~47ms
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Quarkus Advantage:&lt;/em&gt; Comparable startup, but simpler configuration&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Memory Usage (Backend):&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traditional JVM: 245 MB
&lt;/li&gt;
&lt;li&gt;Spring Boot Native: &lt;strong&gt;50 MiB&lt;/strong&gt; (at startup)
&lt;/li&gt;
&lt;li&gt;Quarkus Native: &lt;strong&gt;20.72 MiB&lt;/strong&gt; (at startup), &lt;strong&gt;28 MiB&lt;/strong&gt; (under load)
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Quarkus Advantage:&lt;/em&gt; &lt;strong&gt;58% less at startup&lt;/strong&gt;, &lt;strong&gt;44% less under load&lt;/strong&gt; compared to Spring Boot Native!&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;First Request:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traditional JVM: 4.1 seconds
&lt;/li&gt;
&lt;li&gt;Native Images: ~89ms
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Improvement:&lt;/em&gt; &lt;strong&gt;97.8% faster&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Cold Start:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traditional JVM: 5.2 seconds
&lt;/li&gt;
&lt;li&gt;Native Images: ~67ms
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Improvement:&lt;/em&gt; &lt;strong&gt;98.7% faster&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐳 Real Docker Performance Metrics
&lt;/h3&gt;

&lt;p&gt;Here are the &lt;strong&gt;actual production Docker stats&lt;/strong&gt; from our running Quarkus Native full-stack application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  CONTAINER ID   NAME               CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O   PIDS
  5facbc5751f3   quarkus-app        0.00%     20.72MiB / 64MiB      32.37%    4.79kB / 5.31kB   0B / 0B     13
  4ba659835ac3   quarkus-frontend   0.00%     2.625MiB / 7.604GiB   0.03%     746B / 0B         0B / 0B     2
  c1beedaca839   quarkus-mariadb    1.51%     131.4MiB / 7.604GiB  1.69%     6.88kB / 4kB      0B / 0B     10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Observations - Why Quarkus Excels:&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Backend Performance (quarkus-app):
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory Usage at startup&lt;/strong&gt;: &lt;strong&gt;20.72 MiB&lt;/strong&gt; - &lt;strong&gt;58% better than Spring Boot Native&lt;/strong&gt; (which uses 50 MiB)!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Usage under load&lt;/strong&gt; (when creating a user): &lt;strong&gt;28 MiB&lt;/strong&gt; - Still &lt;strong&gt;44% better than Spring Boot Native&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU Usage&lt;/strong&gt;: &lt;strong&gt;0.00%&lt;/strong&gt; - virtually idle, extremely low resource consumption&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Efficiency&lt;/strong&gt;: Uses only &lt;strong&gt;32.37%&lt;/strong&gt; of allocated 64MB limit at startup, ~44% under load (leaving plenty of headroom)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process Count&lt;/strong&gt;: Just &lt;strong&gt;13 processes&lt;/strong&gt; - minimal overhead&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network I/O&lt;/strong&gt;: Minimal network activity (4.79kB/5.31kB)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Frontend Performance (nginx):
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory Usage at startup&lt;/strong&gt;: &lt;strong&gt;2.625 MiB&lt;/strong&gt; - This is the power of serving Angular with nginx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU Usage&lt;/strong&gt;: &lt;strong&gt;0.00%&lt;/strong&gt; - virtually idle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process Count&lt;/strong&gt;: Just &lt;strong&gt;2 processes&lt;/strong&gt; - ultra-lightweight&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Compare this to a Node.js server (Alpine with http-server) which uses 15.89 MiB for serving the same Angular app - that's 6x more memory!&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Full Stack Total:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend (Quarkus)&lt;/strong&gt;: 20.72 MiB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend (nginx)&lt;/strong&gt;: 2.625 MiB
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total Application&lt;/strong&gt;: &lt;strong&gt;~23 MiB&lt;/strong&gt; (excluding database)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vs Spring Boot Native&lt;/strong&gt;: ~50 MiB backend alone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This real-world data confirms that &lt;strong&gt;Quarkus Native Image not only matches Spring Boot Native performance but actually uses 58% less memory at startup and 44% less under load&lt;/strong&gt; - making it the superior choice for resource-constrained environments and cloud-native deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory Growth Analysis:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Startup&lt;/strong&gt;: 20.72 MiB (idle state)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Under load&lt;/strong&gt; (creating users): 28 MiB (active processing)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory increase&lt;/strong&gt;: Only ~7.3 MiB increase during active operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Still below Spring Boot&lt;/strong&gt;: Even under load, Quarkus uses 22 MiB less than Spring Boot Native's baseline&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🐳 Docker Deployment
&lt;/h2&gt;

&lt;p&gt;I containerized the entire application for easy deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;mariadb&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mariadb:12&lt;/span&gt;
      &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;userdb&lt;/span&gt;
        &lt;span class="na"&gt;MYSQL_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appuser&lt;/span&gt;
        &lt;span class="na"&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apppassword&lt;/span&gt;
      &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3306:3306"&lt;/span&gt;

    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;quarkus-native-users:latest&lt;/span&gt;
      &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;mariadb&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_healthy&lt;/span&gt;
      &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;QUARKUS_DATASOURCE_JDBC_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jdbc:mariadb://mariadb:3306/userdb&lt;/span&gt;
        &lt;span class="na"&gt;QUARKUS_DATASOURCE_USERNAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appuser&lt;/span&gt;
        &lt;span class="na"&gt;QUARKUS_DATASOURCE_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apppassword&lt;/span&gt;
      &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;

    &lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./front&lt;/span&gt;
        &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;
      &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4200:80"&lt;/span&gt;
      &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
      &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;API_URL=http://app:8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Building and Running
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Backend (Native Image)
&lt;/h3&gt;

&lt;p&gt;Quarkus makes building native images straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="c"&gt;# Development mode with hot reload&lt;/span&gt;
  &lt;span class="nb"&gt;cd &lt;/span&gt;quarkus
  ./mvnw quarkus:dev

  &lt;span class="c"&gt;# Build native executable&lt;/span&gt;
  ./mvnw clean package &lt;span class="nt"&gt;-Pnative&lt;/span&gt; &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.native.container-build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;

  &lt;span class="c"&gt;# Build native Docker image directly&lt;/span&gt;
  ./mvnw clean package &lt;span class="nt"&gt;-Pnative&lt;/span&gt; &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.native.container-build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.container-image.build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.container-image.name&lt;span class="o"&gt;=&lt;/span&gt;quarkus-native-users &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.container-image.tag&lt;span class="o"&gt;=&lt;/span&gt;latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run Full Stack with Docker Compose
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="c"&gt;# First, build the native Docker image&lt;/span&gt;
  &lt;span class="nb"&gt;cd &lt;/span&gt;quarkus
  ./mvnw &lt;span class="nt"&gt;-Pnative&lt;/span&gt; &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.native.container-build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.container-image.build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.container-image.name&lt;span class="o"&gt;=&lt;/span&gt;quarkus-native-users &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.container-image.tag&lt;span class="o"&gt;=&lt;/span&gt;latest clean package

  &lt;span class="c"&gt;# Then start all services&lt;/span&gt;
  &lt;span class="nb"&gt;cd&lt;/span&gt; ..
  docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;cd &lt;/span&gt;front
  npm &lt;span class="nb"&gt;install
  &lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;💡 Pro Tip: Use nginx instead of Node.js for production frontend serving&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For production deployments, use nginx to serve your Angular build instead of running a Node.js server. Even when using Node.js with Alpine base image and http-server (the smallest Node.js option), nginx is significantly more efficient:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;  &lt;span class="c"&gt;# front/Dockerfile&lt;/span&gt;
  &lt;span class="c"&gt;# Build stage&lt;/span&gt;
  FROM node:20-alpine AS build

  WORKDIR /app

  &lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
  COPY package*.json ./
  RUN npm ci

  &lt;span class="c"&gt;# Build application&lt;/span&gt;
  COPY . .
  RUN npm run build

  &lt;span class="c"&gt;# Production stage&lt;/span&gt;
  FROM nginx:alpine

  &lt;span class="c"&gt;# Copy Angular build and nginx config&lt;/span&gt;
  COPY --from=build /app/dist/user-management/browser /usr/share/nginx/html
  COPY nginx.conf /etc/nginx/nginx.conf

  &lt;span class="c"&gt;# Handle Angular's CSR (Client-Side Rendering) build output&lt;/span&gt;
  &lt;span class="c"&gt;# Angular generates index.csr.html for CSR builds, but nginx expects index.html&lt;/span&gt;
  RUN if [ -f /usr/share/nginx/html/index.csr.html ]; then \
      cp /usr/share/nginx/html/index.csr.html /usr/share/nginx/html/index.html; \
      fi

  EXPOSE 80

  CMD ["nginx", "-g", "daemon off;"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nginx.conf:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;  &lt;span class="c1"&gt;# front/nginx.conf&lt;/span&gt;
  &lt;span class="k"&gt;events&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kn"&gt;worker_connections&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;http&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="n"&gt;/etc/nginx/mime.types&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kn"&gt;default_type&lt;/span&gt; &lt;span class="nc"&gt;application/octet-stream&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="kn"&gt;sendfile&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kn"&gt;gzip&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kn"&gt;gzip_types&lt;/span&gt; &lt;span class="nc"&gt;text/plain&lt;/span&gt; &lt;span class="nc"&gt;text/css&lt;/span&gt; &lt;span class="nc"&gt;application/json&lt;/span&gt; &lt;span class="nc"&gt;application/javascript&lt;/span&gt; &lt;span class="nc"&gt;text/xml&lt;/span&gt; &lt;span class="nc"&gt;application/xml&lt;/span&gt; &lt;span class="nc"&gt;text/javascript&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/usr/share/nginx/html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

          &lt;span class="c1"&gt;# Proxy API requests to backend&lt;/span&gt;
          &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/api/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://app:8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;

          &lt;span class="c1"&gt;# Angular routing - serve index.html for all routes&lt;/span&gt;
          &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="n"&gt;/index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;

          &lt;span class="c1"&gt;# Cache static assets&lt;/span&gt;
          &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)&lt;/span&gt;$ &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="kn"&gt;expires&lt;/span&gt; &lt;span class="s"&gt;1y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Cache-Control&lt;/span&gt; &lt;span class="s"&gt;"public,&lt;/span&gt; &lt;span class="s"&gt;immutable"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefits of nginx (Proven with Real Data):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We built both versions to compare (Node.js uses Alpine base image with http-server for fair comparison):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;nginx&lt;/th&gt;
&lt;th&gt;Node.js (Alpine + http-server)&lt;/th&gt;
&lt;th&gt;Advantage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Image Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;53.2 MB&lt;/td&gt;
&lt;td&gt;141 MB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;62% smaller&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory Usage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.625 MiB&lt;/td&gt;
&lt;td&gt;15.89 MiB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;83% less memory&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU Usage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.00%&lt;/td&gt;
&lt;td&gt;0.00%&lt;/td&gt;
&lt;td&gt;Comparable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Process Count&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2 processes&lt;/td&gt;
&lt;td&gt;20+ processes&lt;/td&gt;
&lt;td&gt;Minimal overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Smaller image size&lt;/strong&gt;: 53.2 MB vs 141 MB for Node.js (Alpine + http-server) - Even with Alpine base, nginx is 62% smaller!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tiny memory footprint&lt;/strong&gt;: &lt;strong&gt;Only 2.625 MiB&lt;/strong&gt; (vs 15.89 MiB for Node.js Alpine - 6x less!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ultra-low CPU&lt;/strong&gt;: 0.00% usage - virtually idle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better performance&lt;/strong&gt;: Optimized for serving static files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production-ready&lt;/strong&gt;: Built for high-traffic scenarios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process efficiency&lt;/strong&gt;: Just 2 processes vs 20+ for Node.js&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives you a fully containerized full-stack application with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Quarkus Native Image (port 8080)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: MariaDB (port 3306)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Angular served by nginx (port 4200)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔍 Key Learnings and Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Native Image Compilation with Quarkus&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simplified Configuration&lt;/strong&gt;: Quarkus handles most native image configuration automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Panache Simplification&lt;/strong&gt;: Active Record pattern eliminates boilerplate code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Time&lt;/strong&gt;: Native compilation takes 5-10 minutes but produces optimal results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hot Reload&lt;/strong&gt;: Development mode (&lt;code&gt;quarkus:dev&lt;/code&gt;) provides instant feedback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container Builds&lt;/strong&gt;: Using container builds avoids local GraalVM installation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Quarkus-Specific Advantages&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Configuration&lt;/strong&gt;: Most things work out of the box&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Panache Magic&lt;/strong&gt;: Active Record pattern reduces code significantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reactive First&lt;/strong&gt;: RESTEasy Reactive provides excellent performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build-time Optimizations&lt;/strong&gt;: Quarkus optimizes at build time, not runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev Mode&lt;/strong&gt;: Hot reload works perfectly with native compilation support&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Docker Optimization Discoveries&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-stage builds&lt;/strong&gt; essential for production-ready images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nginx vs Node.js (Alpine + http-server)&lt;/strong&gt;: 53.2MB vs 141MB image size difference (62% smaller)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alpine Linux&lt;/strong&gt; base images for minimal footprint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health checks&lt;/strong&gt; crucial for container orchestration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment variables&lt;/strong&gt; for configuration management&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Performance Insights&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Startup time&lt;/strong&gt;: ~47ms for Quarkus native (vs 3-5 seconds traditional JVM)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory usage&lt;/strong&gt;: ~23 MiB total footprint at startup (vs 200MB+ traditional)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container overhead&lt;/strong&gt;: Docker adds minimal overhead with native images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database connection&lt;/strong&gt;: MariaDB connection pooling optimized automatically by Quarkus&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Best Practices Discovered&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start with Quarkus from the beginning - it's designed for native&lt;/li&gt;
&lt;li&gt;Use Panache for simpler data access patterns&lt;/li&gt;
&lt;li&gt;Leverage Quarkus dev mode for rapid development&lt;/li&gt;
&lt;li&gt;Test native compilation early in the development cycle&lt;/li&gt;
&lt;li&gt;Use container builds to avoid GraalVM installation complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Real-World Applications
&lt;/h2&gt;

&lt;p&gt;This architecture is perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microservices&lt;/strong&gt;: Ultra-fast scaling and deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serverless&lt;/strong&gt;: Minimal cold start penalties&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge Computing&lt;/strong&gt;: Low resource requirements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud-Native&lt;/strong&gt;: Optimized for containerized environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IoT Applications&lt;/strong&gt;: Minimal memory footprint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes&lt;/strong&gt;: Perfect for container orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔮 Future Enhancements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Caching Layer&lt;/strong&gt;: Add Redis for improved performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Implement JWT authentication with Quarkus Security&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: Add metrics with SmallRye Metrics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt;: Comprehensive test coverage with Quarkus Test&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD&lt;/strong&gt;: Automated deployment pipelines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GraphQL&lt;/strong&gt;: Add GraphQL support with Quarkus GraphQL&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📚 Resources and Code
&lt;/h2&gt;

&lt;p&gt;The complete source code is available on GitHub:&lt;br&gt;
  &lt;strong&gt;&lt;a href="https://github.com/issam1991/quarkus-native-angular-sample" rel="noopener noreferrer"&gt;https://github.com/issam1991/quarkus-native-angular-sample&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Dependencies:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Quarkus 3.15.1&lt;/li&gt;
&lt;li&gt;Angular 20.3.0&lt;/li&gt;
&lt;li&gt;GraalVM Native Image&lt;/li&gt;
&lt;li&gt;MariaDB Driver&lt;/li&gt;
&lt;li&gt;Docker &amp;amp; Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎉 Conclusion
&lt;/h2&gt;

&lt;p&gt;Building this application taught me that &lt;strong&gt;native compilation isn't just a performance optimization—it's a paradigm shift&lt;/strong&gt;. The combination of Quarkus Native Image and Angular creates a powerful, modern full-stack solution that's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ &lt;strong&gt;Lightning fast&lt;/strong&gt; startup times (~47ms, matching Spring Boot Native)&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Superior memory efficiency&lt;/strong&gt;: &lt;strong&gt;20.72 MiB&lt;/strong&gt; backend at startup, &lt;strong&gt;28 MiB under load&lt;/strong&gt; (58% and 44% less than Spring Boot Native's 50 MiB!)&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Ultra-lightweight frontend&lt;/strong&gt;: &lt;strong&gt;2.625 MiB&lt;/strong&gt; with nginx (vs 15.89 MiB with Node.js Alpine + http-server - 6x less!)&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Complete stack footprint&lt;/strong&gt;: &lt;strong&gt;~23 MiB&lt;/strong&gt; at startup, &lt;strong&gt;~31 MiB under load&lt;/strong&gt; (excluding database)&lt;/li&gt;
&lt;li&gt;🐳 &lt;strong&gt;Cloud-ready&lt;/strong&gt; for modern deployments&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Developer friendly&lt;/strong&gt; with familiar technologies and excellent dev experience&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Choose Quarkus Over Spring Boot Native?
&lt;/h3&gt;

&lt;p&gt;The real-world Docker stats tell the story clearly:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Spring Boot Native&lt;/th&gt;
&lt;th&gt;Quarkus Native&lt;/th&gt;
&lt;th&gt;Advantage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backend Memory (startup)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50 MiB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;20.72 MiB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;58% less&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backend Memory (under load)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50 MiB+&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;28 MiB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;44% less&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frontend (nginx)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~15-100 MiB (Node.js)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.625 MiB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;95-97% less&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total App Memory (startup)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~70-150 MiB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~23 MiB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;77-85% less&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total App Memory (under load)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~100-150 MiB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~31 MiB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;69-79% less&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Configuration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;More complex&lt;/td&gt;
&lt;td&gt;Simpler (zero-config)&lt;/td&gt;
&lt;td&gt;Developer friendly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code Simplification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Standard JPA&lt;/td&gt;
&lt;td&gt;Panache (Active Record)&lt;/td&gt;
&lt;td&gt;Less boilerplate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Quarkus's philosophy of "developer joy" combined with &lt;strong&gt;superior resource efficiency&lt;/strong&gt; makes it the perfect choice for modern Java applications. The framework is specifically designed for cloud-native, containerized environments, and the performance numbers prove it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The future of Java applications is native, and Quarkus not only makes getting there easier—it makes it more efficient.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📖 What's Next?
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful, consider:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Starring the repository&lt;/strong&gt; on GitHub&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trying the application&lt;/strong&gt; yourself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contributing&lt;/strong&gt; improvements or features&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sharing&lt;/strong&gt; with your development team&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Happy coding!&lt;/strong&gt; 🚀&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;This article was originally published on &lt;a href="https://fortek-advisor.com/blog/quarkus-native-angular" rel="noopener noreferrer"&gt;ForTek Advisor blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Follow me on &lt;a href="https://github.com/issam1991" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and connect with &lt;a href="https://www.linkedin.com/company/fortekadvisor?trk=public_post_feed-actor-name" rel="noopener noreferrer"&gt;ForTek Advisor&lt;/a&gt; for more technical content and project updates.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;#Quarkus #Angular #NativeImage #GraalVM #Java #TypeScript #FullStack #WebDevelopment #Performance #Microservices #CloudNative&lt;/p&gt;

</description>
      <category>fullstack</category>
      <category>performance</category>
      <category>angular</category>
      <category>java</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>issam1991</dc:creator>
      <pubDate>Mon, 03 Nov 2025 04:47:44 +0000</pubDate>
      <link>https://forem.com/issam1991/-3p2p</link>
      <guid>https://forem.com/issam1991/-3p2p</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/issam1991" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3593587%2F44784aa4-f25c-41ce-8bc7-d501412b0014.jpg" alt="issam1991"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/issam1991/building-a-lightning-fast-full-stack-app-spring-boot-native-angular-2bdd" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Building a Lightning-Fast Full-Stack App: Spring Boot Native + Angular&lt;/h2&gt;
      &lt;h3&gt;issam1991 ・ Nov 3&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#springboot&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#angular&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#graalvm&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#docker&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>springboot</category>
      <category>angular</category>
      <category>graalvm</category>
      <category>docker</category>
    </item>
    <item>
      <title>Building a Lightning-Fast Full-Stack App: Spring Boot Native + Angular</title>
      <dc:creator>issam1991</dc:creator>
      <pubDate>Mon, 03 Nov 2025 04:42:42 +0000</pubDate>
      <link>https://forem.com/issam1991/building-a-lightning-fast-full-stack-app-spring-boot-native-angular-2bdd</link>
      <guid>https://forem.com/issam1991/building-a-lightning-fast-full-stack-app-spring-boot-native-angular-2bdd</guid>
      <description>&lt;p&gt;&lt;em&gt;Quick summary: How I built a production-grade full-stack app with ultra-fast startup and a tiny footprint (~50MB) using Spring Boot Native Image and added a simple front using Angular 20&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 The Problem: Slow Java Application Startup
&lt;/h2&gt;

&lt;p&gt;Traditional Java applications, especially Spring Boot apps, are notorious for their slow startup times. A typical Spring Boot application can take 3-5 seconds to start, which becomes a significant bottleneck in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microservices architectures&lt;/strong&gt; where you need rapid scaling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serverless environments&lt;/strong&gt; where cold starts matter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development workflows&lt;/strong&gt; where you restart frequently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud deployments&lt;/strong&gt; where startup time affects user experience&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 The Solution: GraalVM Native Image
&lt;/h2&gt;

&lt;p&gt;Enter &lt;strong&gt;GraalVM Native Image&lt;/strong&gt; - a technology that compiles Java applications ahead-of-time into native executables. The results are astonishing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Startup time&lt;/strong&gt;: ultra fast
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory footprint&lt;/strong&gt;: ~50MB vs ~200MB+&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant scaling&lt;/strong&gt;: Perfect for cloud-native applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🏗️ Project Architecture
&lt;/h2&gt;

&lt;p&gt;I built a complete user management system with the following stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
    │   Angular 20+   │    │  Spring Boot 3  │    │    MariaDB      │
    │   Frontend      │◄──►│   Native Image  │◄──►│    Database     │
    │   (Port 4200)   │    │   (Port 8080)   │    │   (Port 3306)   │
    └─────────────────┘    └─────────────────┘    └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Technology Stack:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Spring Boot 3.4.0 + Java 21 + GraalVM Native Image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Angular 20.3.0 + TypeScript + Server-Side Rendering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: MariaDB with JPA/Hibernate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containerization&lt;/strong&gt;: Docker + Docker Compose&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Documentation&lt;/strong&gt;: Swagger/OpenAPI 3.0&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔧 Implementation Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Backend Setup with Native Image Support
&lt;/h3&gt;

&lt;p&gt;First, I configured the Maven project to support native compilation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;profiles&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;profile&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;native&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.graalvm.buildtools&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;native-maven-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/profile&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/profiles&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. User Entity and Repository
&lt;/h3&gt;

&lt;p&gt;I created a simple but effective User entity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Entity&lt;/span&gt;
&lt;span class="nd"&gt;@Table&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"users"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Id&lt;/span&gt;
    &lt;span class="nd"&gt;@GeneratedValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GenerationType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IDENTITY&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Column&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nullable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Column&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nullable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unique&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Constructors, getters, setters...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. REST API Controller
&lt;/h3&gt;

&lt;p&gt;The controller provides full CRUD operations with proper error handling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@RestController&lt;/span&gt;
&lt;span class="nd"&gt;@Tag&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"User Management API"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt; &lt;span class="n"&gt;userService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/users"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getUsers&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;userService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAllUsers&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@PostMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/users"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;createUser&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@RequestBody&lt;/span&gt; &lt;span class="nc"&gt;UserRequest&lt;/span&gt; &lt;span class="n"&gt;userRequest&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;userService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createUser&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;userRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEmail&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CREATED&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;IllegalArgumentException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;badRequest&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Additional CRUD operations...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Angular Frontend with Modern Architecture
&lt;/h3&gt;

&lt;p&gt;I used Angular 20's standalone components for a modern, lightweight approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;UserListComponent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;styleUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User Management Application&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Service Layer for API Communication
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;providedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;apiUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:8080/api/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HttpClient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;getAllUsers&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UserRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Additional CRUD operations...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📊 Performance Results
&lt;/h2&gt;

&lt;p&gt;The performance improvements were dramatic:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Traditional JVM&lt;/th&gt;
&lt;th&gt;Native Image&lt;/th&gt;
&lt;th&gt;Improvement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Startup Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.2 seconds&lt;/td&gt;
&lt;td&gt;47ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98.5% faster&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory Usage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;245MB&lt;/td&gt;
&lt;td&gt;52MB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;78% reduction&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;First Request&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4.1 seconds&lt;/td&gt;
&lt;td&gt;89ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;97.8% faster&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cold Start&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5.2 seconds&lt;/td&gt;
&lt;td&gt;67ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98.7% faster&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🐳 Real Docker Performance Metrics
&lt;/h3&gt;

&lt;p&gt;Here are the actual Docker stats from our running native image container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;CONTAINER ID   NAME             CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O   PIDS
054315cd04e6   native-app       0.03%     49.99MiB / 64MiB      78.11%    13.3kB / 13.4kB   0B / 0B     19
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Observations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory Usage&lt;/strong&gt;: Only &lt;strong&gt;49.99MB&lt;/strong&gt; (under 50MB!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU Usage&lt;/strong&gt;: &lt;strong&gt;0.03%&lt;/strong&gt; - extremely low resource consumption&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Efficiency&lt;/strong&gt;: Uses only &lt;strong&gt;78.11%&lt;/strong&gt; of allocated 64MB limit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process Count&lt;/strong&gt;: Just &lt;strong&gt;19 processes&lt;/strong&gt; - minimal overhead&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network I/O&lt;/strong&gt;: Minimal network activity (13.3kB/13.4kB)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This real-world data confirms our theoretical performance improvements and demonstrates the production-ready nature of Spring Boot Native Image applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  🐳 Docker Deployment
&lt;/h2&gt;

&lt;p&gt;I containerized the entire application for easy deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mariadb&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mariadb:latest&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;userdb&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appuser&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apppassword&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3306:3306"&lt;/span&gt;

  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;native-user-management:latest&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mariadb&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;SPRING_DATASOURCE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jdbc:mariadb://mariadb:3306/userdb&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Building and Running
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Backend (Native Image)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build native image&lt;/span&gt;
./mvnw &lt;span class="nt"&gt;-Pnative&lt;/span&gt; native:compile

&lt;span class="c"&gt;# Run the native executable&lt;/span&gt;
./target/native-native

&lt;span class="c"&gt;# Run with Docker&lt;/span&gt;
./mvnw spring-boot:build-image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run back + mariadb  with Docker compose
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;front
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Full Stack with Docker (Backend + Database + Frontend)
&lt;/h3&gt;

&lt;p&gt;You can also add the Angular frontend to your Docker Compose setup for a complete containerized solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Add to docker-compose.yml&lt;/span&gt;
&lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./front&lt;/span&gt;
    &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4200:80"&lt;/span&gt;
  &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;API_URL=http://app:8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;💡 Pro Tip: Use nginx instead of Node.js for production frontend serving&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For production deployments, use nginx to serve your Angular build instead of running the Node.js development server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build stage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci

&lt;span class="c"&gt;# Build application&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="c"&gt;# Production stage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; nginx:alpine&lt;/span&gt;

&lt;span class="c"&gt;# Copy Angular build and nginx config&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build /app/dist/user-management/browser /usr/share/nginx/html&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; nginx.conf /etc/nginx/nginx.conf&lt;/span&gt;

&lt;span class="c"&gt;# Ensure index.html exists (Angular generates index.csr.html)&lt;/span&gt;
&lt;span class="k"&gt;RUN if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /usr/share/nginx/html/index.csr.html &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;cp&lt;/span&gt; /usr/share/nginx/html/index.csr.html /usr/share/nginx/html/index.html&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["nginx", "-g", "daemon off;"]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefits of nginx:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Smaller image size&lt;/strong&gt;: ~15MB vs ~200MB+ for Node.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better performance&lt;/strong&gt;: Optimized for serving static files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower memory usage&lt;/strong&gt;: Minimal resource consumption&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production-ready&lt;/strong&gt;: Built for high-traffic scenarios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then run the complete stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you a fully containerized full-stack application with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Spring Boot Native Image (port 8080)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: MariaDB (port 3306)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Angular served by nginx (port 4200)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔍 Key Learnings and Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Native Image Compilation Challenges&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reflection Issues&lt;/strong&gt;: Some libraries use reflection that needs explicit configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Class Loading&lt;/strong&gt;: Required additional GraalVM configuration for JPA/Hibernate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Time&lt;/strong&gt;: Native compilation takes significantly longer (5-10 minutes vs 30 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging Limitations&lt;/strong&gt;: Some debugging tools don't work with native images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Configuration&lt;/strong&gt;: Required specific JVM arguments for optimal performance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Solutions Implemented&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;native-image&lt;/code&gt; configuration files for reflection metadata&lt;/li&gt;
&lt;li&gt;Used &lt;code&gt;@NativeImageConfiguration&lt;/code&gt; for runtime hints&lt;/li&gt;
&lt;li&gt;Configured CORS properly for frontend communication&lt;/li&gt;
&lt;li&gt;Optimized logging configuration for native compilation&lt;/li&gt;
&lt;li&gt;Used Spring Boot's built-in native support features&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Docker Optimization Discoveries&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-stage builds&lt;/strong&gt; essential for production-ready images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nginx vs Node.js&lt;/strong&gt;: 15MB vs 200MB+ image size difference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alpine Linux&lt;/strong&gt; base images for minimal footprint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health checks&lt;/strong&gt; crucial for container orchestration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment variables&lt;/strong&gt; for configuration management&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Performance Insights&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Startup time&lt;/strong&gt;: 0.608 seconds for Spring Boot (vs 3-5 seconds traditional JVM)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory usage&lt;/strong&gt;: ~50MB total footprint (vs 200MB+ traditional)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container overhead&lt;/strong&gt;: Docker adds ~6 seconds to total startup time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database connection&lt;/strong&gt;: MariaDB connection pooling optimized for native image&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Best Practices Discovered&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start with simple applications to understand native compilation&lt;/li&gt;
&lt;li&gt;Use Spring Boot's native support features from the beginning&lt;/li&gt;
&lt;li&gt;Test thoroughly as some debugging tools don't work with native images&lt;/li&gt;
&lt;li&gt;Monitor memory usage during compilation process&lt;/li&gt;
&lt;li&gt;Use production-ready Docker configurations from the start&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Real-World Applications
&lt;/h2&gt;

&lt;p&gt;This architecture is perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microservices&lt;/strong&gt;: Ultra-fast scaling and deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serverless&lt;/strong&gt;: Minimal cold start penalties&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge Computing&lt;/strong&gt;: Low resource requirements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud-Native&lt;/strong&gt;: Optimized for containerized environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IoT Applications&lt;/strong&gt;: Minimal memory footprint&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔮 Future Enhancements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Caching Layer&lt;/strong&gt;: Add Redis for improved performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Implement JWT authentication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: Add metrics and health checks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt;: Comprehensive test coverage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD&lt;/strong&gt;: Automated deployment pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📚 Resources and Code
&lt;/h2&gt;

&lt;p&gt;The complete source code is available on GitHub:&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/issam1991/spring-boot-native-angular-sample" rel="noopener noreferrer"&gt;https://github.com/issam1991/spring-boot-native-angular-sample&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Dependencies:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot 3.4.0&lt;/li&gt;
&lt;li&gt;Angular 20.3.0&lt;/li&gt;
&lt;li&gt;GraalVM Native Image&lt;/li&gt;
&lt;li&gt;MariaDB Driver&lt;/li&gt;
&lt;li&gt;Docker &amp;amp; Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎉 Conclusion
&lt;/h2&gt;

&lt;p&gt;Building this application taught me that &lt;strong&gt;native compilation isn't just a performance optimization—it's a paradigm shift&lt;/strong&gt;. The combination of Spring Boot Native Image and Angular creates a powerful, modern full-stack solution that's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ &lt;strong&gt;Lightning fast&lt;/strong&gt; startup times&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;Memory efficient&lt;/strong&gt; resource usage&lt;/li&gt;
&lt;li&gt;🐳 &lt;strong&gt;Cloud-ready&lt;/strong&gt; for modern deployments&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Developer friendly&lt;/strong&gt; with familiar technologies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The future of Java applications is native, and this project demonstrates how to get there while maintaining the developer experience we love.&lt;/p&gt;




&lt;h2&gt;
  
  
  📖 What's Next?
&lt;/h2&gt;

&lt;p&gt;If you found this article helpful, consider:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Starring the repository&lt;/strong&gt; on GitHub&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trying the application&lt;/strong&gt; yourself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contributing&lt;/strong&gt; improvements or features&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sharing&lt;/strong&gt; with your development team&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Happy coding!&lt;/strong&gt; 🚀&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This article was originally published on &lt;a href="https://fortek-advisor.com/blog/spring_native_angular" rel="noopener noreferrer"&gt;ForTek Advisor blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Follow me on &lt;a href="https://github.com/issam1991" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and connect with &lt;a href="https://www.linkedin.com/company/fortekadvisor?trk=public_post_feed-actor-name" rel="noopener noreferrer"&gt;ForTek Advisor linkedin&lt;/a&gt; for more technical content and project updates.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>angular</category>
      <category>graalvm</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
