Skip to content

Imadeveloperrr/shopingmall

Repository files navigation

Image Image

πŸ›οΈ AI μ‡Όν•‘λͺ° - λŒ€ν™”ν˜• μƒν’ˆ μΆ”μ²œ μ‹œμŠ€ν…œ

OpenAI GPT와 pgvectorλ₯Ό ν™œμš©ν•œ μ§€λŠ₯ν˜• μ‡Όν•‘λͺ° ν”Œλž«νΌ μžμ—°μ–΄ λŒ€ν™”λ₯Ό ν†΅ν•œ κ°œμΈν™”λœ μƒν’ˆ μΆ”μ²œ 제곡

Spring Boot Java PostgreSQL OpenAI

πŸš€ μ£Όμš” νŠΉμ§•

  • πŸ€– AI λŒ€ν™”ν˜• μΆ”μ²œ: OpenAI GPT-4 + text-embedding-3-small을 ν™œμš©ν•œ μžμ—°μ–΄ μƒν’ˆ μΆ”μ²œ
  • πŸ” 벑터 μœ μ‚¬λ„ 검색: PostgreSQL pgvector + HNSW 인덱슀둜 고속 검색 (10-50ms)
  • ⚑ μ„±λŠ₯ μ΅œμ ν™”: 비동기 처리 + Redis μΊμ‹±μœΌλ‘œ λΉ λ₯Έ 응닡
  • πŸ” λ³΄μ•ˆ: JWT 인증 + Spring Security 기반 κΆŒν•œ 관리

πŸ› οΈ 기술 μŠ€νƒ

Core

  • Backend: Spring Boot 3.1.4 (Java 17)
  • Database: PostgreSQL 16 + pgvector
  • Cache: Redis 7
  • AI: OpenAI GPT-4, text-embedding-3-small (1536차원)
  • Security: Spring Security + JWT

Support

  • Spring Data JPA, MyBatis, QueryDSL 5.0
  • MapStruct, Lombok, Firebase
  • Docker & Docker Compose

πŸ—οΈ μ•„ν‚€ν…μ²˜

μ‚¬μš©μž 쿼리 β†’ OpenAI Embedding (1536차원 벑터)
    ↓
PostgreSQL pgvector 코사인 μœ μ‚¬λ„ 검색
    ↓
μΆ”μ²œ μƒν’ˆ λ°˜ν™˜ + λŒ€ν™” 이λ ₯ μ €μž₯

핡심 μ»΄ν¬λ„ŒνŠΈ

μ»΄ν¬λ„ŒνŠΈ μ—­ν•  μœ„μΉ˜
ConversationalRecommendationService λŒ€ν™”ν˜• μΆ”μ²œ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄ν„° ai/recommendation/application/
ProductVectorService pgvector 검색 μ—”μ§„ ai/recommendation/infrastructure/
EmbeddingApiClient OpenAI API ν΄λΌμ΄μ–ΈνŠΈ ai/embedding/
RecommendationEngine μΆ”μ²œ 둜직 ai/recommendation/application/

🚦 λΉ λ₯Έ μ‹œμž‘

1. 사전 μš”κ΅¬μ‚¬ν•­

  • Java 17+
  • Docker & Docker Compose
  • OpenAI API Key

2. ν™˜κ²½ μ„€μ •

# OpenAI API ν‚€ μ„€μ •
echo "openai.api.key=sk-proj-your-key" > src/main/resources/application-secrets.properties

3. μ‹€ν–‰

# 인프라 μ‹œμž‘ (PostgreSQL + Redis)
docker-compose up -d

# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹œμž‘
./gradlew bootRun

4. 접속

πŸ“Š ν”„λ‘œμ νŠΈ ꡬ쑰

src/main/java/com/example/crud/
β”œβ”€β”€ ai/                          # AI κΈ°λŠ₯ λͺ¨λ“ˆ
β”‚   β”œβ”€β”€ conversation/           # λŒ€ν™” μ‹œμŠ€ν…œ
β”‚   β”œβ”€β”€ embedding/              # OpenAI μž„λ² λ”©
β”‚   └── recommendation/         # μΆ”μ²œ μ—”μ§„
β”œβ”€β”€ common/                      # 곡톡 μ»΄ν¬λ„ŒνŠΈ (λ³΄μ•ˆ, μ„€μ •)
β”œβ”€β”€ controller/                  # REST 컨트둀러
β”œβ”€β”€ data/                        # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 (μƒν’ˆ, μ£Όλ¬Έ, 결제)
β”œβ”€β”€ entity/                      # JPA μ—”ν‹°ν‹°
└── repository/                  # 데이터 μ ‘κ·Ό 계측

πŸ” 핡심 κΈ°λŠ₯

벑터 검색 쿼리

SELECT p.number, p.name,
       (1 - (p.description_vector <=> CAST(? AS vector))) as similarity
FROM product p
WHERE (1 - (p.description_vector <=> CAST(? AS vector))) > 0.3
ORDER BY p.description_vector <=> CAST(? AS vector)
LIMIT ?;

μ„±λŠ₯ μ§€ν‘œ

ν•­λͺ© μ†Œμš” μ‹œκ°„ λΉ„κ³ 
μž„λ² λ”© 생성 300-500ms OpenAI API
Redis μΊμ‹œ 5-10ms μΊμ‹œ 히트 μ‹œ
벑터 검색 10-50ms HNSW 인덱슀
전체 응닡 50-400ms μΊμ‹œ 여뢀에 따라

Java 반볡문 vs pgvector: 200-600λ°° μ„±λŠ₯ ν–₯상 ⚑

πŸ§ͺ API ν…ŒμŠ€νŠΈ

# ν—¬μŠ€μ²΄ν¬
curl http://localhost:8080/actuator/health

# μž„λ² λ”© 생성
curl -X POST http://localhost:8080/api/test/recommendation/embedding \
  -H "Content-Type: application/json" \
  -d '{"text": "warm winter sweater"}'

# μƒν’ˆ μΆ”μ²œ
curl -X POST http://localhost:8080/api/test/recommendation/text \
  -H "Content-Type: application/json" \
  -d '{"query": "comfortable knit clothing", "limit": 5}'

πŸ”§ μ£Όμš” μ„€μ •

μŠ€λ ˆλ“œ ν’€

# OpenAI API μ „μš©
embeddingTaskExecutor: μ½”μ–΄ 4, μ΅œλŒ€ 8, 큐 100

# DB 벑터 검색 μ „μš©
dbTaskExecutor: μ½”μ–΄ 4, μ΅œλŒ€ 8, 큐 50

Redis 캐싱

String cacheKey = text.trim().toLowerCase().hashCode();
  • μž„λ² λ”© κ²°κ³Ό μΊμ‹±μœΌλ‘œ API 호좜 μ΅œμ†Œν™”

πŸ—ƒοΈ λ°μ΄ν„°λ² μ΄μŠ€

μ£Όμš” ν…Œμ΄λΈ”

  • product: μƒν’ˆ 정보 + description_vector (1536차원)
  • conversation: λŒ€ν™” 이λ ₯
  • conversation_message: USER/ASSISTANT λ©”μ‹œμ§€
  • member: νšŒμ› 정보 + JWT 인증

pgvector 인덱슀

CREATE INDEX idx_product_vector ON product
USING hnsw (description_vector vector_cosine_ops)
WITH (m = 16, ef_construction = 64);

πŸ” νŠΈλŸ¬λΈ”μŠˆνŒ…

OpenAI API μ‹€νŒ¨

cat src/main/resources/application-secrets.properties

pgvector 였λ₯˜

docker-compose exec db psql -U sungho -d app \
  -c "CREATE EXTENSION IF NOT EXISTS vector;"

Redis μ—°κ²° μ‹€νŒ¨

docker-compose exec redis redis-cli ping

πŸ“ μ°Έκ³  λ¬Έμ„œ


🎯 핡심: AI κΈ°μˆ μ„ ν™œμš©ν•œ κ°œμΈν™”λœ μ‡Όν•‘ κ²½ν—˜ 제곡

About

Spring Security + Jwt + SSR Practice Projct

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published