<?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>DEV Community: Cleaner Wrasse</title>
    <description>The latest articles on DEV Community by Cleaner Wrasse (@cleaner-wrasse).</description>
    <link>https://dev.to/cleaner-wrasse</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%2F3890877%2Fd09f0944-9bf3-4613-98f5-d82f6eb663c0.png</url>
      <title>DEV Community: Cleaner Wrasse</title>
      <link>https://dev.to/cleaner-wrasse</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cleaner-wrasse"/>
    <language>en</language>
    <item>
      <title>How to Deploy a Spring Boot + React App for Free on Render: From Local to Production</title>
      <dc:creator>Cleaner Wrasse</dc:creator>
      <pubDate>Tue, 21 Apr 2026 14:35:08 +0000</pubDate>
      <link>https://dev.to/cleaner-wrasse/how-to-deploy-a-spring-boot-react-app-for-free-on-render-from-local-to-production-2d7b</link>
      <guid>https://dev.to/cleaner-wrasse/how-to-deploy-a-spring-boot-react-app-for-free-on-render-from-local-to-production-2d7b</guid>
      <description>&lt;p&gt;&lt;strong&gt;LIVE DEMO:&lt;/strong&gt; &lt;a href="https://hotelbooking-ui-ds7l.onrender.com/" rel="noopener noreferrer"&gt;https://hotelbooking-ui-ds7l.onrender.com/&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠 Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React, Tailwind CSS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Java, Spring Boot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; PostgreSQL (H2)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; Render&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring:&lt;/strong&gt; UptimeRobot&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  1/9:
&lt;/h3&gt;

&lt;p&gt;I’d been wanting to build my portfolio using Spring Boot but wasn't sure where to start. While looking for a free hosting service, I came across Render and decided to use it to bring my project to life!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://render.com/docs/free" rel="noopener noreferrer"&gt;https://render.com/docs/free&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the same time, I realized that building the UI from scratch would be quite a challenge. I figured using a template might be a better approach, so I searched for 'booking application web templates react' and came across this website:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/arnobt78/Hotel-Booking-Landing-Page--React-Frontend" rel="noopener noreferrer"&gt;https://github.com/arnobt78/Hotel-Booking-Landing-Page--React-Frontend&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I chose the following website for my base design, but I noticed the navigation bar wasn't working properly. To fix this, I also referred to the site below, as combining them allowed me to create a fully functional and reliable user interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://qiita.com/midori-game/items/17357d46e3ed1281001c" rel="noopener noreferrer"&gt;https://qiita.com/midori-game/items/17357d46e3ed1281001c&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To update the visuals, I used the three websites mentioned below along with Nano Banana 2 for image generation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://unsplash.com/" rel="noopener noreferrer"&gt;https://unsplash.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.pexels.com/" rel="noopener noreferrer"&gt;https://www.pexels.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pixabay.com/" rel="noopener noreferrer"&gt;https://pixabay.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2/9:
&lt;/h3&gt;

&lt;p&gt;After that, I cloned the repository and set up the project locally. As a first step for the UI updates, I started by replacing the images.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Original UI:&lt;/strong&gt;&lt;br&gt;
&lt;a href="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%2Farticles%2Flzc6cwhve0l0sxhg326f.png" class="article-body-image-wrapper"&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%2Farticles%2Flzc6cwhve0l0sxhg326f.png" alt="image.png" width="658" height="858"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My current UI:&lt;/strong&gt;&lt;br&gt;
&lt;a href="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%2Farticles%2Frm43cf5nq9oo3wjjwae6.png" class="article-body-image-wrapper"&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%2Farticles%2Frm43cf5nq9oo3wjjwae6.png" alt="image.png" width="652" height="848"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3/9:
&lt;/h3&gt;

&lt;p&gt;At this stage, I started working on the backend separately from the UI. I chose Spring Boot for the API development. After fine-tuning the integration between the UI and API, I refactored the image handling so that pictures are now managed via the backend database instead of being stored directly in the frontend.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fsir3u6dy3y5dhpon34y0.png" class="article-body-image-wrapper"&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%2Farticles%2Fsir3u6dy3y5dhpon34y0.png" alt="Screenshot 2026-04-14 at 21.47.44.png" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4/9:
&lt;/h3&gt;

&lt;p&gt;↓After completing the UI and API development and verifying the local server setup, I pushed the code to GitHub.&lt;br&gt;
&lt;a href="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%2Farticles%2F20fqvon2namszmwigcip.png" class="article-body-image-wrapper"&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%2Farticles%2F20fqvon2namszmwigcip.png" alt="Screenshot 2026-04-14 at 22.37.17.png" width="664" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5/9:
&lt;/h3&gt;

&lt;p&gt;With the code ready, I started setting up my Render account. I referred to the guide below for the setup process. I chose to authenticate with GitHub as it’s much more efficient for linking repositories.&lt;br&gt;
&lt;a href="https://qiita.com/tks_00/items/73cf04c225e5f6113cd8" rel="noopener noreferrer"&gt;https://qiita.com/tks_00/items/73cf04c225e5f6113cd8&lt;/a&gt;&lt;br&gt;
&lt;a href="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%2Farticles%2F8x1f0sbwdr33r6uvkbqh.png" class="article-body-image-wrapper"&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%2Farticles%2F8x1f0sbwdr33r6uvkbqh.png" alt="Screenshot 2026-04-14 at 22.42.14.png" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6/9:
&lt;/h3&gt;

&lt;p&gt;I proceeded by setting up the API as a Web Service and the UI as a Static Site. It wasn't a smooth start—I ran into several deployment errors related to updated paths and database configurations. Some images also failed to load initially. I spent some time troubleshooting these configuration issues and eventually secured a successful deploy.&lt;br&gt;
&lt;a href="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%2Farticles%2Fqhzhx9hl837ytljcbt0d.png" class="article-body-image-wrapper"&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%2Farticles%2Fqhzhx9hl837ytljcbt0d.png" alt="Screenshot 2026-04-15 at 1.34.39.png" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7/9:
&lt;/h3&gt;

&lt;p&gt;I've finally reached a point where I'm happy with the progress.&lt;br&gt;
&lt;a href="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%2Farticles%2F9rafcd9t3a7iqisparea.png" class="article-body-image-wrapper"&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%2Farticles%2F9rafcd9t3a7iqisparea.png" alt="Screenshot 2026-04-15 at 1.40.12.png" width="800" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  8/9:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Optimizing Load Speed&lt;/strong&gt;&lt;br&gt;
I noticed that Render’s free tier spins down the instance after 15 minutes of inactivity, leading to a long 60-90s wait for the first user. To maintain faster response times, I integrated UptimeRobot to monitor the site and prevent it from sleeping. I referred to this article for the implementation:&lt;br&gt;
&lt;a href="https://qiita.com/yuto141592/items/cef9b50ea4557dfe1be7" rel="noopener noreferrer"&gt;https://qiita.com/yuto141592/items/cef9b50ea4557dfe1be7&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After accessing the UptimeRobot site, I created an account using GitHub authentication. To start the monitoring, I pasted my website's URL into the 'URL to monitor' section.&lt;br&gt;
&lt;a href="https://dashboard.uptimerobot.com/monitors?ref=website-header" rel="noopener noreferrer"&gt;https://dashboard.uptimerobot.com/monitors?ref=website-header&lt;/a&gt;&lt;br&gt;
&lt;a href="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%2Farticles%2F4jnzfp2xzg724v2jgtb5.png" class="article-body-image-wrapper"&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%2Farticles%2F4jnzfp2xzg724v2jgtb5.png" alt="Screenshot 2026-04-18 at 16.19.18.png" width="558" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The default monitoring interval is set to every 5 minutes. Since that's enough to keep the server from sleeping, I kept the default settings. With this, the initial loading problem is now solved.&lt;br&gt;
&lt;a href="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%2Farticles%2Fcqev0bu0bae6nr05p7hq.png" class="article-body-image-wrapper"&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%2Farticles%2Fcqev0bu0bae6nr05p7hq.png" alt="for_blog_9.png" width="800" height="302"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="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%2Farticles%2Fwyryznj6t0f38bzqk74p.png" class="article-body-image-wrapper"&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%2Farticles%2Fwyryznj6t0f38bzqk74p.png" alt="for_blog_10.png" width="800" height="411"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="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%2Farticles%2F0quui10en45lkp3zidi5.png" class="article-body-image-wrapper"&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%2Farticles%2F0quui10en45lkp3zidi5.png" alt="for_blog_11.png" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  9/9:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;br&gt;
Through this project, I gained practical experience in integrating React with Spring Boot and learned a lot about server-side communication.&lt;/p&gt;

&lt;p&gt;While the current backend is a minimal setup, I plan to build upon it by implementing a booking system. I also aim to add more advanced features such as API fetching and PDF generation to further enhance the backend's functionality.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Links&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://hotelbooking-ui-ds7l.onrender.com/" rel="noopener noreferrer"&gt;https://hotelbooking-ui-ds7l.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source Code:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/Flying-WhaleShark/HotelBooking_UI" rel="noopener noreferrer"&gt;https://github.com/Flying-WhaleShark/HotelBooking_UI&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Flying-WhaleShark/HotelBooking_API" rel="noopener noreferrer"&gt;https://github.com/Flying-WhaleShark/HotelBooking_API&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>springboot</category>
      <category>showdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
