Migrate backend from Python to Java Spring Boot

- Full Java 21 + Spring Boot 3.3 backend with Virtual Threads
- HikariCP connection pool for Oracle ADB
- JWT auth, Redis caching, OCI GenAI integration
- YouTube transcript extraction via API + Playwright browser fallback
- SSE streaming for bulk operations
- Scheduled daemon for channel scanning/video processing
- Mobile UI: collapse restaurant list to single row on selection
- Switch PM2 ecosystem config to Java backend

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
joungmin
2026-03-09 20:26:32 +09:00
parent 161b1383be
commit 6d05be2331
50 changed files with 4644 additions and 23 deletions

View File

@@ -11,6 +11,7 @@ import RestaurantList from "@/components/RestaurantList";
import RestaurantDetail from "@/components/RestaurantDetail";
import MyReviewsList from "@/components/MyReviewsList";
import BottomSheet from "@/components/BottomSheet";
import { getCuisineIcon } from "@/lib/cuisine-icons";
const CUISINE_GROUPS: { label: string; prefix: string }[] = [
{ label: "한식", prefix: "한식" },
@@ -819,15 +820,34 @@ export default function Home() {
</>
) : (
<>
<div className="flex-1 bg-white dark:bg-gray-950 overflow-y-auto">
{mobileListContent}
{/* Scroll-down hint to reveal map */}
<div className="flex flex-col items-center py-4 text-gray-300">
<span className="text-lg"></span>
<span className="text-[10px]"> </span>
{/* List area — if selected, show single row; otherwise full list */}
{selected ? (
<div
className="shrink-0 bg-white dark:bg-gray-950 border-b dark:border-gray-800 px-3 py-2 flex items-center gap-2 cursor-pointer"
onClick={() => { setSelected(null); setShowDetail(false); }}
>
<span className="text-base">{getCuisineIcon(selected.cuisine_type)}</span>
<span className="font-semibold text-sm truncate flex-1">{selected.name}</span>
{selected.rating && (
<span className="text-xs text-gray-500"><span className="text-yellow-500"></span> {selected.rating}</span>
)}
{selected.cuisine_type && (
<span className="text-xs text-gray-400">{selected.cuisine_type}</span>
)}
<button
onClick={(e) => { e.stopPropagation(); setSelected(null); setShowDetail(false); }}
className="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 text-lg leading-none ml-1"
>
</button>
</div>
</div>
<div className="h-[70vh] shrink-0 relative border-t dark:border-gray-800">
) : (
<div className="max-h-[360px] bg-white dark:bg-gray-950 overflow-y-auto border-b dark:border-gray-800">
{mobileListContent}
</div>
)}
{/* Map fills remaining space below the list */}
<div className="flex-1 relative">
<MapView
restaurants={filteredRestaurants}
selected={selected}