Skip to content

yunsuper/Tarot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

50 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ”ฎ AI Tarot Master: ์šด๋ช…์˜ ์†์‚ญ์ž„

Gemini AI๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๊ณ ๋ฏผ์„ ๊นŠ์ด ์žˆ๊ฒŒ ํ•ด์„ํ•ด์ฃผ๋Š” ์›น ํƒ€๋กœ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์ „ํ†ต์ ์ธ ํƒ€๋กœ ํ•ด์„์— ์ตœ์‹  AI ๊ธฐ์ˆ ์„ ์ ‘๋ชฉํ•˜์—ฌ ๊ฐœ์ธํ™”๋œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


โœจ ์ฃผ์š” ๊ธฐ๋Šฅ (Key Features)

  • AI ํƒ€๋กœ ํ•ด์„: Google Gemini 3.1 flash-lite ๋ชจ๋ธ์„ ํ™œ์šฉํ•œ ์ •๊ตํ•œ ์นด๋“œ ๋ฆฌ๋”ฉ
  • ์‹ค์‹œ๊ฐ„ ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜: Framer Motion์„ ํ™œ์šฉํ•œ ๋ชฐ์ž…๊ฐ ์žˆ๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜
  • ๊ฐœ์ธ ํžˆ์Šคํ† ๋ฆฌ: ๊ณผ๊ฑฐ์— ๋ณธ ํƒ€๋กœ ๋‚ด์—ญ์„ ๋‹ค์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ €์žฅ ๊ธฐ๋Šฅ
  • ๊ฒฐ๊ณผ ๊ณต์œ : ํ•ด์„ ๊ฒฐ๊ณผ๋ฅผ ํ…์ŠคํŠธ๋กœ ๋ณต์‚ฌํ•˜์—ฌ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ณต์œ 

๐Ÿš€ ๋ฐฐํฌ ์ฃผ์†Œ (Deployment)

https://tarot-mauve.vercel.app

  • ๋ฐฐํฌ ์•„ํ‚คํ…์ฒ˜:
    • Front-end: Vercel (Auto Deployment)
    • Back-end: Render (NestJS ์„œ๋ฒ„ ํ˜ธ์ŠคํŒ…)
    • Database: Supabase

๐Ÿ“ธ ์„œ๋น„์Šค ํ™”๋ฉด (Screenshots)

๐Ÿ”ฎ ๋ฉ”์ธ ๋ฐ ํƒ€๋กœ ๋ฆฌ๋”ฉ

๋ฉ”์ธ ํŽ˜์ด์ง€ ์นด๋“œ ์„ ํƒ ํ•ด์„ ๊ฒฐ๊ณผ

๐Ÿ“œ ๊ฒฐ๊ณผ ํ™•์ธ ์ดํ›„ ๋ฐ ํžˆ์Šคํ† ๋ฆฌ

๊ฒฐ๊ณผ ํ›„ ์•ก์…˜ ๋‚˜์˜ ํžˆ์Šคํ† ๋ฆฌ (๋ชฉ๋ก) ์ง€๋‚œ ๊ธฐ๋ก ๋‹ค์‹œ๋ณด๊ธฐ

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ (Tech Stack)

Frontend

  • Framework: React (TypeScript)
  • Routing: React Router
  • Build Tool: Vite
  • Data Fetching: Axios
  • Styling: Tailwind CSS
  • Animation: Framer Motion
  • UI Feedback: React Hot Toast
  • State Management: Zustand

Backend

  • Framework: NestJS (Node.js)
  • Language: TypeScript
  • Database: PostgreSQL (Supabase)
  • ORM: Prisma
  • Communication: Axios
  • Auth/Storage: Supabase
  • ** Hosting**: Render
  • AI Integration: Google Gemini 3.1 Flash-Lite-preview (@google/genai SDK)

๐Ÿ“‚ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ (Structure)

  • frontend/: React ๊ธฐ๋ฐ˜ ์›น ํด๋ผ์ด์–ธํŠธ
  • backend/: NestJS ๊ธฐ๋ฐ˜ API ์„œ๋ฒ„

๐ŸŽฎ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• (How to Use)

  1. ์งˆ๋ฌธ ์ž…๋ ฅ: ์˜ค๋Š˜ ํ•˜๋ฃจ์˜ ์šด์„ธ๋‚˜ ๊ณ ๋ฏผ ์ค‘์ธ ์งˆ๋ฌธ์„ ์ž…๋ ฅ์ฐฝ์— ์ ์–ด์ฃผ์„ธ์š”.
  2. ์นด๋“œ ์„ ํƒ: ํ™”๋ฉด์— ๋†“์ธ ํƒ€๋กœ ์นด๋“œ ์ค‘ ๋งˆ์Œ์ด ๋Œ๋ฆฌ๋Š” ์นด๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. AI ํ•ด์„ ๋Œ€๊ธฐ: Gemini AI๊ฐ€ ๋‹น์‹ ์˜ ์งˆ๋ฌธ๊ณผ ์นด๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ํ•ด์„์„ ์ค€๋น„ํ•˜๋Š” ๋™์•ˆ ์ž ์‹œ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”.
  4. ๊ฒฐ๊ณผ ํ™•์ธ ๋ฐ ์ €์žฅ: ์ •๊ตํ•œ ํƒ€๋กœ ํ•ด์„ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ณ , ๋งˆ์Œ์— ๋“ ๋‹ค๋ฉด ํ…์ŠคํŠธ๋กœ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ๋กœ๊ทธ์ธํ•˜์—ฌ ํžˆ์Šคํ† ๋ฆฌ์— ์ €์žฅํ•˜์„ธ์š”!

์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ (Service Architecture)

  • Client: React + Vite (SPA)
  • Server: NestJS (REST API)
  • AI: Google Gemini API (Stream/JSON Mode)
  • DB/Auth: Supabase (PostgreSQL)

ํ•ต์‹ฌ ๊ตฌํ˜„ ํฌ์ธํŠธ (Core Implementation)

1. Gemini 3.1 flash-lite-preview ๊ธฐ๋ฐ˜ AI ํƒ€๋กœ ๋ฆฌ๋”ฉ

  • ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง: ํƒ€๋กœ ๋งˆ์Šคํ„ฐ์˜ ํŽ˜๋ฅด์†Œ๋‚˜๋ฅผ ์ •๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•˜์—ฌ ์ผ๊ด€์„ฑ ์žˆ๊ณ  ์‹ ๋ขฐ๊ฐ ์žˆ๋Š” ํ•ด์„ ์ œ๊ณต
  • ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ์‘๋‹ต: AI์˜ ์‘๋‹ต์„ JSON ํฌ๋งท์œผ๋กœ ๊ฐ•์ œํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์ฆ‰์‹œ UI ์š”์†Œ(์นด๋“œ ์˜๋ฏธ, ์กฐ์–ธ, ์ดํ‰ ๋“ฑ)๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„

2. ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์„ธ์…˜ ๊ด€๋ฆฌ (๋กœ๊ทธ์ธ & ๋น„๋กœ๊ทธ์ธ)

  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ตœ์ ํ™”: ๋น„๋กœ๊ทธ์ธ ์ƒํƒœ์—์„œ๋„ ํƒ€๋กœ ํ•ด์„์„ ์ฆ‰์‹œ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก isSessionLoaded ์ƒํƒœ ๋กœ์ง ๊ตฌํ˜„
  • ๋ฐ์ดํ„ฐ ์ž๋™ ๋™๊ธฐํ™”: ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž์ผ ๊ฒฝ์šฐ ํ•ด์„ ๊ฒฐ๊ณผ๋ฅผ Supabase DB์— ์‹ค์‹œ๊ฐ„ ์ €์žฅํ•˜์—ฌ ๋งˆ์ดํŽ˜์ด์ง€(History)์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„

3. ๋ชฐ์ž…๊ฐ ์žˆ๋Š” UI/UX ์„ค๊ณ„

  • ์• ๋‹ˆ๋ฉ”์ด์…˜: Framer Motion์„ ํ™œ์šฉํ•˜์—ฌ ์‹ค์ œ ํƒ€๋กœ ์นด๋“œ๋ฅผ ๋ฝ‘๋Š” ๋“ฏํ•œ ์ƒ๋™๊ฐ ์žˆ๋Š” ์ธํ„ฐ๋ž™์…˜ ๊ตฌํ˜„
  • ๋น„๋™๊ธฐ ์ƒํƒœ ์ฒ˜๋ฆฌ: Axios ์ธํ„ฐ์…‰ํ„ฐ์™€ React Hot Toast๋ฅผ ์—ฐ๋™ํ•˜์—ฌ AI ์‘๋‹ต ๋Œ€๊ธฐ ๋ฐ ์—๋Ÿฌ ์ƒํ™ฉ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์นœ์ ˆํ•˜๊ฒŒ ์•ˆ๋‚ด

๐Ÿ”Œ ํ•ต์‹ฌ API ๋ช…์„ธ (Core API)

AI Interpretation

Method Endpoint Description
POST /tarot/interpretation ์งˆ๋ฌธ๊ณผ ์„ ํƒํ•œ ์นด๋“œ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ Gemini AI์˜ ํ•ด์„ ๊ฒฐ๊ณผ ์ƒ์„ฑ
GET /tarot/history ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ๊ณผ๊ฑฐ ํƒ€๋กœ ์ €์žฅ ๋‚ด์—ญ ์กฐํšŒ
GET /tarot/history/:id ํŠน์ • ํƒ€๋กœ ํ•ด์„ ๊ฒฐ๊ณผ ์ƒ์„ธ ์กฐํšŒ

๐Ÿง  AI ์—ฐ๋™ ๋กœ์ง (AI Integration)

  • Service Layer: NestJS์˜ Service์—์„œ GoogleGenerativeAI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด Gemini 3.1 Flash-lite ๋ชจ๋ธ๊ณผ ํ†ต์‹ 
  • System Instructions: AI๊ฐ€ ์ผ๊ด€๋œ ํƒ€๋กœ ๋งˆ์Šคํ„ฐ์˜ ํ†ค์•ค๋งค๋„ˆ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ •๊ตํ™”
  • Schema Enforcement:
    • AI๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ •ํ•ด์ง„ JSON ๊ตฌ์กฐ๋กœ ์‘๋‹ตํ•˜๋„๋ก Response Schema ์„ค์ •
    • ์ด๋ฅผ ํ†ตํ•ด ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ํŒŒ์‹ฑ ์—๋Ÿฌ ์—†์ด ์ฆ‰์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” ์•ˆ์ •์„ฑ ํ™•๋ณด

โš–๏ธ License & Credits

  • Tarot Design Standard: ์ „ ์„ธ๊ณ„ ํ‘œ์ค€์ธ ๋ผ์ด๋” ์›จ์ดํŠธ(Rider-Waite) ํƒ€๋กœ์˜ ์ƒ์ง• ์ฒด๊ณ„์™€ ๊ทœ๊ฒฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Tarot Card Images: ๋ณธ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉ๋œ ํƒ€๋กœ ์นด๋“œ ์‹ค๋ฌผ ์ด๋ฏธ์ง€(PNG)๋Š” **๋‚˜๋…ธ๋ฐ”๋‚˜๋‚˜(Nanobanana)**์˜ ์—์…‹์„ ํ™œ์šฉํ•˜์—ฌ ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Author: yunsuper (Full-stack Development)
  • License: MIT License - ๋ณธ ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค๋ฅผ ๋”ฐ๋ฅด๋ฉฐ, ์ž์œ ๋กœ์šด ์ด์šฉ๊ณผ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • AI Disclaimer: ๋ณธ ํ”„๋กœ์ ํŠธ์˜ ํƒ€๋กœ ํ•ด์„ ๊ฒฐ๊ณผ๋Š” Google Gemini 3.1 Flash-lite ๋ชจ๋ธ์— ์˜ํ•ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. AI์˜ ํ•ด์„์€ ์ฐธ๊ณ ์šฉ์ผ ๋ฟ์ด๋ฉฐ, ๋ฒ•์ ยท์˜ํ•™์ ยท์ „๋ฌธ์  ์กฐ์–ธ์„ ๋Œ€์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๐Ÿค– AI Aided Development

  • ๋ณธ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ ์„ค๊ณ„ ๋ฐ ์ตœ์ ํ™” ๊ณผ์ •์—์„œ AI ๊ธฐ์ˆ (Gemini)์„ ๋ณด์กฐ ๋„๊ตฌ๋กœ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.