Skip to content

PlayProbie/server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

108 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŽฎ PlayProbie Server

AI ๊ธฐ๋ฐ˜ ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ดํ…Œ์ŠคํŠธ ํ”Œ๋žซํผ์˜ Backend API Server

Java Spring Boot Spring Security AWS SDK


๐Ÿ“– ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

PlayProbie๋Š” ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์‚ฌ๊ฐ€ ํ”Œ๋ ˆ์ดํ…Œ์ŠคํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ , ํ…Œ์Šคํ„ฐ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฒŒ์ž„์„ ํ”Œ๋ ˆ์ดํ•œ ๋’ค AI ์ธํ„ฐ๋ทฐ๋ฅผ ํ†ตํ•ด ์‹ฌ์ธต ํ”ผ๋“œ๋ฐฑ์„ ์ˆ˜์ง‘ํ•˜๋Š” ์˜ฌ์ธ์› ํ”Œ๋ ˆ์ดํ…Œ์ŠคํŠธ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

์ด ์„œ๋ฒ„๋Š” React ํด๋ผ์ด์–ธํŠธ์™€ FastAPI AI ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋ฉฐ, ๋‹ค์Œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

์—ญํ•  ์„ค๋ช…
๐Ÿ” ์ธ์ฆ/์ธ๊ฐ€ JWT ๊ธฐ๋ฐ˜ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ถŒํ•œ ๊ด€๋ฆฌ
๐Ÿ“‹ ์„ค๋ฌธ ๊ด€๋ฆฌ ํ…Œ๋งˆ ๊ธฐ๋ฐ˜ ์„ค๋ฌธ ์„ค๊ณ„, ์ƒํƒœ ์ „์ด(DRAFTโ†’ACTIVEโ†’CLOSED)
๐ŸŽฎ ์ŠคํŠธ๋ฆฌ๋ฐ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ AWS GameLift Streams ๋ฆฌ์†Œ์Šค ํ”„๋กœ๋น„์ €๋‹ ๋ฐ JIT ํ• ๋‹น
๐Ÿค– AI ์„œ๋ฒ„ ํ†ตํ•ฉ FastAPI AI ์„œ๋ฒ„์™€์˜ ๋น„๋™๊ธฐ ํ†ต์‹  (์งˆ๋ฌธ ์ƒ์„ฑ, ๋ถ„์„)
๐Ÿ“ก ์‹ค์‹œ๊ฐ„ ํ†ต์‹  SSE ๊ธฐ๋ฐ˜ AI ์ธํ„ฐ๋ทฐ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ ๋ถ„์„ ๊ฒฐ๊ณผ ์•Œ๋ฆผ
๐Ÿ“Š ๋ฐ์ดํ„ฐ ๋ถ„์„ ํด๋Ÿฌ์Šคํ„ฐ๋ง, ๊ฐ์ • ๋ถ„์„ ๊ฒฐ๊ณผ ์ง‘๊ณ„ ๋ฐ ๋Œ€์‹œ๋ณด๋“œ ๋ฐ์ดํ„ฐ ์ œ๊ณต

๐Ÿ—๏ธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

flowchart TB
    subgraph CLIENT["๐Ÿ–ฅ๏ธ React Client"]
        WEB[Web Browser]
    end

    subgraph MAIN_SERVER["โ˜• Spring Boot Server"]
        AUTH[Auth API]
        SURVEY[Survey API]
        INTERVIEW[Interview API]
        STREAMING[Streaming API]
        ANALYTICS[Analytics API]
        SSE_EMITTER[SSE Emitter]
    end

    subgraph AI_SERVER["๐Ÿค– FastAPI AI Server"]
        RAG[RAG ์งˆ๋ฌธ ์ƒ์„ฑ]
        EMBEDDING[์ž„๋ฒ ๋”ฉ ๋ถ„์„]
        CLUSTERING[HDBSCAN ํด๋Ÿฌ์Šคํ„ฐ๋ง]
    end

    subgraph AWS["โ˜๏ธ AWS Cloud"]
        GAMELIFT[GameLift Streams]
        S3[S3 Storage]
        RDS[(MariaDB)]
    end

    WEB <-->|REST API| AUTH
    WEB <-->|REST API| SURVEY
    WEB <-->|REST API| ANALYTICS
    WEB <-.->|SSE Stream| SSE_EMITTER
    
    INTERVIEW -->|HTTP| RAG
    INTERVIEW -->|HTTP| EMBEDDING
    ANALYTICS -->|HTTP| CLUSTERING
    
    STREAMING -->|AWS SDK v2| GAMELIFT
    SURVEY -->|Presigned URL| S3
    
    MAIN_SERVER --> RDS
Loading

๋ฐ์ดํ„ฐ ํ๋ฆ„

sequenceDiagram
    participant C as Client
    participant S as Spring Boot
    participant AI as FastAPI
    participant GL as GameLift

    Note over C,GL: 1๏ธโƒฃ ์„ค๋ฌธ ์ƒ์„ฑ & ์ŠคํŠธ๋ฆฌ๋ฐ ํ”„๋กœ๋น„์ €๋‹
    C->>S: POST /surveys (์„ค๋ฌธ ์ƒ์„ฑ)
    S->>AI: POST /questions/generate (RAG ์งˆ๋ฌธ ์ƒ์„ฑ)
    AI-->>S: ์ƒ์„ฑ๋œ ์งˆ๋ฌธ ๋ชฉ๋ก
    C->>S: POST /streaming-resources (GameLift ํ”„๋กœ๋น„์ €๋‹)
    S->>GL: CreateApplication + CreateStreamGroup
    GL-->>S: Resource ARN

    Note over C,GL: 2๏ธโƒฃ ํ…Œ์Šคํ„ฐ ํ”Œ๋ ˆ์ด & AI ์ธํ„ฐ๋ทฐ
    C->>S: GET /interview/stream (SSE ์—ฐ๊ฒฐ)
    S-->>C: SSE: greeting
    loop ๊ฐ ์งˆ๋ฌธ๋งˆ๋‹ค
        S->>AI: POST /interview/probing (๋‹ต๋ณ€ ๋ถ„์„)
        AI-->>S: ๊ผฌ๋ฆฌ์งˆ๋ฌธ or ๋‹ค์Œ์งˆ๋ฌธ
        S-->>C: SSE: question
    end
    S-->>C: SSE: complete

    Note over C,GL: 3๏ธโƒฃ ๋ถ„์„ ๊ฒฐ๊ณผ ์ˆ˜์ง‘
    S->>AI: POST /analytics/cluster (ํด๋Ÿฌ์Šคํ„ฐ๋ง)
    AI-->>S: ํด๋Ÿฌ์Šคํ„ฐ + ๊ฐ์ •๋ถ„์„ ๊ฒฐ๊ณผ
    S-->>C: SSE: analytics_refresh
Loading

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

Core Framework

๊ธฐ์ˆ  ๋ฒ„์ „ ์„ ํƒ ์ด์œ 
Java 21 LTS Virtual Threads ์ง€์›, ์ตœ์‹  LTS
Spring Boot 3.5.9 ์•ˆ์ •์ ์ธ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ”„๋ ˆ์ž„์›Œํฌ
Gradle Wrapper ๋น ๋ฅธ ๋นŒ๋“œ, ์œ ์—ฐํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ

Backend Dependencies

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์šฉ๋„
spring-boot-starter-web REST API ๊ฐœ๋ฐœ
spring-boot-starter-data-jpa ORM (JPA/Hibernate)
spring-boot-starter-security ์ธ์ฆ/์ธ๊ฐ€
spring-boot-starter-webflux ๋น„๋™๊ธฐ HTTP ํด๋ผ์ด์–ธํŠธ (WebClient)
spring-boot-starter-validation Bean Validation
springdoc-openapi Swagger UI API ๋ฌธ์„œํ™”
jjwt JWT ํ† ํฐ ์ƒ์„ฑ/๊ฒ€์ฆ
shedlock ๋ถ„์‚ฐ ์Šค์ผ€์ค„๋ง ๋ฝ (๋‹ค์ค‘ ์ธ์Šคํ„ด์Šค ํ™˜๊ฒฝ)

AWS Integration

์„œ๋น„์Šค SDK ์šฉ๋„
GameLift Streams gameliftstreams ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆฌ๋ฐ
S3 s3 ๊ฒŒ์ž„ ๋นŒ๋“œ ํŒŒ์ผ ์ €์žฅ
STS sts ์ž„์‹œ ์ž๊ฒฉ ์ฆ๋ช… ๋ฐœ๊ธ‰

Database

ํ™˜๊ฒฝ Database ๋น„๊ณ 
local H2 (In-Memory) ๋น ๋ฅธ ๊ฐœ๋ฐœ ์‚ฌ์ดํด
dev/prod MariaDB AWS RDS

โœจ ํ•ต์‹ฌ ๊ธฐ๋Šฅ & ๊ธฐ์ˆ ์  ๋„์ „

1. SSE ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ AI ์ธํ„ฐ๋ทฐ ์‹œ์Šคํ…œ

๋ฌธ์ œ: AI ์„œ๋ฒ„์˜ ์‘๋‹ต ์‹œ๊ฐ„์ด ์ˆ˜ ์ดˆ~์ˆ˜์‹ญ ์ดˆ์— ๋‹ฌํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ธํ„ฐ๋ทฐ ์ง„ํ–‰ ์ƒํ™ฉ์„ ํ™•์ธํ•ด์•ผ ํ•จ

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ:

  • Server-Sent Events (SSE) ๋ฅผ ํ™œ์šฉํ•œ ๋‹จ๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ๊ตฌํ˜„
  • SseEmitter๋ฅผ ํ†ตํ•œ ์ด๋ฒคํŠธ ํƒ€์ž…๋ณ„ ๋ถ„๊ธฐ (greeting_continue, greeting_done, question, reaction, interview_complete)
  • ๊ผฌ๋ฆฌ์งˆ๋ฌธ(Probing) ์ œ์–ด: ์„œ๋ฒ„ ์ฃผ๋„์˜ ์ธํ„ฐ๋ทฐ ์ƒํƒœ ๊ด€๋ฆฌ๋กœ ๋ฌดํ•œ ๋ฃจํ”„ ๋ฐฉ์ง€
๊ด€๋ จ ์ปค๋ฐ‹:
- feat: SSE๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์„ค๋ฌธ ์ง„ํ–‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#17)
- feat: ์ธํ„ฐ๋ทฐ SSE ์ด๋ฒคํŠธ์— ๊ผฌ๋ฆฌ์งˆ๋ฌธ ์ œ์–ด ํ•„๋“œ ์ถ”๊ฐ€ (#92)
- fix: SSE ์—ฐ๊ฒฐ ๋Š๊น€(Race Condition) ๋ฐ ์ข€๋น„ ์ŠคํŠธ๋ฆผ ๋ฌธ์ œ ํ•ด๊ฒฐ (#176)

2. AWS GameLift Streams ์˜จ๋””๋งจ๋“œ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

๋ฌธ์ œ: ํ”Œ๋ ˆ์ดํ…Œ์ŠคํŠธ ๊ธฐ๊ฐ„์—๋งŒ ํด๋ผ์šฐ๋“œ ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ํ•„์š”ํ•˜๋ฉฐ, ๋น„์šฉ ์ตœ์ ํ™”์™€ ๋น ๋ฅธ ํ”„๋กœ๋น„์ €๋‹์ด ํ•„์ˆ˜

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ:

  • JIT(Just-In-Time) ํ”„๋กœ๋น„์ €๋‹: ์„ค๋ฌธ ํ™œ์„ฑํ™” ์‹œ์ ์— GameLift Application + StreamGroup ์ƒ์„ฑ
  • Two-Phase Transaction Pattern: DB ์ƒํƒœ ๋ณ€๊ฒฝ๊ณผ AWS API ํ˜ธ์ถœ ๋ถ„๋ฆฌ๋กœ ์ผ๊ด€์„ฑ ๋ณด์žฅ
  • ๋น„๋™๊ธฐ ์Šค์ผ€์ผ๋ง: ์Šค์ผ€์ผ์—…/๋‹ค์šด ์š”์ฒญ์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ API ์‘๋‹ต ์‹œ๊ฐ„ ๋‹จ์ถ•
  • Race Condition ํ•ด๊ฒฐ: ๋™์‹œ ํ…Œ์Šคํ„ฐ ์ ‘์† ์‹œ ๋ฆฌ์†Œ์Šค ํ• ๋‹น ์ถฉ๋Œ ๋ฐฉ์ง€
๊ด€๋ จ ์ปค๋ฐ‹:
- feat: GameLift Streams ๊ธฐ๋ฐ˜ ์˜จ๋””๋งจ๋“œ ๋ฆฌ์†Œ์Šค ํ• ๋‹น ๋ฐ ํ…Œ์Šคํ„ฐ ์ ‘์† ํ™˜๊ฒฝ ๊ตฌํ˜„ (#53)
- fix: ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ๋ ˆ์ด์Šค ์ปจ๋””์…˜ ํ•ด๊ฒฐ (#114)
- refactor: Streaming ์„œ๋น„์Šค DB ์ปค๋„ฅ์…˜ ๊ณ ๊ฐˆ ๋ฐฉ์ง€ ๋ฐ ์•ˆ์ •์„ฑ ๊ฐœ์„  (#164)

3. ์„œ๋ฒ„ ์ฃผ๋„ ์ธํ„ฐ๋ทฐ ์ƒํƒœ ๋จธ์‹ 

๋ฌธ์ œ: ํด๋ผ์ด์–ธํŠธ ์ฃผ๋„ ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ ์ค‘๋ณต ์š”์ฒญ, ์ƒํƒœ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ ๋ฐœ์ƒ

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ:

  • SurveySession ์—”ํ‹ฐํ‹ฐ์— ํ˜„์žฌ ์งˆ๋ฌธ ID, ์ˆœ์„œ, ํ„ด ๋ฒˆํ˜ธ๋ฅผ ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌ
  • ์ƒํƒœ ์ „์ด ๋ฉ”์„œ๋“œ (connect(), disconnectStream(), complete()) ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ ์บก์Аํ™”
  • ์ข…๋ฃŒ๋œ ์„ธ์…˜์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์š”์ฒญ ๊ฑฐ๋ถ€๋กœ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ
๊ด€๋ จ ์ปค๋ฐ‹:
- Fix: ์ข…๋ฃŒ๋œ ์ธํ„ฐ๋ทฐ ์„ธ์…˜ ๋ณดํ˜ธ, ์„œ๋ฒ„ ์ฃผ๋„ ์ธํ„ฐ๋ทฐ ์ƒํƒœ ๊ด€๋ฆฌํ•˜๋„๋ก ๊ฐœ์„  (#111)
- feat: ์ธํ„ฐ๋ทฐ ์„ธ์…˜ ์ด์–ดํ•˜๊ธฐ/์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (#99)

4. AI ์„œ๋ฒ„ ํ†ตํ•ฉ ๋ฐ ์žฅ์•  ๋Œ€์‘

๋ฌธ์ œ: AI ์„œ๋ฒ„ ์‘๋‹ต ์ง€์—ฐ ๋ฐ ์žฅ์•  ์‹œ ์ „์ฒด ์‹œ์Šคํ…œ ์˜ํ–ฅ ์ตœ์†Œํ™” ํ•„์š”

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ:

  • WebClient ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ HTTP ํ†ต์‹  (Reactor)
  • ํƒ€์ž„์•„์›ƒ ์„ค์ • ๋ถ„๋ฆฌ: ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ read-timeout ๊ด€๋ฆฌ (AI_CLIENT_READ_TIMEOUT)
  • Health Check API: AI ์„œ๋ฒ„ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง
  • Graceful Degradation: AI ์žฅ์•  ์‹œ ๊ธฐ๋ณธ ์งˆ๋ฌธ ์„ธํŠธ ์ œ๊ณต
๊ด€๋ จ ์ปค๋ฐ‹:
- chore: AI client read-timeout์„ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋ถ„๋ฆฌ (#144)
- feat: MockDataLoader๊ตฌํ˜„ ๋ฐ AI์„œ๋ฒ„ HealthCheck ์ถ”๊ฐ€ (#124)

5. ๋ถ„์‚ฐ ํ™˜๊ฒฝ ์Šค์ผ€์ค„๋ง (ShedLock)

๋ฌธ์ œ: ๋‹ค์ค‘ ์ธ์Šคํ„ด์Šค ๋ฐฐํฌ ์‹œ ์Šค์ผ€์ค„๋Ÿฌ ์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ:

  • ShedLock + JDBC ๊ธฐ๋ฐ˜ ๋ถ„์‚ฐ ๋ฝ ๊ตฌํ˜„
  • ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ, ์„ธ์…˜ ํƒ€์ž„์•„์›ƒ ์ฒ˜๋ฆฌ ๋“ฑ ์ฃผ๊ธฐ์  ์ž‘์—…์— ์ ์šฉ

๐Ÿ“‚ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

src/main/java/com/playprobie/api/
โ”œโ”€โ”€ domain/                    # ๋„๋ฉ”์ธ๋ณ„ ํŒจํ‚ค์ง€ (DDD ๊ธฐ๋ฐ˜)
โ”‚   โ”œโ”€โ”€ analytics/            # ๐Ÿ“Š ๋ถ„์„ (ํด๋Ÿฌ์Šคํ„ฐ๋ง, ๊ฐ์ •๋ถ„์„)
โ”‚   โ”‚   โ”œโ”€โ”€ api/              # Controller
โ”‚   โ”‚   โ”œโ”€โ”€ application/      # Service
โ”‚   โ”‚   โ”œโ”€โ”€ dao/              # Repository
โ”‚   โ”‚   โ”œโ”€โ”€ domain/           # Entity, VO
โ”‚   โ”‚   โ””โ”€โ”€ dto/              # Request/Response DTO
โ”‚   โ”œโ”€โ”€ auth/                 # ๐Ÿ” ์ธ์ฆ (JWT, OAuth)
โ”‚   โ”œโ”€โ”€ game/                 # ๐ŸŽฎ ๊ฒŒ์ž„/๋นŒ๋“œ ๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ interview/            # ๐ŸŽค AI ์ธํ„ฐ๋ทฐ ์„ธ์…˜
โ”‚   โ”œโ”€โ”€ replay/               # ๐Ÿ“น ํ”Œ๋ ˆ์ด ๋ฆฌํ”Œ๋ ˆ์ด
โ”‚   โ”œโ”€โ”€ streaming/            # โ˜๏ธ GameLift ์ŠคํŠธ๋ฆฌ๋ฐ
โ”‚   โ”œโ”€โ”€ survey/               # ๐Ÿ“‹ ์„ค๋ฌธ ์„ค๊ณ„/๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ user/                 # ๐Ÿ‘ค ์‚ฌ์šฉ์ž
โ”‚   โ””โ”€โ”€ workspace/            # ๐Ÿข ์›Œํฌ์ŠคํŽ˜์ด์Šค
โ”œโ”€โ”€ global/                   # ๊ณตํ†ต ๋ชจ๋“ˆ
โ”‚   โ”œโ”€โ”€ config/               # Security, WebClient ์„ค์ •
โ”‚   โ”œโ”€โ”€ domain/               # BaseTimeEntity ๋“ฑ
โ”‚   โ”œโ”€โ”€ error/                # ์˜ˆ์™ธ ์ฒ˜๋ฆฌ (GlobalExceptionHandler)
โ”‚   โ””โ”€โ”€ converter/            # JPA Converter
โ””โ”€โ”€ infra/                    # ์ธํ”„๋ผ ๊ณ„์ธต
    โ”œโ”€โ”€ ai/                   # FastAPI ํด๋ผ์ด์–ธํŠธ
    โ”œโ”€โ”€ gamelift/             # AWS GameLift SDK ๋ž˜ํผ
    โ””โ”€โ”€ sse/                  # SSE ์ด๋ฒคํŠธ ๊ด€๋ฆฌ

๐Ÿ“Š ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ

erDiagram
    USER ||--o{ WORKSPACE_MEMBER : "belongs to"
    WORKSPACE ||--o{ WORKSPACE_MEMBER : "has"
    WORKSPACE ||--o{ GAME : "contains"
    GAME ||--o{ GAME_BUILD : "has versions"
    GAME ||--o{ SURVEY : "has"
    
    SURVEY ||--o| STREAMING_RESOURCE : "uses"
    SURVEY ||--o{ SURVEY_SESSION : "has sessions"
    SURVEY ||--o{ FIXED_QUESTION : "has questions"
    
    SURVEY_SESSION ||--o{ INTERVIEW_LOG : "records"
    GAME_BUILD ||--o{ STREAMING_RESOURCE : "deployed to"

    USER {
        bigint user_id PK
        varchar email UK
        varchar name
        timestamp created_at
    }
    
    WORKSPACE {
        bigint workspace_id PK
        varchar name
        timestamp created_at
    }
    
    GAME {
        bigint game_id PK
        bigint workspace_id FK
        varchar name
        text description
    }
    
    SURVEY {
        bigint survey_id PK
        uuid survey_uuid UK
        bigint game_id FK
        varchar name
        enum status "DRAFT|ACTIVE|CLOSED"
        enum test_stage
        text theme_priorities
        timestamp start_at
        timestamp end_at
    }
    
    SURVEY_SESSION {
        bigint session_id PK
        uuid session_uuid UK
        bigint survey_id FK
        enum status "CONNECTED|IN_PROGRESS|COMPLETED|DROPPED|TERMINATED"
        bigint current_fixed_q_id
        int current_turn_num
        timestamp started_at
        timestamp ended_at
    }
    
    STREAMING_RESOURCE {
        bigint resource_id PK
        uuid resource_uuid UK
        bigint survey_id FK
        bigint build_id FK
        varchar aws_application_id
        varchar aws_stream_group_id
        enum status "CREATING|PROVISIONING|READY|ACTIVE|ERROR"
        int current_capacity
        int max_capacity
    }
    
    INTERVIEW_LOG {
        bigint log_id PK
        bigint session_id FK
        enum question_type "FIXED|PROBING|INSIGHT"
        text question_text
        text answer_text
        enum validity
        enum quality
        timestamp created_at
    }
Loading

๐Ÿ“ก API ๋ฌธ์„œ

Swagger UI

๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ ํ›„ ์•„๋ž˜ URL์—์„œ API ๋ช…์„ธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

http://localhost:8080/swagger-ui/index.html

์ฃผ์š” API ์—”๋“œํฌ์ธํŠธ

๋„๋ฉ”์ธ ๋ฉ”์„œ๋“œ ์—”๋“œํฌ์ธํŠธ ์„ค๋ช…
Auth POST /auth/login ๋กœ๊ทธ์ธ (JWT ๋ฐœ๊ธ‰)
Survey POST /surveys ์„ค๋ฌธ ์ƒ์„ฑ
Survey PATCH /surveys/{id}/status ์„ค๋ฌธ ์ƒํƒœ ๋ณ€๊ฒฝ
Interview GET /surveys/{id}/sessions/{sessionId}/stream SSE ์ธํ„ฐ๋ทฐ ์ŠคํŠธ๋ฆผ
Interview POST /surveys/{id}/sessions/{sessionId}/answer ๋‹ต๋ณ€ ์ œ์ถœ
Streaming POST /streaming-resources ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ
Analytics GET /surveys/{id}/analytics ๋ถ„์„ ๊ฒฐ๊ณผ ์กฐํšŒ

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

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

  • Java 21+
  • Gradle 8.x (๋˜๋Š” Gradle Wrapper ์‚ฌ์šฉ)

์„ค์น˜ ๋ฐ ์‹คํ–‰

# 1. ์ €์žฅ์†Œ ํด๋ก 
git clone https://github.com/PlayProbie/server.git
cd server

# 2. ๋กœ์ปฌ ํ™˜๊ฒฝ ์‹คํ–‰ (H2 DB)
./gradlew bootRun

# 3. ํ…Œ์ŠคํŠธ ์‹คํ–‰
./gradlew test

# 4. ๋นŒ๋“œ
./gradlew build

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

๋ณ€์ˆ˜๋ช… ์„ค๋ช… ๊ธฐ๋ณธ๊ฐ’
SPRING_PROFILES_ACTIVE ํ™œ์„ฑ ํ”„๋กœํŒŒ์ผ local
AI_SERVER_URL FastAPI AI ์„œ๋ฒ„ URL http://localhost:8000
AI_CLIENT_READ_TIMEOUT AI ์„œ๋ฒ„ ์ฝ๊ธฐ ํƒ€์ž„์•„์›ƒ (ms) 30000
JWT_SECRET JWT ์„œ๋ช… ํ‚ค -
AWS_ACCESS_KEY_ID AWS ์•ก์„ธ์Šค ํ‚ค -
AWS_SECRET_ACCESS_KEY AWS ์‹œํฌ๋ฆฟ ํ‚ค -

๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ


๐Ÿง‘โ€๐Ÿ’ป ๊ฐœ๋ฐœ ์ปจ๋ฒค์…˜

  • ์ฝ”๋“œ ํฌ๋งท: Naver Eclipse Formatter (Spotless)
  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€: Conventional Commits (feat:, fix:, refactor:, chore:)
  • ๋ธŒ๋žœ์นญ ์ „๋žต: feat/#issue, fix/#issue

Built with โ˜• Spring Boot by PlayProbie Team

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors