Skip to content
@PETTY-HUB

PETTY

๐Ÿถ PETTY | ๋ฐ˜๋ ค๋™๋ฌผ์„ ์œ„ํ•œ ๊ฐ€์žฅ ์™„๋ฒฝํ•œ ์—ฌํ–‰

๐Ÿพ PETTY - ๋ฐ˜๋ ค๋™๋ฌผ๊ณผ ๋– ๋‚˜๋Š” ์™„๋ฒฝํ•œ ์—ฌํ–‰

MAIN-001

PETTY Logo

Spring Boot Java PostgreSQL MySQL Qdrant Oracle Cloud AWS Supabase

๐ŸŽฏ ์„œ๋น„์Šค ์†Œ๊ฐœ

๐Ÿ˜ฝ PETTY๋Š” ๋ฐ˜๋ ค๋™๋ฌผ๊ณผ ํ•จ๊ป˜ํ•˜๋Š” ์—ฌํ–‰์„ ์œ„ํ•œ AI ๊ธฐ๋ฐ˜ ์ถ”์ฒœ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค
๐Ÿถ ์‚ฌ์šฉ์ž์˜ ๋ฐ˜๋ ค๋™๋ฌผ ์‚ฌ์ง„์„ ๋ถ„์„ํ•˜์—ฌ ๋งž์ถคํ˜• ์—ฌํ–‰์ง€๋ฅผ ์ถ”์ฒœ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”!
๐Ÿ—บ๏ธ ํ˜„์žฌ ์œ„์น˜ ๊ธฐ๋ฐ˜ ์ฃผ๋ณ€์— ์žˆ๋Š” ๋ฐ˜๋ ค๋™๋ฌผ ์—ฌํ–‰์ง€ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”!
๐Ÿ–Š๏ธ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ฐ˜๋ ค๋™๋ฌผ ์—ฌํ–‰ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์–ด์š”!


โœจ ์ฃผ์š” ๊ธฐ๋Šฅ

๐ŸŽฏ JWT ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ

์ด๋ฉ”์ผ ์ธ์ฆ๊ณผ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ํ†ตํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์‹œ์Šคํ…œ

  • ๋กœ์ปฌ ๋กœ๊ทธ์ธ: ์ด๋ฉ”์ผ ์ธ์ฆ ๊ธฐ๋ฐ˜ SMTP ํšŒ์›๊ฐ€์ž…
  • ์†Œ์…œ ๋กœ๊ทธ์ธ: GitHub, Kakao OAuth2 ์—ฐ๋™
  • JWT: Access Token (1์‹œ๊ฐ„) + Refresh Token (7์ผ)
  • Cookie ๋ณด์•ˆ: HttpOnly, Secure ์„ค์ •
  • ํ† ํฐ ์ˆœํ™˜: ์‚ฌ์šฉ์ž๋ณ„ ์ตœ๋Œ€ 3๊ฐœ Refresh Token ๊ด€๋ฆฌ

๐Ÿค– AI ๋ฐ˜๋ ค๋™๋ฌผ ๋ถ„์„

๋ฐ˜๋ ค๋™๋ฌผ ์‚ฌ์ง„์„ ์ž…๋ ฅํ•˜๋ฉด, ์„ฑ๊ฒฉ, ์™ธ๋ชจ, ํŠน์„ฑ์— ๋Œ€ํ•œ ์ •๋ณด ๋ถ„์„

  • ๋‹ค์ค‘ 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 ์—ฐ๋™
  • ์†Œ์…œ ๊ธฐ๋Šฅ: ์ข‹์•„์š”, ๋Œ“๊ธ€, ์•Œ๋ฆผ ์‹œ์Šคํ…œ

๐Ÿ“’ ERD ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ

๐Ÿ›  ERD

Image 1

Image 2

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ

diagram

Backend

Spring Boot
โ”œโ”€โ”€ Spring Security (JWT + OAuth2)
โ”œโ”€โ”€ Spring Data JPA (๋ฉ€ํ‹ฐ ๋ฐ์ดํ„ฐ์†Œ์Šค)
โ”œโ”€โ”€ Spring AI
โ””โ”€โ”€ Validation

Database & Storage

๋ฉ€ํ‹ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•„ํ‚คํ…์ฒ˜
โ”œโ”€โ”€ PostgreSQL (์‚ฌ์šฉ์ž/์ปค๋ฎค๋‹ˆํ‹ฐ) - Supabase
โ”œโ”€โ”€ MySQL (์—ฌํ–‰์ง€ ์ •๋ณด) - Aiven
โ”œโ”€โ”€ Vector Database - Qdrant
โ””โ”€โ”€ File Storage - Supabase Storage

AI & External APIs

AI ํŒŒ์ดํ”„๋ผ์ธ
โ”œโ”€โ”€ AWS Rekognition (์ด๋ฏธ์ง€ ๋ผ๋ฒจ๋ง)
โ”œโ”€โ”€ Google Gemini 2.0 Flash (ํ…์ŠคํŠธ ์ƒ์„ฑ)
โ”œโ”€โ”€ Meta Llama 3.2 Vision (์ด๋ฏธ์ง€ ๋ถ„์„)
โ”œโ”€โ”€ OpenAI Embeddings (๋ฒกํ„ฐ ์ƒ์„ฑ)
โ””โ”€โ”€ ํ•œ๊ตญ๊ด€๊ด‘๊ณต์‚ฌ API (๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”)

Infrastructure

ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ
โ”œโ”€โ”€ 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
Loading

๐Ÿ—ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„

๋ฉ€ํ‹ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „๋žต

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
    }
Loading

๐Ÿง  AI ํŒŒ์ดํ”„๋ผ์ธ

Vision Analysis Flow

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
Loading

Recommendation Pipeline

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
Loading

๐Ÿ“Œ ํŒ€์› ์†Œ๊ฐœ

๊น€ํƒœํ˜„ ๋ฐ•์œ ๋ฏธ ์†์ฃผ์˜ ์œ ์Šน๋‚จ ์ด์ƒ๋ฏผ ์ง€ํ˜„์ˆ™
@taehyun32 @Yumi-Park996 @Juyoung8563 @usn757 @23MinL @s0ooo0k

๐Ÿ“ฌ ์—ฐ๋ฝํ•˜๊ธฐ

ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด๋‚˜ ์ œ์•ˆ์ด ์žˆ๋‹ค๋ฉด Issues๋ฅผ ํ†ตํ•ด ์ž์œ ๋กญ๊ฒŒ ์˜๊ฒฌ์„ ๋‚จ๊ฒจ์ฃผ์„ธ์š”!

Popular repositories Loading

  1. PETTY-BACK PETTY-BACK Public

    ๐Ÿถ PETTY | ๋ฐ˜๋ ค๋™๋ฌผ ๋งž์ถค ์—ฌํ–‰ ์ถ”์ฒœ ์„œ๋น„์Šค

    HTML 6

  2. .github .github Public

    ๐Ÿถ TEAM PETTY | ๋ฐ˜๋ ค๋™๋ฌผ์„ ์œ„ํ•œ ๊ฐ€์žฅ ์™„๋ฒฝํ•œ ์—ฌํ–‰

Repositories

Showing 2 of 2 repositories

Top languages

Loadingโ€ฆ

Most used topics

Loadingโ€ฆ