Go to file
hehihoho3@gmail.com 152dc0bae4 fix(discover): cast nullable params so Postgres can infer type
The discover @Query used the `(:param is null or col >= :param)` idiom.
For the timestamp (publishedAfter) and numeric (minRatio) params, Postgres
threw "could not determine data type of parameter $1" because the bare
`$1 is null` placeholder is untyped — returning HTTP 500 and breaking the
whole /discover page. (The search() query survives because its nullable
params are only bigint/varchar, which Postgres can null-type.) Wrap the
two problematic params in cast(... as timestamp/big_decimal) in the
is-null check so the type is explicit. ORDER BY ... nulls last / fetch
first were never the problem.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 09:56:28 +09:00
.claude docs: add dashboard full-set enhancement spec 2026-05-30 22:02:10 +09:00
.playwright-mcp Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
docs/superpowers docs: add all-pages design uplift implementation plan 2026-05-31 00:25:53 +09:00
gradle/wrapper Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
src/main fix(discover): cast nullable params so Postgres can infer type 2026-05-31 09:56:28 +09:00
.gitignore Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
build_log_final.txt Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
build_log.txt Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
build.gradle Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
CLAUDE.md docs: update CLAUDE.md for ChannelVideo single-master architecture 2026-05-30 19:59:38 +09:00
gradlew Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
gradlew.bat Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
README.md Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
settings.gradle Baseline before video model consolidation 2026-05-30 18:56:21 +09:00

h-lab

유튜브 데이터를 수집하고 분석하는 개인용 웹 서비스입니다. Spring Boot 4.x(3.4.0) 기반의 백엔드와 React + Vite 기반의 프론트엔드로 구성되어 있습니다.

🛠 Tech Stack

Backend

  • Framework: Spring Boot 3.4.0 (Java 21)
  • Database: H2 (Development), JPA
  • API Docs: Swagger UI (SpringDoc)
  • Architecture: Domain-Driven Design style

Frontend

  • Framework: React 18 (Vite)
  • Language: TypeScript
  • Styling: Vanilla CSS + CSS Variables (Dark Mode)
  • State: Zustand
  • Charts: Recharts

🚀 How to Run

Backend & Frontend (Integrated)

  1. backend 디렉토리로 이동
  2. ./gradlew bootRun 실행 (Windows: gradlew bootRun)
  3. 웹 서비스 접속: http://localhost:8080
    • 메인 대시보드: http://localhost:8080/
    • 채널 관리: http://localhost:8080/channels
    • Swagger UI: http://localhost:8080/swagger-ui.html

Frontend (Legacy React)

Removed in favor of Thymeleaf Server-Side Rendering

📂 Project Structure

h-lab/
├── src/main/java/com/hlab/yanalyst/
│   ├── domain/        # Domain Entities (Video, Channel...)
│   └── web/           # Web Controllers (Thymeleaf)
│
└── src/main/resources/
    ├── static/        # CSS, JS
    └── templates/     # HTML Templates (Thymeleaf)

Key Features

  • Dashboard: 전체 데이터 요약 및 시각화 (Charts)
  • Channel Management: 분석 대상 유튜브 채널 관리
  • Dark Mode: 눈이 편안한 프리미엄 다크 모드 UI