Skip to content
TrinityBalancePublic

Latest commit

Β 

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

버리미 (Beorimi)

사진 ν•œ μž₯으둜 λŒ€ν˜•νκΈ°λ¬Ό 후보λ₯Ό μ°Ύκ³ , 강남ꡬ κΈ°μ€€μ˜ ν’ˆλͺ©Β·κ·œκ²©Β·μ˜ˆμƒ 수수료λ₯Ό 확인해 μ‹ κ³  μ€€λΉ„κΉŒμ§€ λ•λŠ” μ›Ή μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.

μ„œλΉ„μŠ€ μ²΄ν—˜ν•˜κΈ° Β· λ°œν‘œ 자료 보기

λ²„λ¦¬λ―ΈλŠ” μ‚¬μš©μžκ°€ 물건의 μ •ν™•ν•œ 이름과 배좜 κ·œμ •μ„ 일일이 μ°ΎλŠ” λŒ€μ‹ , μ‚¬μ§„μ—μ„œ μ—¬λŸ¬ 물건을 μ°Ύμ•„ 신고에 ν•„μš”ν•œ λͺ©λ‘μœΌλ‘œ 정리해 μ€λ‹ˆλ‹€. AIκ°€ λͺ¨λ“  것을 κ²°μ •ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. AIλŠ” 사진을 κ΄€μ°°ν•˜κ³ , μ„œλ²„λŠ” 곡식 κ·œμΉ™μ„ λ°”νƒ•μœΌλ‘œ νŒμ •ν•˜λ©°, μ‚¬μš©μžκ°€ λ§ˆμ§€λ§‰μœΌλ‘œ ν™•μ •ν•©λ‹ˆλ‹€.

ν˜„μž¬ μ„œλΉ„μŠ€λŠ” μ„œμšΈ 강남ꡬ λŒ€ν˜•νκΈ°λ¬Ό κΈ°μ€€μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€. 뢄석 결과와 μˆ˜μˆ˜λ£ŒλŠ” μ‹ κ³  μ€€λΉ„λ₯Ό μœ„ν•œ μ°Έκ³  정보이며, μ‹€μ œ 배좜 κ°€λŠ₯ 여뢀와 μ΅œμ’… κΈˆμ•‘μ€ 강남ꡬ 곡식 μ‹ κ³  νŽ˜μ΄μ§€μ—μ„œ λ‹€μ‹œ 확인해야 ν•©λ‹ˆλ‹€.

λΉ λ₯΄κ²Œ 찾아보기

μ™œ λ§Œλ“€μ—ˆλ‚˜μš”?

λŒ€ν˜•νκΈ°λ¬Όμ„ 버릴 λ•ŒλŠ” 생각보닀 λ§Žμ€ 정보λ₯Ό 직접 μ°Ύμ•„μ•Ό ν•©λ‹ˆλ‹€.

  • λ‚΄κ°€ λ²„λ¦¬λ €λŠ” 물건이 행정상 μ–΄λ–€ ν’ˆλͺ©μΈμ§€ μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€.
  • 같은 μ†ŒνŒŒλ‚˜ 책상도 크기와 κ·œκ²©μ— 따라 μˆ˜μˆ˜λ£Œκ°€ λ‹¬λΌμ§‘λ‹ˆλ‹€.
  • 사진 속 물건 μ€‘μ—λŠ” λŒ€ν˜•νκΈ°λ¬Όμ΄ μ•„λ‹ˆλΌ λΆ„λ¦¬λ°°μΆœμ΄λ‚˜ μ „μš© μˆ˜κ±°ν•¨ λŒ€μƒμΈ 것도 μžˆμŠ΅λ‹ˆλ‹€.

λ²„λ¦¬λ―ΈλŠ” 이 과정을 λ‹€μŒ μ„Έ λ‹¨κ³„λ‘œ μ€„μž…λ‹ˆλ‹€.

  1. 버릴 물건이 λͺ¨λ‘ 보이도둝 사진을 μ°κ±°λ‚˜ μ•¨λ²”μ—μ„œ μ„ νƒν•©λ‹ˆλ‹€.
  2. μ‚¬μ§„μ—μ„œ 물건을 μ°Ύμ•„ 강남ꡬ ν’ˆλͺ©κ³Ό κ·œκ²©μ— λ§žλŠ” μ˜ˆμƒ 수수료λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.
  3. μ‚¬μš©μžκ°€ ν’ˆλͺ©Β·κ·œκ²©Β·μˆ˜λŸ‰μ„ ν™•μΈν•œ λ’€ 곡식 μ‹ κ³  νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.

μ£Όμš” κΈ°λŠ₯

  • ν•œ μž₯의 μ‚¬μ§„μ—μ„œ μ—¬λŸ¬ 폐기물 후보 탐지
  • 사진 μœ„ μœ„μΉ˜ ν‘œμ‹œμ™€ ν’ˆλͺ© μΉ΄λ“œ μ—°κ²°
  • ν’ˆλͺ©, 규격, μˆ˜λŸ‰μ„ μ‚¬μš©μžκ°€ 직접 μˆ˜μ •
  • 강남ꡬ 곡식 ν’ˆλͺ© κΈ°μ€€ μ˜ˆμƒ 수수료 μ•ˆλ‚΄
  • λŒ€ν˜•νκΈ°λ¬Όμ΄ μ•„λ‹Œ ν’ˆλͺ©μ˜ 별도 배좜 방법 μ•ˆλ‚΄
  • 뢄석 이λ ₯ 확인과 곡식 μ‹ κ³  νŽ˜μ΄μ§€ μ—°κ²°
  • Supabase Auth 기반 νšŒμ›κ°€μž…, 둜그인, λ‘œκ·Έμ•„μ›ƒ, νšŒμ› νƒˆν‡΄
  • νšŒμ›κ°€μž… 및 사진 μ—…λ‘œλ“œ μ „ κ°œμΈμ •λ³΄ 이용 λ™μ˜

μ‚¬μš©μžμ—κ²Œ λ³΄μ΄λŠ” μž‘λ™ 흐름

  1. 사진 μž…λ ₯ β€” μΉ΄λ©”λΌλ‘œ μ΄¬μ˜ν•˜κ±°λ‚˜ μ•¨λ²”μ—μ„œ 사진을 κ³ λ¦…λ‹ˆλ‹€.
  2. 사진 μ€€λΉ„ β€” λΈŒλΌμš°μ €κ°€ 파일 ν˜•μ‹κ³Ό 크기λ₯Ό ν™•μΈν•˜κ³ , μ—…λ‘œλ“œν•˜κΈ° 쒋은 크기둜 μ€„μž…λ‹ˆλ‹€.
  3. 뢄석 μš”μ²­ β€” 사진을 λΉ„κ³΅κ°œ μ €μž₯μ†Œμ— 올리고 뢄석 μž‘μ—…μ„ λ“±λ‘ν•©λ‹ˆλ‹€.
  4. 물체 κ΄€μ°° β€” VLM(Vision Language Model)이 물체의 이름, μœ„μΉ˜, 크기, 재질, μƒνƒœ 등을 μ •ν•΄μ§„ JSON ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  5. κ·œμΉ™ 적용 β€” μ„œλ²„κ°€ κ΄€μ°° κ²°κ³Όλ₯Ό 강남ꡬ 수수료 λͺ©λ‘κ³Ό λŒ€μ‘°ν•΄ 배좜 λŒ€μƒκ³Ό μ˜ˆμƒ κΈˆμ•‘μ„ κ³„μ‚°ν•©λ‹ˆλ‹€.
  6. μ‚¬μš©μž 확인 β€” 사진 속 λ²ˆν˜Έμ™€ ν’ˆλͺ© μΉ΄λ“œλ₯Ό λΉ„κ΅ν•˜λ©΄μ„œ ν’ˆλͺ©Β·κ·œκ²©Β·μˆ˜λŸ‰μ„ μˆ˜μ •ν•˜κ±°λ‚˜ μ œμ™Έν•©λ‹ˆλ‹€.
  7. μ‹ κ³  μ€€λΉ„ β€” ν™•μ •ν•œ λͺ©λ‘κ³Ό μ˜ˆμƒ 합계λ₯Ό ν™•μΈν•˜κ³  강남ꡬ 곡식 μ‹ κ³  νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.

사진 뢄석은 λͺ‡ 초 이상 걸릴 수 μžˆμœΌλ―€λ‘œ 화면이 κ²°κ³Όλ₯Ό 기닀리며 λ©ˆμΆ”μ§€ μ•Šλ„λ‘ 비동기 μž‘μ—…μœΌλ‘œ μ„€κ³„ν–ˆμŠ΅λ‹ˆλ‹€. 뢄석 μš”μ²­μ„ λ°›μœΌλ©΄ μ„œλ²„λŠ” λ¨Όμ € 202 queuedλ₯Ό λ°˜ν™˜ν•˜κ³ , λΈŒλΌμš°μ €λŠ” 일정 κ°„κ²©μœΌλ‘œ μ™„λ£Œ μ—¬λΆ€λ₯Ό ν™•μΈν•©λ‹ˆλ‹€. μ‰½κ²Œ 말해 β€œμ ‘μˆ˜ 번호λ₯Ό λ¨Όμ € λ°›κ³ , μ€€λΉ„κ°€ λλ‚¬λŠ”μ§€ λ‹€μ‹œ λ¬Όμ–΄λ³΄λŠ” λ°©μ‹β€μž…λ‹ˆλ‹€.

전체 섀계 ꡬ쑰

flowchart LR
    A[λΈŒλΌμš°μ €<br/>Next.js ν™”λ©΄] -->|둜그인| B[Supabase Auth]
    A -->|μ—…λ‘œλ“œ 토큰 μš”μ²­| C[Vercel<br/>Route Handler]
    C -->|일회용 토큰 λ°œκΈ‰| D[Supabase Storage<br/>λΉ„κ³΅κ°œ 사진]
    A -->|ν† ν°μœΌλ‘œ 직접 μ—…λ‘œλ“œ| D
    A -->|뢄석 μž‘μ—… 생성| C
    C --> E[Supabase Postgres<br/>μž‘μ—… μƒνƒœμ™€ κ²°κ³Ό]
    E -->|pg_net 비동기 호좜| F[Supabase Edge Function]
    F -->|사진 κ΄€μ°° μš”μ²­| G[OpenAI Responses API]
    G -->|κ΅¬μ‘°ν™”λœ κ΄€μ°° κ²°κ³Ό| F
    F -->|κ²€μ¦Β·κ·œμΉ™ 적용 ν›„ μ €μž₯| E
    A -->|μ™„λ£Œλ  λ•ŒκΉŒμ§€ polling| C
    C -->|ν˜„μž¬ μƒνƒœ λ˜λŠ” κ²°κ³Ό| A
Loading

ꡬ성 μš”μ†Œλ³„ μ±…μž„

ꡬ성 μš”μ†Œ ν•˜λŠ” 일 ν•˜μ§€ μ•ŠλŠ” 일
λΈŒλΌμš°μ € / Next.js ν™”λ©΄ 둜그인, 사진 μ„ νƒΒ·μ „μ²˜λ¦¬, μ—…λ‘œλ“œ, μ§„ν–‰ μƒνƒœ ν‘œμ‹œ, κ²°κ³Ό μˆ˜μ • OpenAIλ₯Ό 직접 ν˜ΈμΆœν•˜κ±°λ‚˜ λΉ„λ°€ ν‚€λ₯Ό λ³΄κ΄€ν•˜μ§€ μ•ŠμŒ
Vercel Route Handler 곡개 API 제곡, Supabase JWT 검증, μ—…λ‘œλ“œ 토큰 λ°œκΈ‰, 뢄석 μž‘μ—… μƒμ„±Β·μ‘°νšŒ AI 뢄석을 λ™κΈ°μ‹μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ μ•ŠμŒ
Supabase Auth, λΉ„κ³΅κ°œ Storage, Postgres, RLS, μž‘μ—… μƒνƒœμ™€ μ‚¬μš©λŸ‰ 관리 화면을 λ Œλ”λ§ν•˜μ§€ μ•ŠμŒ
Supabase Edge Function 사진 κ΄€μ°° μš”μ²­, 응닡 μŠ€ν‚€λ§ˆ 검증, λ³΄μ•ˆ 검사, 수수료 κ·œμΉ™ 적용 λΈŒλΌμš°μ €μ— λͺ¨λΈ ν‚€λ₯Ό λ…ΈμΆœν•˜μ§€ μ•ŠμŒ
VLM 사진 속 λ¬Όμ²΄Β·μœ„μΉ˜Β·μž¬μ§ˆΒ·μƒνƒœΒ·ν¬κΈ°λ₯Ό κ΄€μ°° μˆ˜μˆ˜λ£Œμ™€ μ΅œμ’… 배좜 방법을 μž„μ˜λ‘œ κ²°μ •ν•˜μ§€ μ•ŠμŒ
곡용 계약 (shared/) Frontend, Backend, VLM이 μ£Όκ³ λ°›λŠ” 데이터 ν˜•μ‹μ„ μ •μ˜ νŠΉμ • 파트만의 κ΅¬ν˜„ 세뢀사항을 λ‹΄μ§€ μ•ŠμŒ

κ°„λ‹¨νžˆ μ •λ¦¬ν•˜λ©΄ Vercel은 ν™”λ©΄κ³Ό 곡개 API의 μž…κ΅¬, SupabaseλŠ” 인증·저μž₯Β·λ°μ΄ν„°Β·λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…, VLM은 사진을 κ΅¬μ‘°ν™”λœ κ΄€μ°° λ°μ΄ν„°λ‘œ λ°”κΎΈλŠ” λˆˆμž…λ‹ˆλ‹€.

사진 ν•œ μž₯이 λΆ„μ„λ˜λŠ” κ³Όμ •

  1. λΈŒλΌμš°μ €κ°€ POST /api/uploads둜 일회용 μ—…λ‘œλ“œ 토큰을 μš”μ²­ν•©λ‹ˆλ‹€.
  2. λΈŒλΌμš°μ €κ°€ 토큰을 μ΄μš©ν•΄ 사진을 Supabase의 λΉ„κ³΅κ°œ Storage에 직접 μ˜¬λ¦½λ‹ˆλ‹€.
  3. POST /api/analysesκ°€ Postgres에 뢄석 μž‘μ—…μ„ λ§Œλ“€κ³  μ¦‰μ‹œ 202 queuedλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  4. Postgres triggerκ°€ pg_net을 톡해 Supabase Edge Function을 λΉ„λ™κΈ°λ‘œ ν˜ΈμΆœν•©λ‹ˆλ‹€.
  5. Edge Function이 OpenAI Responses API에 사진 관찰을 μš”μ²­ν•©λ‹ˆλ‹€.
  6. μ •ν•΄μ§„ JSON Schema와 λ³΄μ•ˆ 검사λ₯Ό ν†΅κ³Όν•œ κ²°κ³Όμ—λ§Œ 강남ꡬ κ·œμΉ™μ„ μ μš©ν•΄ μ €μž₯ν•©λ‹ˆλ‹€.
  7. λΈŒλΌμš°μ €κ°€ GET /api/analyses/{id}λ₯Ό 반볡 ν˜ΈμΆœν•˜μ—¬ μ™„λ£Œλœ κ²°κ³Όλ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.

μ€‘μš”ν•œ 섀계 원칙

1. AI의 κ΄€μ°°κ³Ό μ„œλΉ„μŠ€μ˜ νŒλ‹¨μ„ λΆ„λ¦¬ν•©λ‹ˆλ‹€

VLM은 μ‚¬μ§„μ—μ„œ λ³΄μ΄λŠ” μ •λ³΄λ§Œ λ°˜ν™˜ν•©λ‹ˆλ‹€. 배좜 κ°€λŠ₯ 여뢀와 μˆ˜μˆ˜λ£ŒλŠ” λ°±μ—”λ“œκ°€ κ΄€λ¦¬ν•˜λŠ” 강남ꡬ 곡식 μΉ΄νƒˆλ‘œκ·Έμ™€ κ·œμΉ™μœΌλ‘œ κ²°μ •ν•©λ‹ˆλ‹€. μ‚¬μ§„λ§ŒμœΌλ‘œ κ·œκ²©μ„ ν•˜λ‚˜λ‘œ ν™•μ •ν•˜κΈ° μ–΄λ ΅λ‹€λ©΄ κΈˆμ•‘μ„ μ§€μ–΄λ‚΄μ§€ μ•Šκ³  곡식 κΈˆμ•‘ λ²”μœ„λ‚˜ 확인 ν•„μš” μƒνƒœλ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.

2. μ‚¬μš©μžκ°€ μ΅œμ’… κ²°μ •κΆŒμ„ κ°–μŠ΅λ‹ˆλ‹€

사진 속 물체와 κ²°κ³Ό μΉ΄λ“œμ—λŠ” 같은 ID와 색상을 μ‚¬μš©ν•©λ‹ˆλ‹€. μ‚¬μš©μžλŠ” AIκ°€ μ œμ•ˆν•œ ν’ˆλͺ©μ„ 사진과 λΉ„κ΅ν•˜κ³ , 잘λͺ»λœ ν•­λͺ©μ„ μˆ˜μ •ν•˜κ±°λ‚˜ μ œμ™Έν•œ λ’€ μ΅œμ’… λͺ©λ‘μ„ ν™•μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. 뢄석 μ‹œκ°„μ΄ ν™”λ©΄ 응닡 μ‹œκ°„μ„ 막지 μ•ŠμŠ΅λ‹ˆλ‹€

뢄석 μš”μ²­κ³Ό κ²°κ³Ό 쑰회λ₯Ό λΆ„λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€. λͺ¨λΈ 응닡이 λŠ¦μ–΄μ Έλ„ μ‚¬μš©μžλŠ” μ§„ν–‰ μƒνƒœλ₯Ό λ³Ό 수 있고, 각 뢄석은 Postgres의 ν•œ ν–‰μœΌλ‘œ 남아 운영 쀑에도 μƒνƒœλ₯Ό 좔적할 수 μžˆμŠ΅λ‹ˆλ‹€.

4. λΉ„λ°€ 값은 ν•„μš”ν•œ μ„œλ²„μ—λ§Œ λ‘‘λ‹ˆλ‹€

λΈŒλΌμš°μ €μ—λŠ” OpenAI API keyλ‚˜ Supabase service role keyλ₯Ό λ…ΈμΆœν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. OpenAI κ΄€λ ¨ λΉ„λ°€ 값은 Supabase Edge Function secretκ³Ό Vaultμ—μ„œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

5. 사진 속 λ¬Έμž₯을 λͺ…λ ΉμœΌλ‘œ μ‹ λ’°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€

사진에 적힌 κΈ€μžλŠ” κ΄€μ°° λŒ€μƒμΌ 뿐 μ‹œμŠ€ν…œ λͺ…령이 μ•„λ‹™λ‹ˆλ‹€. ν”„λ‘¬ν”„νŠΈ, JSON Schema, μ„œλ²„ κ²€μ¦μ˜ μ—¬λŸ¬ λ‹¨κ³„μ—μ„œ prompt injection μ‹ ν˜Έλ₯Ό ν™•μΈν•˜λ©°, μ˜μ‹¬μŠ€λŸ¬μš΄ κ²°κ³ΌλŠ” μ‚¬μš©μžμ—κ²Œ μ „λ‹¬ν•˜μ§€ μ•Šκ³  μ‹€νŒ¨ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

μ €μž₯μ†Œ ꡬ쑰

beorimi/
β”œβ”€ frontend/                 # Next.js ν™”λ©΄κ³Ό Vercel Route Handler API
β”‚  └─ src/app/api/          # μ—…λ‘œλ“œΒ·λΆ„μ„Β·κ³„μ • 곡개 API
β”œβ”€ supabase/                 # 운영 λ°±μ—”λ“œ
β”‚  β”œβ”€ migrations/           # DB μŠ€ν‚€λ§ˆ, RLS, Storage, trigger, cron
β”‚  └─ functions/analyze/    # 비동기 뢄석 Edge Function
β”œβ”€ shared/                   # μ„Έ νŒŒνŠΈκ°€ κ³΅μœ ν•˜λŠ” 데이터 계약
β”‚  β”œβ”€ api/openapi.yaml      # 곡개 API λͺ…μ„Έ
β”‚  └─ schemas/              # μš”μ²­Β·μ‘λ‹΅ JSON Schema
β”œβ”€ vlm/                      # ν”„λ‘¬ν”„νŠΈμ™€ μŠ€ν‚€λ§ˆλ₯Ό μ‹€ν—˜ν•˜λŠ” 둜컬 Python 도ꡬ
β”œβ”€ docs/                     # 역할별 상세 κ°€μ΄λ“œμ™€ ν˜‘μ—… μš”μ²­ λ³΄λ“œ
β”œβ”€ legacy/aws/               # μš΄μ˜μ—μ„œ μ œμ™Έλœ 이전 AWS κ΅¬ν˜„
β”œβ”€ AGENTS.md                 # μ €μž₯μ†Œ 전체 μž‘μ—… κ·œμΉ™
└─ beorimi-slide.html        # ν”„λ‘œμ νŠΈ λ°œν‘œ 자료

처음 μ°Έμ—¬ν–ˆλ‹€λ©΄ μ•„λž˜μ²˜λŸΌ 찾으면 λ©λ‹ˆλ‹€.

ν•˜κ³  싢은 일 λ¨Όμ € λ³Ό κ³³
ν™”λ©΄μ΄λ‚˜ μ‚¬μš©μž λ™μž‘ μˆ˜μ • frontend/ β†’ frontend/AGENTS.md
API, DB, 인증, Storage μˆ˜μ • supabase/ β†’ supabase/AGENTS.md
운영 뢄석 worker μˆ˜μ • supabase/functions/analyze/
VLM ν”„λ‘¬ν”„νŠΈΒ·μ‘λ‹΅ μ‹€ν—˜ vlm/ β†’ vlm/AGENTS.md
API ν•„λ“œλ‚˜ JSON ꡬ쑰 λ³€κ²½ shared/api/openapi.yaml, shared/schemas/
λ‹€λ₯Έ 역할에 μž‘μ—… μš”μ²­ docs/cowork_ground.md

ν˜‘μ—… 방식

λ²„λ¦¬λ―ΈλŠ” Frontend, Backend, VLM μ„Έ 역할이 각자의 폴더λ₯Ό λ§‘κ³ , shared/의 데이터 κ³„μ•½μœΌλ‘œ μ—°κ²°λ˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.

μ—­ν•  μ£Όμš” μ±…μž„ λ‹΄λ‹Ή 경둜
Frontend ν™”λ©΄, 사진 μž…λ ₯, μ‚¬μš©μž μˆ˜μ •, API 호좜, κ²°κ³Ό ν‘œμ‹œ frontend/
Backend 곡개 API, 인증 검증, DB, Storage, 비동기 μž‘μ—…, μ΅œμ’… 배좜 νŒμ • frontend/src/app/api/, supabase/
VLM 이미지 κ΄€μ°° ν”„λ‘¬ν”„νŠΈ, κ΅¬μ‘°ν™”λœ 좜λ ₯, κ΄€μ°° ν’ˆμ§ˆκ³Ό μ•ˆμ „μ„± 운영: supabase/functions/analyze/, μ‹€ν—˜: vlm/

κΈ°λ³Έ μž‘μ—… μˆœμ„œ

  1. λ²”μœ„λ₯Ό μ •ν•©λ‹ˆλ‹€. μž‘μ—…μ΄ Frontend, Backend, VLM 쀑 어디에 μ†ν•˜λŠ”μ§€ λ¨Όμ € μ •ν•©λ‹ˆλ‹€.
  2. μ—­ν•  κ·œμΉ™μ„ μ½μŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή ν΄λ”μ˜ AGENTS.md와 ν•„μš”ν•œ docs/<role>.md λΆ€λΆ„λ§Œ ν™•μΈν•©λ‹ˆλ‹€.
  3. 각자 맑은 ν΄λ”μ—μ„œ μž‘μ—…ν•©λ‹ˆλ‹€. νŒŒνŠΈλ³„ λΈŒλžœμΉ˜μ—μ„œ λ³€κ²½ν•˜κ³ , λ‹€λ₯Έ μ—­ν• μ˜ μ½”λ“œλ₯Ό μž„μ˜λ‘œ ν•¨κ»˜ μˆ˜μ •ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  4. μΈν„°νŽ˜μ΄μŠ€ 변경은 계약뢀터 μˆ˜μ •ν•©λ‹ˆλ‹€. μˆœμ„œλŠ” 항상 shared 계약 β†’ 데이터λ₯Ό μ œκ³΅ν•˜λŠ” μ½”λ“œ β†’ 데이터λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œμž…λ‹ˆλ‹€.
  5. νŒŒνŠΈλ³„ 검증을 μ‹€ν–‰ν•©λ‹ˆλ‹€. μž‘μ€ ν…ŒμŠ€νŠΈλΆ€ν„° lint, build, 톡합 확인 순으둜 κ²€μ¦ν•©λ‹ˆλ‹€.
  6. κ²€ν†  ν›„ main에 ν•©μΉ©λ‹ˆλ‹€. λ¨Έμ§€ν•  λ•Œ κ΅¬ν˜„λΏ μ•„λ‹ˆλΌ 곡용 μŠ€ν‚€λ§ˆμ™€ λ¬Έμ„œκ°€ ν•¨κ»˜ λ§žλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ 뢄석 결과에 μƒˆ ν•„λ“œλ₯Ό μΆ”κ°€ν•œλ‹€λ©΄ λ‹€μŒ μˆœμ„œλ‘œ μž‘μ—…ν•©λ‹ˆλ‹€.

shared/schemas μˆ˜μ •
        ↓
Supabase Edge Function이 μƒˆ ν•„λ“œλ₯Ό 제곡
        ↓
Vercel APIκ°€ 응닡을 검증
        ↓
Frontendκ°€ μƒˆ ν•„λ“œλ₯Ό 화면에 ν‘œμ‹œ

λ‹€λ₯Έ 역할에 μš”μ²­ν•˜λŠ” 방법

ν•œ μ—­ν• μ—μ„œ λ‹€λ₯Έ μ—­ν• μ˜ 변경이 ν•„μš”ν•˜λ©΄ docs/cowork_ground.md에 μš”μ²­μ„ λ‚¨κΉλ‹ˆλ‹€.

  • μš”μ²­μžκ°€ μ™„λ£Œ 쑰건과 ν•„μš”ν•œ 데이터 ν˜•μ‹μ„ μ μŠ΅λ‹ˆλ‹€.
  • λ‹΄λ‹Ή 역할이 응닡과 검증 증거λ₯Ό κΈ°λ‘ν•©λ‹ˆλ‹€.
  • μš”μ²­μžκ°€ κ²°κ³Όλ₯Ό ν™•μΈν•œ λ’€μ—λ§Œ μš”μ²­μ„ DONE으둜 λ‹«μŠ΅λ‹ˆλ‹€.
  • ν•œ μ—­ν•  μ•ˆμ—μ„œ λλ‚˜λŠ” λ‹¨μˆœ TODOλŠ” ν˜‘μ—… λ³΄λ“œμ— μ˜¬λ¦¬μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이 방식은 β€œν”„λ‘ νŠΈκ°€ λ°±μ—”λ“œ 응닡을 μΆ”μΈ‘ν•˜λŠ” λ¬Έμ œβ€λ‚˜ β€œVLM 좜λ ₯이 λ°”λ€Œμ—ˆλŠ”λ° μŠ€ν‚€λ§ˆμ™€ 화면이 μ„œλ‘œ λ‹€λ₯Έ λ¬Έμ œβ€λ₯Ό 쀄여 μ€λ‹ˆλ‹€.

λ‘œμ»¬μ—μ„œ μ‹€ν–‰ν•˜κΈ°

μ€€λΉ„λ¬Ό

  • Node.js 22.13 이상
  • npm
  • μ—°κ²°ν•  Supabase ν”„λ‘œμ νŠΈ
  • Supabase CLI β€” migrationμ΄λ‚˜ Edge Function을 μˆ˜μ •ν•  λ•Œλ§Œ ν•„μš”
  • Python 3 β€” 둜컬 VLM μ‹€ν—˜μ„ ν•  λ•Œλ§Œ ν•„μš”

1. ν”„λ‘ νŠΈμ—”λ“œ ν™˜κ²½ λ³€μˆ˜ λ§Œλ“€κΈ°

PowerShell κΈ°μ€€μœΌλ‘œ μ˜ˆμ‹œ νŒŒμΌμ„ λ³΅μ‚¬ν•©λ‹ˆλ‹€.

Copy-Item frontend/.env.example frontend/.env.local

frontend/.env.local에 μžμ‹ μ˜ Supabase ν”„λ‘œμ νŠΈ 값을 λ„£μŠ΅λ‹ˆλ‹€.

NEXT_PUBLIC_SUPABASE_URL=https://<project-ref>.supabase.co
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=<publishable-key>
SUPABASE_SERVICE_ROLE_KEY=<server-only-service-role-key>
ν™˜κ²½ λ³€μˆ˜ μš©λ„ λΈŒλΌμš°μ € 곡개 μ—¬λΆ€
NEXT_PUBLIC_SUPABASE_URL Supabase ν”„λ‘œμ νŠΈ μ£Όμ†Œ 곡개 κ°€λŠ₯
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY λΈŒλΌμš°μ €μš© 곡개 ν‚€ 곡개 κ°€λŠ₯
SUPABASE_SERVICE_ROLE_KEY Vercel API의 μ„œλ²„ μž‘μ—…μš© ν‚€ 곡개 κΈˆμ§€

SUPABASE_SERVICE_ROLE_KEYμ—λŠ” μ ˆλŒ€ NEXT_PUBLIC_ 접두사λ₯Ό 뢙이지 말고, λΈŒλΌμš°μ € μ»΄ν¬λ„ŒνŠΈμ—μ„œλ„ 읽지 λ§ˆμ„Έμš”.

2. νŒ¨ν‚€μ§€ μ„€μΉ˜ ν›„ 개발 μ„œλ²„ μ‹€ν–‰ν•˜κΈ°

npm.cmd --prefix frontend ci
npm.cmd --prefix frontend run dev

λΈŒλΌμš°μ €μ—μ„œ http://localhost:3000을 μ—΄λ©΄ λ©λ‹ˆλ‹€. μ‹€μ œ λ‘œκ·ΈμΈΒ·μ—…λ‘œλ“œΒ·λΆ„μ„ 흐름은 ν™˜κ²½ λ³€μˆ˜μ— μ—°κ²°ν•œ Supabase ν”„λ‘œμ νŠΈμ˜ Auth, Storage, DB, Edge Function ꡬ성이 μ™„λ£Œλ˜μ–΄ μžˆμ–΄μ•Ό λ™μž‘ν•©λ‹ˆλ‹€.

3. 둜컬 VLM μ‹€ν—˜ν•˜κΈ° (선택)

운영 뢄석은 Supabase Edge Functionμ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€. vlm/은 ν”„λ‘¬ν”„νŠΈμ™€ 응닡 ν˜•μ‹μ„ λ‘œμ»¬μ—μ„œ μ‹€ν—˜ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

Copy-Item vlm/.env.example vlm/.env
python -m pip install -r vlm/requirements.txt -r vlm/requirements-dev.txt
python -m vlm.app.cli <image-path>

vlm/.envμ—λŠ” 둜컬 μ‹€ν—˜μš© OPENAI_API_KEYλ₯Ό μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ‹€μ œ ν‚€κ°€ λ“€μ–΄κ°„ .env νŒŒμΌμ€ Git에 μ˜¬λ¦¬μ§€ λ§ˆμ„Έμš”.

검증 λͺ…λ Ήμ–΄

λ³€κ²½ν•œ μ˜μ—­λΆ€ν„° ν™•μΈν•œ λ’€ ν•„μš”ν•œ 전체 검증을 μ‹€ν–‰ν•©λ‹ˆλ‹€.

# Frontend lint와 배포용 build
npm.cmd --prefix frontend run lint
npm.cmd --prefix frontend run build

# 둜컬 VLM ν…ŒμŠ€νŠΈ
python -m pytest vlm/tests

# Supabase 뢄석 worker ν…ŒμŠ€νŠΈ
node --experimental-strip-types --test supabase/functions/analyze/*.test.ts

배포 ꡬ쑰

Supabase

  1. ν”„λ‘œμ νŠΈλ₯Ό μ—°κ²°ν•˜κ³  migration을 λ°˜μ˜ν•©λ‹ˆλ‹€.

    supabase link --project-ref <project-ref>
    supabase db push
  2. 뢄석 Edge Function을 λ°°ν¬ν•©λ‹ˆλ‹€.

    supabase functions deploy analyze
  3. Edge Function secret에 OPENAI_API_KEY, OPENAI_VLM_MODEL, ANALYSIS_WORKER_SECRET을 λ“±λ‘ν•©λ‹ˆλ‹€.

  4. Supabase Vault에 λ‹€μŒ 값을 λ“±λ‘ν•©λ‹ˆλ‹€.

    • beorimi_analysis_worker_url: 배포된 analyze Edge Function URL
    • beorimi_analysis_worker_secret: ANALYSIS_WORKER_SECRETκ³Ό 같은 κ°’
  5. Supabase Auth의 Site URLκ³Ό ν—ˆμš© Redirect URL에 Vercel 운영 URL을 λ“±λ‘ν•©λ‹ˆλ‹€.

OpenAI key와 worker secret은 Vercelμ΄λ‚˜ λΈŒλΌμš°μ € ν™˜κ²½ λ³€μˆ˜μ— λ“±λ‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

Vercel

  1. ν”„λ‘œμ νŠΈ Root Directoryλ₯Ό frontend둜 μ„€μ •ν•©λ‹ˆλ‹€.
  2. Build Commandλ₯Ό npm run build둜 μ„€μ •ν•©λ‹ˆλ‹€.
  3. NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY, SUPABASE_SERVICE_ROLE_KEYλ₯Ό λ“±λ‘ν•©λ‹ˆλ‹€.
  4. 배포된 Vercel URL을 Supabase Auth 섀정에 λ°˜μ˜ν•©λ‹ˆλ‹€.

ν˜„μž¬ λ²”μœ„μ™€ μ£Όμ˜μ‚¬ν•­

  • ν˜„μž¬ μ§€μ—­ 기쀀은 μ„œμšΈ κ°•λ‚¨κ΅¬μž…λ‹ˆλ‹€.
  • 지원 이미지 ν˜•μ‹μ€ JPEG, PNG, WebP이며 μ—…λ‘œλ“œ ν•œλ„λŠ” 10MiBμž…λ‹ˆλ‹€.
  • MVP 계정별 뢄석 ν•œλ„λŠ” λˆ„μ  30νšŒμž…λ‹ˆλ‹€.
  • 원본 이미지와 뢄석 기둝은 κΈ°λ³Έ 30일 λ’€ μ •λ¦¬λ©λ‹ˆλ‹€.
  • μ˜ˆμƒ μˆ˜μˆ˜λ£ŒλŠ” 참고값이며 곡식 μ‹ κ³  κ³Όμ •μ—μ„œ λ‹€μ‹œ 확인해야 ν•©λ‹ˆλ‹€.
  • 이전 FastAPI, Lambda, S3, SQS, DynamoDB, Cognito, CloudFormation, Amplify, App Runner κ΅¬ν˜„μ€ legacy/aws/에 λ³΄μ‘΄λ˜μ–΄ μžˆμ§€λ§Œ ν˜„μž¬ 운영 κ²½λ‘œμ—λŠ” μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ•žμœΌλ‘œ ν™•μž₯ν•  수 μžˆλŠ” λ°©ν–₯

  • μ•±μ—μ„œ 신고와 수거 μΌμ •κΉŒμ§€ ν•œ λ²ˆμ— μ—°κ²°
  • OpenAI μ™Έ 둜컬 VLM으둜 ꡐ체 κ°€λŠ₯ν•œ 뢄석 provider ν™•μž₯
  • 강남ꡬ μ™Έ λ‹€λ₯Έ 자치ꡬ의 ν’ˆλͺ©Β·μˆ˜μˆ˜λ£Œ κ·œμ • μΆ”κ°€

κ΄€λ ¨ λ¬Έμ„œ

Releases

Packages

Contributors

Languages