π HARUMAN (ν루λ§) β λ§μΆ€ν λμ¬ μ€κ° λ° AI μΆμ² νλ«νΌ
"μλ‘μ΄ λ°μ΄λ΄, νλ²λ§ ν΄λ³΄μ" β κ²½ν¬λνκ΅ 2026 ACC νλ‘μ νΈ Team 6
νλ§€μ(λμ¬μ)μ ꡬ맀μ(λμ¬λ°λ μ)λ₯Ό μ°κ²°νλ P2P/B2C λμ¬ μ€κ° λ§€μΉ νλ«νΌμ
λλ€.
"μνλ κ²λ§ 체ν¬, νμν κ²λ§ λͺ¨μ보기"
AI μ±λ΄μ΄ μ¬μ©μμ μν©μ λΆμν΄ νμν λ¬Όνμ μλ μΆμ²νκ³ , μμ€ν¬λ‘ 보μ¦κΈ μμ€ν
μΌλ‘ μμ ν κ±°λλ₯Ό 보μ₯ν©λλ€.
"λΌμνκΈ°λ κ·Έλ§, 무μλ―Έν λ°©μΉλ κ·Έλ§! μμμ§λ λ°μ΄λ΄ μ μνλ κ²½νμ νλ²λ§ 체νν΄λ³΄κ³ μΆλ€λ©΄ HARUMAN λΉλ €λ³΄μ"
π λλ©μΈ : haruman.shop
π€ AI κΈ°λ° λ¬Όν μΆμ² μ±λ΄
AWS Bedrock Nova Lite λͺ¨λΈ μ°λ
μ¬μ©μ λν λ§₯λ½ λΆμ β νμ λ¬Όν μλ μΆλ‘
μ±λ΄ κ²°κ³Όμ 체ν¬λ°μ€ UI μ€μκ° λκΈ°ν
WebSocket κΈ°λ° νλ§€μ-ꡬ맀μ μ§κ±°λ μλ΄
Clean_Bot : AI λΉμμ΄/μμ€ μ€μκ° νν°λ§ (Bedrock Nova Lite, 5μ΄ νμμμ)
Supabase Auth + μ΄λ©μΌ μΈμ¦ (Resend API)
JWT κΈ°λ° μΈμ
κ΄λ¦¬
RBAC (Guest / User / Admin)
π¦ λμ¬ κ΄λ¦¬ λ° μμ€ν¬λ‘
λμ¬ μλͺ
μ£ΌκΈ°: μμ½νμ μ β λμ¬μ€ β λ°λ©μλ£
μμ€ν¬λ‘ 보μ¦κΈ μμ€ν
(μ°μ²΄ μ μΌλ³ 20% μ°¨κ°, 5μΌ μ΄μ μ μ‘ λͺ°μ)
WebSocket κΈ°λ° νΈμ μλ¦Ό
FCM ν ν° μ§μ
λ°λ© κΈ°ν μλ° μλ μλ¦Ό
κ²°μ μΉ΄λ μ¬μ λ±λ‘μ (κ±°λ μ μΉ΄λ μΈμ¦ νμ)
μμ κ²°μ νμΈ (buyer_confirmed + seller_confirmed)
μμ
κΈ°μ
Frontend
React 18, TypeScript, Vite, TailwindCSS 4, shadcn/ui, MUI Icons
Backend
Express.js (Node.js), TypeScript, JWT, bcrypt
Database
Supabase PostgreSQL (Serverless)
AI/ML
AWS Bedrock (Amazon Nova Lite v1)
Auth
Supabase Auth, Resend (μ΄λ©μΌ μΈμ¦)
μ€μκ°
WebSocket (ws λΌμ΄λΈλ¬λ¦¬), API Gateway WebSocket
Storage
AWS S3 (μ΄λ―Έμ§ μ
λ‘λ)
λ°°ν¬
AWS Lambda, API Gateway, S3 + CloudFront
ν
μ€νΈ
Jest, fast-check (Property-Based Testing)
μ½λ νμ§
ESLint, Prettier
haruman/
βββ backend/ # Express λ°±μλ μλ²
β βββ main.js # μ§μ
μ (Express μ± + λΌμ°ν
)
β βββ src/
β β βββ ai/ # AI μ±λ΄ νΈλ€λ¬ (Bedrock Nova Lite)
β β βββ auth/ # μΈμ¦ (νμκ°μ
, λ‘κ·ΈμΈ, μ΄λ©μΌ μΈμ¦, JWT)
β β βββ chat/ # μ±ν
(λ©μμ§ μ μ‘, CleanBot νν°)
β β βββ common/ # κ³΅ν΅ μ νΈ (config, errors, response)
β β βββ db/ # Supabase ν΄λΌμ΄μΈνΈ
β β βββ mocks/ # ν
μ€νΈμ© Mock (Bedrock, SES)
β β βββ notify/ # νΈμ μλ¦Ό (FCM)
β β βββ websocket/ # WebSocket μ°κ²°/ν΄μ νΈλ€λ¬
β βββ package.json
β βββ tsconfig.json
β
βββ frontend/ # React SPA (Vite)
β βββ src/
β β βββ api/ # API ν΄λΌμ΄μΈνΈ (auth, items, rentals, users, ai)
β β βββ app/
β β β βββ components/ # UI μ»΄ν¬λνΈ (Figma κΈ°λ°)
β β β βββ pages/ # νμ΄μ§ (Home, Chat, Rental, MyPage λ±)
β β βββ context/ # Context (Auth, WebSocket, Notification)
β β βββ lib/ # Supabase ν΄λΌμ΄μΈνΈ
β β βββ styles/ # CSS (Tailwind, ν
λ§, ν°νΈ)
β βββ package.json
β
βββ infra/ # μΈνλΌ λ° DB μ€ν€λ§
β βββ database/ # PostgreSQL λ§μ΄κ·Έλ μ΄μ
(001~010)
β
βββ README.md
Node.js 20+
npm λλ pnpm
Supabase νλ‘μ νΈ (PostgreSQL)
AWS κ³μ (Bedrock, S3 μ κ·Ό κΆν)
Backend μ€μΉ λ° μ€ν
cd backend
npm install
# .env νμΌ μ€μ (μλ νκ²½ λ³μ μΉμ
μ°Έκ³ )
cp .env.example .env
# κ°λ° μλ² μ€ν
npm run dev
# νλ‘λμ
μ€ν
npm start
Frontend μ€μΉ λ° μ€ν
cd frontend
pnpm install # λλ npm install
# .env νμΌ μ€μ
cp .env.example .env
# κ°λ° μλ² μ€ν
pnpm dev
cd backend
# μ 체 ν
μ€νΈ
npm test
# λ¨μ ν
μ€νΈλ§
npm run test:unit
# Property-Based ν
μ€νΈλ§
npm run test:property
λ³μ
μ€λͺ
NODE_ENV
μ€ν νκ²½ (development / production / test)
PORT
μλ² ν¬νΈ (κΈ°λ³Έ: 3000)
SUPABASE_URL
Supabase νλ‘μ νΈ URL
SUPABASE_KEY
Supabase κ³΅κ° ν€ (anon key)
SUPABASE_SERVICE_KEY
Supabase μλΉμ€ λ‘€ ν€ (μλ² μ μ©)
JWT_SECRET
JWT μλͺ
λΉλ° ν€
AWS_ACCESS_KEY_ID
AWS μ‘μΈμ€ ν€
AWS_SECRET_ACCESS_KEY
AWS μν¬λ¦Ώ ν€
AWS_REGION
AWS 리μ
RESEND_API_KEY
Resend μ΄λ©μΌ API ν€
RESEND_FROM_EMAIL
λ°μ μ΄λ©μΌ μ£Όμ
FRONTEND_URL
νλ‘ νΈμλ URL (CORS)
WS_ENDPOINT
WebSocket API Gateway μλν¬μΈνΈ
S3_BUCKET
S3 λ²ν·λͺ
λ³μ
μ€λͺ
VITE_API_BASE_URL
λ°±μλ API URL
VITE_SUPABASE_URL
Supabase νλ‘μ νΈ URL
VITE_SUPABASE_ANON_KEY
Supabase κ³΅κ° ν€
Supabase PostgreSQL κΈ°λ°. λ§μ΄κ·Έλ μ΄μ
νμΌμ infra/database/ μ μλ²λλ‘ μμΉν©λλ€.
ν
μ΄λΈ
μ€λͺ
users
μ¬μ©μ κ³μ (User, Admin)
user_agreements
μ½κ΄ λμ μ΄λ ₯
cards
κ²°μ μΉ΄λ μ¬μ λ±λ‘
categories
λ¬Όν μΉ΄ν
κ³ λ¦¬ (7κ°: μ½μνΈ, μ‘Έμ
μ¬μ§, μ¬ν, μΊ ν, κ²°νΌμ, λ©΄μ , νμ€ν°λ²)
item_types
μΉ΄ν
κ³ λ¦¬λ³ μΈλΆ λ¬Όν νμ
items
λμ¬ λ¬Όν
rentals
λμ¬ κ±°λ (μμ€ν¬λ‘ 보μ¦κΈ ν¬ν¨)
receipt_photos
μλ Ή μΈμ¦ μ¬μ§
chat_rooms
1:1 μ±ν
λ°©
chat_messages
μ±ν
λ©μμ§ (CleanBot νν°λ§ μν)
notifications
μλ¦Ό
ws_connections
WebSocket νμ± μ°κ²°
reports
μ κ³ λ΄μ
# Supabase Dashboard SQL Editorμμ μμλλ‘ μ€ν
# λλ psql CLIλ‘:
export DATABASE_URL=" postgresql://postgres:[PASSWORD]@[HOST]:5432/postgres"
psql " $DATABASE_URL " -f infra/database/001_schema.sql
psql " $DATABASE_URL " -f infra/database/002_indexes.sql
psql " $DATABASE_URL " -f infra/database/003_seed.sql
# ... 010κΉμ§ μμ°¨ μ μ©
Method
Path
μ€λͺ
POST
/auth/register
νμκ°μ
POST
/auth/login
λ‘κ·ΈμΈ
GET
/auth/me
λ΄ μ 보 μ‘°ν
POST
/auth/verify-email
μ΄λ©μΌ μΈμ¦ νμΈ
POST
/auth/resend-verification
μΈμ¦ λ©μΌ μ¬λ°μ‘
Method
Path
μ€λͺ
POST
/ai/chat
AI λ¬Όν μΆμ² λν
Method
Path
μ€λͺ
POST
/chat/send
λ©μμ§ μ μ‘ (CleanBot κ²μ¬ ν¬ν¨)
Event
μ€λͺ
$connect
WebSocket μ°κ²°
$disconnect
WebSocket ν΄μ
π μΉ΄ν
κ³ λ¦¬ λ° λ¬Όν λΆλ₯
μΉ΄ν
κ³ λ¦¬
μΈλΆ λ¬Όν
π€ μ½μνΈ
μΈνΈλΌ νΈλν°, λν¬μΉ΄λ©λΌ, μμλ΄, μνκΈ°, 보쑰배ν°λ¦¬, μμκ²½, λμ리, κΈ°ν
π μ‘Έμ
μ¬μ§
νμ¬λͺ¨, μ‘Έμ
κ°μ΄, κ½λ€λ°, μ μ₯, ꡬλ, κΈ°ν
βοΈ μ¬ν
λΌμ§μ½, μΊλ¦¬μ΄, λμΉ΄, 보쑰배ν°λ¦¬, κ³ νλ‘, μ¬νμ© μμ΄νμ΄(μκ·Έ), κΈ°ν
ποΈ μΊ ν
ν
νΈ, νν, μν°, 침ꡬ, κ³μ μ©ν, 쑰리λꡬ, μκΈ°, μμ, ν
μ΄λΈ λ±
π κ²°νΌμ
νκ°λ£©, ꡬλ, λ₯νμ΄, κΈ°ν
πΌ λ©΄μ
λ©΄μ 룩, ꡬλ, κΈ°ν
ποΈ νμ€ν°λ²
μμ, λ°©μν©, μ κΈλΌμ€, κΈ°ν
κ²½ν¬λνκ΅ μ»΄ν¨ν°κ³΅νκ³Ό ACC 2026 νλ‘μ νΈ β Team 6
2024103291 κ³ λͺ
μ£Ό myoungjugo
2025105390 μ€μμ wanimetro
μ΄ νλ‘μ νΈλ νμ λͺ©μ μΌλ‘ κ°λ°λμμ΅λλ€.