๐ฎ 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)
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
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)
์ง๋ฌธ ์
๋ ฅ : ์ค๋ ํ๋ฃจ์ ์ด์ธ๋ ๊ณ ๋ฏผ ์ค์ธ ์ง๋ฌธ์ ์
๋ ฅ์ฐฝ์ ์ ์ด์ฃผ์ธ์.
์นด๋ ์ ํ : ํ๋ฉด์ ๋์ธ ํ๋ก ์นด๋ ์ค ๋ง์์ด ๋๋ฆฌ๋ ์นด๋๋ฅผ ์ ํํฉ๋๋ค.
AI ํด์ ๋๊ธฐ : Gemini AI๊ฐ ๋น์ ์ ์ง๋ฌธ๊ณผ ์นด๋๋ฅผ ๋ถ์ํ์ฌ ํด์์ ์ค๋นํ๋ ๋์ ์ ์ ๊ธฐ๋ค๋ ค์ฃผ์ธ์.
๊ฒฐ๊ณผ ํ์ธ ๋ฐ ์ ์ฅ : ์ ๊ตํ ํ๋ก ํด์ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ณ , ๋ง์์ ๋ ๋ค๋ฉด ํ
์คํธ๋ก ๋ณต์ฌํ๊ฑฐ๋ ๋ก๊ทธ์ธํ์ฌ ํ์คํ ๋ฆฌ์ ์ ์ฅํ์ธ์!
์๋น์ค ์ํคํ
์ฒ (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)
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 ์ค์
์ด๋ฅผ ํตํด ํ๋ก ํธ์๋์์ ํ์ฑ ์๋ฌ ์์ด ์ฆ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋งํ ์ ์๋ ์์ ์ฑ ํ๋ณด
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)์ ๋ณด์กฐ ๋๊ตฌ๋ก ํ์ฉํ์ฌ ์ฝ๋ ํ์ง์ ํฅ์์์ผฐ์ต๋๋ค.