๐ฝ PETTY๋ ๋ฐ๋ ค๋๋ฌผ๊ณผ ํจ๊ปํ๋ ์ฌํ์ ์ํ AI ๊ธฐ๋ฐ ์ถ์ฒ ์๋น์ค์
๋๋ค
๐ถ ์ฌ์ฉ์์ ๋ฐ๋ ค๋๋ฌผ ์ฌ์ง์ ๋ถ์ํ์ฌ ๋ง์ถคํ ์ฌํ์ง๋ฅผ ์ถ์ฒ๋ฐ์ ์ ์์ด์!
๐บ๏ธ ํ์ฌ ์์น ๊ธฐ๋ฐ ์ฃผ๋ณ์ ์๋ ๋ฐ๋ ค๋๋ฌผ ์ฌํ์ง ๋ฆฌ์คํธ๋ฅผ ํ์ธํ ์ ์์ด์!
๐๏ธ ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฅ์ ํตํด ๋ฐ๋ ค๋๋ฌผ ์ฌํ ๊ฒฝํ์ ๊ณต์ ํ ์ ์์ด์!
์ด๋ฉ์ผ ์ธ์ฆ๊ณผ ์์ ๋ก๊ทธ์ธ์ ํตํ ์ฌ์ฉ์ ์ธ์ฆ ์์คํ
- ๋ก์ปฌ ๋ก๊ทธ์ธ: ์ด๋ฉ์ผ ์ธ์ฆ ๊ธฐ๋ฐ SMTP ํ์๊ฐ์
- ์์ ๋ก๊ทธ์ธ: GitHub, Kakao OAuth2 ์ฐ๋
- JWT: Access Token (1์๊ฐ) + Refresh Token (7์ผ)
- Cookie ๋ณด์: HttpOnly, Secure ์ค์
- ํ ํฐ ์ํ: ์ฌ์ฉ์๋ณ ์ต๋ 3๊ฐ Refresh Token ๊ด๋ฆฌ
๋ฐ๋ ค๋๋ฌผ ์ฌ์ง์ ์ ๋ ฅํ๋ฉด, ์ฑ๊ฒฉ, ์ธ๋ชจ, ํน์ฑ์ ๋ํ ์ ๋ณด ๋ถ์
- ๋ค์ค AI ๋ชจ๋ธ: AWS Rekognition + Gemini 2.0 Flash + Llama 3.2 Vision
- ํน์ฑ ๋ถ์: ์ข , ํ์ข , ํฌ๊ธฐ, ๋ฌด๊ฒ, ๋งน๊ฒฌ ์ฌ๋ถ ์๋ ํ๋ณ
- ํด๋ฐฑ ์์คํ : ๋ชจ๋ธ ๊ฐ ์ฐ์ ์์๋ฅผ ํตํ ์์ ์ฑ ๋ณด์ฅ
์ฌ์ฉ์๊ฐ ์ํ๋ ์กฐ๊ฑด์ ์ฌํ์ง๋ฅผ ์ ๋ ฅํ๋ฉด AI๋ฅผ ํตํด ๋ง์ถค ์ถ์ฒ ์ ๊ณต
- ์ ์ฌ๋ ๊ฒ์: OpenAI Embeddings + Qdrant Vector DB
- AI ํ์ฉ ๋ฆฌ๋ญํน: Gemini๋ฅผ ํ์ฉํ ๋ง์ถคํ ์์ ์กฐ์
- ๋ค์ค ํํฐ๋ง: ์ง์ญ, ์นดํ ๊ณ ๋ฆฌ, ๋ฐ๋ ค๋๋ฌผ ์กฐ๊ฑด ๋ณตํฉ ๊ฒ์
GPS ํ์ฌ ์์น ๊ธฐ๋ฐ ๋ฐ๋ ค ๋๋ฌผ ๋๋ฐ ๊ฐ๋ฅ ์ฌํ ์ ๋ณด ์ ๊ณต
- ์ค์๊ฐ ๋๊ธฐํ: ํ๊ตญ๊ด๊ด๊ณต์ฌ Tour API ์๋ ์ฐ๋
- ์์น ๊ธฐ๋ฐ ๊ฒ์: ์นด์นด์ค ์ง๋ API ๋ฐ ๊ณต๊ฐ ์ธ๋ฑ์ค ํ์ฉ
- ์์ธ ์ ๋ณด: ์์ค, ํธ์์ฌํญ, ๋ฐ๋ ค๋๋ฌผ ๋๋ฐ ์กฐ๊ฑด ํํฐ๋ง
CRUD, ๋๊ธ, ์ข์์ ๋ฑ ์ฌ์ฉ์๋ฅผ ๊ณ ๋ คํ ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฅ
- ๊ฒ์ํ: ํ๊ธฐ, ์๋, Q&A ์นดํ ๊ณ ๋ฆฌ๋ณ ์ด์
- ์ด๋ฏธ์ง ์ ๋ก๋: Supabase Storage ์ฐ๋
- ์์ ๊ธฐ๋ฅ: ์ข์์, ๋๊ธ, ์๋ฆผ ์์คํ



Spring Boot
โโโ Spring Security (JWT + OAuth2)
โโโ Spring Data JPA (๋ฉํฐ ๋ฐ์ดํฐ์์ค)
โโโ Spring AI
โโโ Validation
๋ฉํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํคํ
์ฒ
โโโ PostgreSQL (์ฌ์ฉ์/์ปค๋ฎค๋ํฐ) - Supabase
โโโ MySQL (์ฌํ์ง ์ ๋ณด) - Aiven
โโโ Vector Database - Qdrant
โโโ File Storage - Supabase Storage
AI ํ์ดํ๋ผ์ธ
โโโ AWS Rekognition (์ด๋ฏธ์ง ๋ผ๋ฒจ๋ง)
โโโ Google Gemini 2.0 Flash (ํ
์คํธ ์์ฑ)
โโโ Meta Llama 3.2 Vision (์ด๋ฏธ์ง ๋ถ์)
โโโ OpenAI Embeddings (๋ฒกํฐ ์์ฑ)
โโโ ํ๊ตญ๊ด๊ด๊ณต์ฌ API (๋ฐ์ดํฐ ๋๊ธฐํ)
ํด๋ผ์ฐ๋ ์ธํ๋ผ
โโโ Oracle Cloud Infrastructure (๋ฐฐํฌ)
โโโ AWS (Rekognition)
โโโ Supabase (PostgreSQL, Storage)
โโโ Aiven (MySQL)
โโโ Qdrant Cloud (Vector DB)
graph TB
User[๐ค ์ฌ์ฉ์] --> Web[๐ ์น ์ธํฐํ์ด์ค]
Web --> Auth[๐ ์ธ์ฆ ์์คํ
]
Web --> Vision[๐๏ธ Vision AI]
Web --> Recommend[๐ฏ ์ถ์ฒ ์์คํ
]
Web --> Community[๐ฌ ์ปค๋ฎค๋ํฐ]
Auth --> Supabase[(๐ Supabase PostgreSQL)]
Community --> Supabase
Community --> Storage[๐ Supabase Storage]
Vision --> Rekognition[๐ AWS Rekognition]
Vision --> Gemini[๐ค Gemini 2.0]
Vision --> Llama[๐ฆ Llama 3.2]
Recommend --> OpenAI[๐ง OpenAI Embeddings]
Recommend --> Qdrant[(๐ฎ Qdrant Vector DB)]
Recommend --> GeminiRerank[โก Gemini Reranking]
Sync[๐ ๋ฐ์ดํฐ ๋๊ธฐํ] --> TourAPI[๐บ๏ธ ํ๊ตญ๊ด๊ด๊ณต์ฌ API]
Sync --> MySQL[(๐ฌ Aiven MySQL)]
Recommend --> MySQL
style User fill:#e1f5fe
style Vision fill:#f3e5f5
style Recommend fill:#e8f5e8
style Community fill:#fff3e0
erDiagram
%% Supabase PostgreSQL - ์ฌ์ฉ์/์ปค๋ฎค๋ํฐ
USERS ||--o{ POSTS : writes
USERS ||--o{ COMMENTS : writes
USERS ||--o{ POST_LIKES : likes
POSTS ||--o{ COMMENTS : has
POSTS ||--o{ POST_IMAGES : contains
POSTS ||--o{ POST_LIKES : receives
%% Aiven MySQL - ์ฌํ์ง ์ ๋ณด
CONTENT ||--o{ CONTENT_IMAGES : has
CONTENT ||--|| CONTENT_INTRO : has
CONTENT ||--|| PET_TOUR_INFO : has
CONTENT ||--o{ CONTENT_INFOS : has
CONTENT ||--o{ ROOM_INFOS : has
%% Vector Database
VECTOR_EMBEDDINGS ||--|| CONTENT : represents
USERS {
uuid id PK
string username
string display_name
string role
string provider
timestamp created_at
}
CONTENT {
bigint content_id PK
int content_type_id
string title
string addr1
point location
timestamp modified_time
}
VECTOR_EMBEDDINGS {
string id PK
string content_id FK
vector embedding
json metadata
}
flowchart LR
A[๐ท ์ด๋ฏธ์ง ์
๋ก๋] --> B[๐ ์ด๋ฏธ์ง ๊ฒ์ฆ]
B --> C{์ ํจํ๊ฐ?}
C -->|No| D[โ ์ค๋ฅ ๋ฐํ]
C -->|Yes| E[๐ค AWS Rekognition]
E --> F[๐ ๋ผ๋ฒจ ๋ถ์]
F --> G[๐ ๋๋ฌผ ์ข
ํ๋ณ]
G --> H[๐ฌ ์ค๊ฐ ๊ฒฐ๊ณผ ๋ฐํ]
H --> I[๐ง Gemini 2.0 Flash]
I --> J{์ฑ๊ณต?}
J -->|Yes| K[๐ ์์ธ ๋ถ์ ์๋ฃ]
J -->|No| L[๐ฆ Llama 3.2 Fallback]
L --> M[๐ ๋ถ์ ์๋ฃ]
K --> N[๐พ ์บ์ ์ ์ฅ]
M --> N
N --> O[๐ ์ต์ข
๋ณด๊ณ ์]
style A fill:#e1f5fe
style I fill:#f3e5f5
style L fill:#fff3e0
style O fill:#e8f5e8
flowchart LR
A[๐ค ์ฌ์ฉ์ ์
๋ ฅ] --> B[๐ ํ๋กฌํํธ ๋น๋ฉ]
B --> C[๐ง OpenAI Embeddings]
C --> D[๐ ๋ฒกํฐ ๊ฒ์]
D --> E[๐ ํํฐ๋ง]
E --> F[๐ค Gemini ๋ฆฌ๋ญํน]
F --> G[๐ ์ต์ข
์ถ์ฒ]
subgraph "Vector Search"
D --> D1[๐ฎ Qdrant Query]
D1 --> D2[๐ Similarity Score]
D2 --> D3[๐ฏ Top-K Results]
end
subgraph "Intelligent Reranking"
F --> F1[๐ ์ปจํ
์คํธ ๋ถ์]
F1 --> F2[๐ฏ ๊ฐ์ธํ ์ ์]
F2 --> F3[๐ ์ต์ ์์]
end
style C fill:#e1f5fe
style D fill:#f3e5f5
style F fill:#fff3e0
๊นํํ | ๋ฐ์ ๋ฏธ | ์์ฃผ์ | ์ ์น๋จ | ์ด์๋ฏผ | ์งํ์ |
@taehyun32 | @Yumi-Park996 | @Juyoung8563 | @usn757 | @23MinL | @s0ooo0k |
ํ๋ก์ ํธ์ ๋ํ ์ง๋ฌธ์ด๋ ์ ์์ด ์๋ค๋ฉด Issues๋ฅผ ํตํด ์์ ๋กญ๊ฒ ์๊ฒฌ์ ๋จ๊ฒจ์ฃผ์ธ์!