Skip to content

GigaMak2/auction

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

646 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

auction

์—ญ๊ฒฝ๋งค ์„œ๋น„์Šค์˜ ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. ๊ฒฝ๋งคยท์ž…์ฐฐยท๋ฆฌ๋ทฐ ๋“ฑ ํ•ต์‹ฌ ๋„๋ฉ”์ธ CRUD์™€ ํ•จ๊ป˜ AI ์ƒ๋‹ด ์ฑ—๋ด‡, ์œ ์ €๊ฐ„ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.


์ฒ˜๋ฆฌ ํ๋ฆ„

๊ฒฝ๋งค ์ƒํƒœ ์ž๋™ํ™”

EventBridge Scheduler
        โ”‚  (๊ฒฝ๋งค ์‹œ์ž‘/์ข…๋ฃŒ 5๋ถ„ ์ „ ํŠธ๋ฆฌ๊ฑฐ)
        โ–ผ
   auction-lambda
        โ”‚  RDS ์ƒํƒœ ๋ณ€๊ฒฝ + Redis Pub/Sub ๋ฐœํ–‰
        โ–ผ
  Redis auction-events
        โ”‚
        โ–ผ
auction (๋ฉ”์ธ ์„œ๋ฒ„) โ”€โ”€ Elasticsearch ๋„ํ๋จผํŠธ ๋™๊ธฐํ™”
                   โ””โ”€โ”€ pgvector ์ž„๋ฒ ๋”ฉ ๋™๊ธฐํ™” (๋‚™์ฐฐ ์‹œ)

AI ์ƒ๋‹ด ์ฑ—๋ด‡

ํด๋ผ์ด์–ธํŠธ
    โ”‚  POST /api/chat/rooms/{roomId}/messages
    โ–ผ
AiController (SSE text/event-stream)
    โ”‚
    โ–ผ
AiService โ”€โ”€ Redis ์ปจํ…์ŠคํŠธ ์บ์‹œ ์กฐํšŒ (์ตœ๊ทผ N๊ฐœ ๋ฉ”์‹œ์ง€)
    โ”‚
    โ–ผ
ChatClient (DeepSeek V3)
    โ”‚  Tool Calling ํŒ๋‹จ
    โ”œโ”€โ”€ AuctionTools (PostgreSQL ์กฐํšŒ)
    โ””โ”€โ”€ RAG (pgvector ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰)
    โ”‚
    โ–ผ
SSE ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ: TOKEN โ†’ DONE (์ฒซ ๋ฉ”์‹œ์ง€ ์‹œ TOPIC ํฌํ•จ)

๋„๋ฉ”์ธ ์ƒํƒœ ํ๋ฆ„

READY โ”€โ”€โ–บ ACTIVE โ”€โ”€โ–บ DONE   (๋‚™์ฐฐ)
  โ”‚              โ””โ”€โ”€โ–บ NO_BID (์œ ์ฐฐ)
  โ””โ”€โ”€โ–บ CANCELLED (READY ์ƒํƒœ + ์‹œ์ž‘ 10๋ถ„ ์ „๊นŒ์ง€)

์ฃผ์š” ๊ธฐ๋Šฅ

1. ๊ฒฝ๋งค (Auction)

  • EventBridge Scheduler๋กœ ์‹œ์ž‘/์ข…๋ฃŒ ์Šค์ผ€์ค„ ์ž๋™ ๋“ฑ๋ก
  • Elasticsearch + PostgreSQL ์ด์ค‘ ๊ฒ€์ƒ‰ (Nori ํ•œ๊ตญ์–ด ํ˜•ํƒœ์†Œ ๋ถ„์„), ES ์žฅ์•  ์‹œ PostgreSQL fallback
  • max_price API ์‘๋‹ต ๋…ธ์ถœ ๊ธˆ์ง€ (ํŒ๋งค์ž์—๊ฒŒ ์ตœ๋Œ€ ํฌ๋ง๊ฐ€ ์ˆจ๊น€)

2. ์ž…์ฐฐ (Bid)

  • Redisson ๋ถ„์‚ฐ๋ฝ์œผ๋กœ ๋™์‹œ ์ž…์ฐฐ ๊ฒฝํ•ฉ ๋ฐฉ์ง€ (์ˆœ์ฐจ ์ฒ˜๋ฆฌ)
  • ํ˜„์žฌ ์ตœ์ €๊ฐ€๋ณด๋‹ค ๋‚ฎ์€ ๊ฐ€๊ฒฉ๋งŒ ๋“ฑ๋ก ๊ฐ€๋Šฅ, max_price ์ดˆ๊ณผ ๋ถˆ๊ฐ€
  • ๊ฒฝ๋งค ์ƒํƒœ enum ์™ธ์— ์ข…๋ฃŒ ์‹œ๊ฐ๊ณผ ํ˜„์žฌ ์‹œ๊ฐ ๋น„๊ต๋กœ ์ด์ค‘ ๊ฒ€์ฆ

3. AI ์ƒ๋‹ด ์ฑ—๋ด‡

SSE ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์‘๋‹ต์„ ์ˆ˜์‹ ํ•˜๋ฉฐ, Tool Calling๊ณผ RAG๋ฅผ ํ†ตํ•ด DB์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๋‹ค.

Tool ์—ญํ•  ๋ฐฉ์‹
getBidsByAuctionId ๊ฒฝ๋งค ์ž…์ฐฐ ํ˜„ํ™ฉ ยท ์ตœ์ €๊ฐ€ ยท ๊ฒฝ์Ÿ ๋ถ„์„ PostgreSQL
getRecentAuctionResults ์ƒํ’ˆ ์‹œ์„ธ ยท ๋‚™์ฐฐ ์ด๋ ฅ ์กฐํšŒ PostgreSQL
getSellerStats ํŒ๋งค์ž ์ข…ํ•ฉ ์‹ ๋ขฐ๋„ (๋‚™์ฐฐ ํšŸ์ˆ˜, ํ‰๊ท  ํ‰์ ) PostgreSQL
getSellerReviewInsights ํŒ๋งค์ž ํ›„๊ธฐ ํ‚ค์›Œ๋“œ ๋ถ„์„ RAG (pgvector)
getMyAuctions ๋‚ด๊ฐ€ ๋“ฑ๋กํ•œ ๊ฒฝ๋งค ํ˜„ํ™ฉ ยท ํ˜„์žฌ ์ตœ์ €๊ฐ€ PostgreSQL
getMyBids ๋‚ด๊ฐ€ ์ž…์ฐฐํ•œ ๊ฒฝ๋งค ํ˜„ํ™ฉ ยท 1์œ„ ์—ฌ๋ถ€ PostgreSQL
getAuctionStatsByCategory ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋‚™์ฐฐ ํ†ต๊ณ„ ยท ์‹œ์„ธ ๋ถ„์„ PostgreSQL
searchAuctionDescriptions ๋‚™์ฐฐ ๊ฒฝ๋งค ์ƒํ’ˆ ์„ค๋ช… ์˜๋ฏธ ๊ฒ€์ƒ‰ RAG (pgvector)

RAG ๊ตฌํ˜„ ํฌ์ธํŠธ

  • ํ›„๊ธฐ RAG: HyDE(๊ฐ€์ƒ ๋ฌธ์„œ ์ƒ์„ฑ) + Contextual Retrieval + ๊ฐ์„ฑ ๋ฐฉํ–ฅ score ํ•„ํ„ฐ
  • ๊ฒฝ๋งค ์„ค๋ช… RAG: Lambda Pub/Sub ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋‚™์ฐฐ ์‹œ ์ž๋™ ์ž„๋ฒ ๋”ฉ ์ €์žฅ

4. ์œ ์ €๊ฐ„ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…

  • ๋‚™์ฐฐ ํ›„ ๊ตฌ๋งค์ž-ํŒ๋งค์ž 1:1 ์ฑ„ํŒ…๋ฐฉ ์ž๋™ ์ƒ์„ฑ (Redis Pub/Sub ์ด๋ฒคํŠธ ์ˆ˜์‹ )
  • WebSocket + STOMP + SockJS, Redis Pub/Sub ๋ธŒ๋กœ์ปค๋กœ ๋‹ค์ค‘ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค ๊ฐ„ ๋ฉ”์‹œ์ง€ ๊ณต์œ 

5. ๋ฆฌ๋ทฐ (Review)

  • ๋‚™์ฐฐ ๊ฒฝ๋งค ๋‹น์‚ฌ์ž(๊ตฌ๋งค์ž/ํŒ๋งค์ž)๋งŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ, ๋ณตํ•ฉ ์œ ๋‹ˆํฌ ์ œ์•ฝ (reviewer_id, reviewee_id, auction_id)
  • S3 Presigned PUT URL ๋ฐœ๊ธ‰ (10๋ถ„ TTL) โ†’ CloudFront URL๋กœ ๋ฐ˜ํ™˜
  • ๋ฆฌ๋ทฐ ์ €์žฅ ์‹œ pgvector ์ž„๋ฒ ๋”ฉ ์ž๋™ ์—ฐ๋™

6. ๋ชจ๋‹ˆํ„ฐ๋ง

  • Spring Actuator๋กœ JVM ๋ฉ”ํŠธ๋ฆญ ๋…ธ์ถœ (ํฌํŠธ 9001, ์•ฑ ํฌํŠธ 8080๊ณผ ๋ถ„๋ฆฌ)
  • Grafana Alloy ์‚ฌ์ด๋“œ์นด๊ฐ€ scrape โ†’ Amazon Managed Prometheus(AMP) remote_write
  • AWS IAM ์—ญํ•  ๊ธฐ๋ฐ˜ SigV4 ์ธ์ฆ (Access Key ์—†์Œ)
  • Amazon Managed Grafana(AMG)์—์„œ JVM, HTTP ์š”์ฒญ ํ˜„ํ™ฉ ์‹ค์‹œ๊ฐ„ ์‹œ๊ฐํ™”

ํŒจํ‚ค์ง€ ๊ตฌ์กฐ

com.example.auction/
โ”œโ”€โ”€ common/
โ”‚   โ”œโ”€โ”€ config/       # Security, Redis, QueryDSL, WebSocket, Spring AI, pgvector
โ”‚   โ”œโ”€โ”€ dto/          # BaseResponse, PageResponse
โ”‚   โ”œโ”€โ”€ entity/       # BaseEntity (์ƒ์„ฑ์ผ, ์ˆ˜์ •์ผ, ์‚ญ์ œ์ผ)
โ”‚   โ””โ”€โ”€ exception/    # GlobalExceptionHandler, ServiceErrorException
โ”‚
โ””โ”€โ”€ domain/
    โ”œโ”€โ”€ auth/         # ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ํ† ํฐ ๊ฐฑ์‹ , ์†Œ์…œ ๋กœ๊ทธ์ธ
    โ”œโ”€โ”€ user/         # ๋งˆ์ดํŽ˜์ด์ง€, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ํšŒ์› ํƒˆํ‡ด
    โ”œโ”€โ”€ auction/      # ๊ฒฝ๋งค CRUD, ๊ฒ€์ƒ‰ (ES + PostgreSQL), EventBridge ์—ฐ๋™
    โ”‚   โ”œโ”€โ”€ result/   # ๋‚™์ฐฐ ๊ฒฐ๊ณผ ์กฐํšŒ
    โ”‚   โ””โ”€โ”€ search/   # Elasticsearch ๋„ํ๋จผํŠธ, ๊ฒ€์ƒ‰ ์„œ๋น„์Šค
    โ”œโ”€โ”€ bid/          # ์ž…์ฐฐ ์ƒ์„ฑ (๋ถ„์‚ฐ๋ฝ), ์ž…์ฐฐ ์กฐํšŒ
    โ”œโ”€โ”€ category/     # ์นดํ…Œ๊ณ ๋ฆฌ ํŠธ๋ฆฌ ์กฐํšŒ, ๊ด€๋ฆฌ์ž CRUD
    โ”œโ”€โ”€ review/       # ๋ฆฌ๋ทฐ CRUD, S3 Presigned URL, RAG ์ž„๋ฒ ๋”ฉ ์—ฐ๋™
    โ”œโ”€โ”€ chat/         # AI ์ฑ„ํŒ…๋ฐฉ CRUD, ๋ฉ”์‹œ์ง€ ๋ชฉ๋ก (์ปค์„œ ํŽ˜์ด์ง•), Redis ์ปจํ…์ŠคํŠธ
    โ”œโ”€โ”€ ai/           # SSE ์ŠคํŠธ๋ฆฌ๋ฐ, Tool Calling 8์ข…, RAG 2์ข…, ์ž„๋ฒ ๋”ฉ ์„œ๋น„์Šค
    โ”œโ”€โ”€ userchat/     # ์œ ์ €๊ฐ„ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… (WebSocket + Redis Pub/Sub)
    โ””โ”€โ”€ notification/ # Redis Pub/Sub ์•Œ๋ฆผ ๋ฐœํ–‰

ํ™˜๊ฒฝ๋ณ€์ˆ˜

๋ณ€์ˆ˜๋ช… ์„ค๋ช… ํ•„์ˆ˜
POSTGRES_URL PostgreSQL JDBC URL โœ…
POSTGRES_USERNAME DB ์‚ฌ์šฉ์ž๋ช… โœ…
POSTGRES_PASSWORD DB ๋น„๋ฐ€๋ฒˆํ˜ธ โœ…
REDIS_HOST Redis ํ˜ธ์ŠคํŠธ โœ…
ELASTICSEARCH_URIS Elasticsearch URI โœ…
ELASTICSEARCH_PASSWORD Elasticsearch ๋น„๋ฐ€๋ฒˆํ˜ธ โœ…
JWT_SECRET JWT ์„œ๋ช… ํ‚ค (32์ž ์ด์ƒ) โœ…
ADMIN_SECRET_KEY ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ ํ‚ค โœ…
DEEPSEEK_API_KEY DeepSeek V3 ์ฑ„ํŒ… API ํ‚ค โœ…
OPENAI_API_KEY OpenAI ์ž„๋ฒ ๋”ฉ API ํ‚ค โœ…
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET Google OAuth2 โœ…
KAKAO_CLIENT_ID / KAKAO_CLIENT_SECRET Kakao OAuth2 โœ…
NAVER_CLIENT_ID / NAVER_CLIENT_SECRET Naver OAuth2 โœ…
LAMBDA_ARN ๊ฒฝ๋งค ์ƒํƒœ ์ž๋™ํ™” Lambda ARN โŒ
ROLE_ARN EventBridge ์‹คํ–‰ ์—ญํ•  ARN โŒ
S3_BUCKET_NAME ๋ฆฌ๋ทฐ ์ด๋ฏธ์ง€ S3 ๋ฒ„ํ‚ท๋ช… โŒ
CLOUDFRONT_DOMAIN ๋ฆฌ๋ทฐ ์ด๋ฏธ์ง€ CDN ๋„๋ฉ”์ธ โŒ

AWS ๊ด€๋ จ ๋ณ€์ˆ˜(LAMBDA_ARN, S3_BUCKET_NAME ๋“ฑ)๋Š” ๋กœ์ปฌ ์‹คํ–‰ ์‹œ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.


๋กœ์ปฌ ์‹คํ–‰ ๋ฐฉ๋ฒ•

์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

  • Java 21
  • Docker / Docker Compose

1๋‹จ๊ณ„ โ€” ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํŒŒ์ผ ์ƒ์„ฑ

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .env ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

POSTGRES_DATABASE=auction
POSTGRES_USERNAME=postgres
POSTGRES_PASSWORD=your_password
POSTGRES_URL=jdbc:postgresql://localhost:5432/auction

REDIS_HOST=localhost

ELASTICSEARCH_PASSWORD=your_es_password
ELASTICSEARCH_URIS=http://localhost:9200

JWT_SECRET=your_jwt_secret_key_min_32_chars
ADMIN_SECRET_KEY=your_admin_secret_key

GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
KAKAO_CLIENT_ID=your_kakao_client_id
KAKAO_CLIENT_SECRET=your_kakao_client_secret
NAVER_CLIENT_ID=your_naver_client_id
NAVER_CLIENT_SECRET=your_naver_client_secret

DEEPSEEK_API_KEY=your_deepseek_api_key
OPENAI_API_KEY=your_openai_api_key

2๋‹จ๊ณ„ โ€” ์ธํ”„๋ผ ์‹คํ–‰

docker compose up -d postgres redis elasticsearch

Elasticsearch ๊ธฐ๋™์— ์•ฝ 30์ดˆ~1๋ถ„ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. docker compose ps๋กœ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

3๋‹จ๊ณ„ โ€” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰

./gradlew bootRun --args='--spring.profiles.active=dev'

์„œ๋ฒ„๊ฐ€ ๋œจ๋ฉด http://localhost:8080 ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๊ธฐ์ˆ  ์Šคํƒ

About

Real-time reverse auction system. Features automated auction lifecycle management, real-time bid validation, Korean full-text search, an AI bidding assistant with RAG, real-time chat and notifications, admin API, and a monitoring panel.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages