Feature Docs - otw7917/oig GitHub Wiki

1. ํ”„๋กฌํ”„ํŠธ ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ์ €์žฅ

๊ธฐ๋Šฅ ๊ฐœ์š”

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ prompt๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€๋ฅผ Storage Service์— ์ €์žฅํ›„ ํ•ด๋‹น ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ

  • Storage Service ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ AWS S3, FireBase์˜ firestore ๋“ฑ๋“ฑ์ด ์žˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ ๊ตฌ์„ฑ

  • ์ด๋ฏธ์ง€ ์ €์žฅ => Supabase Storage ์— ์ด๋ฏธ์ง€ ํŒŒ์ผ ์—…๋กœ๋“œ

  • URL ์ƒ์„ฑ -> Storage Service์˜ ๊ฒฝ์šฐ Public URL ๋˜๋Š” Signed URL์„ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ

  • ์ธํ„ฐํŽ˜์ด์Šค

    • ์ž…๋ ฅ์ฐฝ ์ž…๋ ฅ ํ…์ŠคํŠธ๊ฐ€ ๊ธธ์–ด์ง€๋ฉด ์œ„ ๋˜๋Š” ์•„๋ž˜๋กœ ๋Š˜๋ฆด์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ

๋ณด์•ˆ ๋ฐ ์ ‘๊ทผ ์ œ์–ด

  • private + signed URL ๋กœ ๊ถŒํžŒ ์ œ์–ด
  • RLS ์ •์ฑ… ์ถ”๊ฐ€ํ•ด์„œ ๋ณธ์ธ ์‚ฌ์ง„๋งŒ ์กฐํšŒํ• ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ

์˜ˆ์™ธ์ฒ˜๋ฆฌ ์‹œ๋‚˜๋ฆฌ์˜ค

โ— ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์‹œ๋‚˜๋ฆฌ์˜ค (HTTP ์ƒํƒœ ์ฝ”๋“œ ๊ธฐ์ค€)

ํ”„๋กฌํ”„ํŠธ ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ์ €์žฅ ๊ธฐ๋Šฅ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ์—๋Ÿฌ ์ผ€์ด์Šค๋ฅผ ์ •๋ฆฌํ•œ ํ‘œ์ž…๋‹ˆ๋‹ค.


๐Ÿงพ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ณ„ ์—๋Ÿฌ ๋ชฉ๋ก

HTTP ์ƒํƒœ ์ฝ”๋“œ ์ƒํ™ฉ ์„ค๋ช… ์‘๋‹ต ์˜ˆ์‹œ
400 Bad Request โœ… ํ•„์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ˆ„๋ฝ prompt๊ฐ€ ์—†๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ํ˜•์‹์ผ ๋•Œ { "error": "Prompt is required." }
400 Bad Request ์ด๋ฏธ์ง€ ํฌ๋งท ์˜ค๋ฅ˜ ์‘๋‹ต ๋ฐ›์€ ์ด๋ฏธ์ง€๊ฐ€ null, ๋นˆ ๋ฐ์ดํ„ฐ ๋“ฑ ์œ ํšจํ•˜์ง€ ์•Š์„ ๋•Œ { "error": "Generated image is invalid." }
401 Unauthorized JWT ๋ˆ„๋ฝ ๋˜๋Š” ๋งŒ๋ฃŒ ์ธ์ฆ ์—†์ด ์š”์ฒญํ•œ ๊ฒฝ์šฐ { "error": "Unauthorized request." }
403 Forbidden RLS ๋˜๋Š” Storage ๊ถŒํ•œ ์˜ค๋ฅ˜ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•  ๊ถŒํ•œ์ด ์—†๋Š” ๊ฒฝ์šฐ { "error": "Access denied." }
404 Not Found ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ ์—†์Œ Supabase Storage์— ์—…๋กœ๋“œ๋œ ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๊ฑฐ๋‚˜ ์‚ฌ๋ผ์ง„ ๊ฒฝ์šฐ { "error": "Image not found." }
429 Too Many Requests ์š”์ฒญ ์ดˆ๊ณผ ์‚ฌ์šฉ์ž ์ œํ•œ ์ดˆ๊ณผ ๋˜๋Š” API rate limit ๋„๋‹ฌ { "error": "Too many requests. Try again later." }
500 Internal Server Error ๋ชจ๋ธ API ์—๋Ÿฌ ์ด๋ฏธ์ง€ ์ƒ์„ฑ API(OpenAI ๋“ฑ) ํ˜ธ์ถœ ์‹คํŒจ { "error": "Image generation failed. Please try again." }
500 Internal Server Error Supabase ์—…๋กœ๋“œ ์‹คํŒจ ํŒŒ์ผ ์ €์žฅ ์ค‘ ๋‚ด๋ถ€ ์˜ค๋ฅ˜ ๋ฐœ์ƒ { "error": "Failed to upload image." }
503 Service Unavailable ์™ธ๋ถ€ API ์žฅ์•  ์ด๋ฏธ์ง€ ์ƒ์„ฑ API ๋˜๋Š” Supabase ์„œ๋น„์Šค ๋ถˆ์•ˆ์ • { "error": "Service temporarily unavailable." }

  • ๐Ÿ“Œ ๊ณตํ†ต ์—๋Ÿฌ ์‘๋‹ต ํ˜•์‹ ์˜ˆ์‹œ
{
  "error": "์„ค๋ช… ๋ฉ”์‹œ์ง€",
  "status": 400,
  "timestamp": "2025-07-09T01:20:00+09:00"
}

ERD