Skip to content

BeMore-CapstoneDesign/bemoreBackend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

19 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

BeMore Backend

AI ๊ธฐ๋ฐ˜ ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ๊ฐ์ • ๋ถ„์„ ๋ฐ CBT ํ”ผ๋“œ๋ฐฑ ์„œ๋น„์Šค์˜ ๋ฐฑ์—”๋“œ API ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

๐Ÿš€ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

BeMore๋Š” VAD (Valence-Arousal-Dominance) ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…์ŠคํŠธ, ์Œ์„ฑ, ์–ผ๊ตด ํ‘œ์ •์„ ํ†ตํ•ฉ ๋ถ„์„ํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๊ฐ์ • ์ƒํƒœ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•˜๊ณ , ์ธ์ง€ํ–‰๋™์น˜๋ฃŒ(CBT) ๊ธฐ๋ฒ•์„ ์ œ์•ˆํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

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

  • ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ๊ฐ์ • ๋ถ„์„: ํ…์ŠคํŠธ, ์Œ์„ฑ, ์–ผ๊ตด ํ‘œ์ • ํ†ตํ•ฉ ๋ถ„์„
  • VAD ๋ชจ๋ธ ๊ธฐ๋ฐ˜: ๊ณผํ•™์  ๊ฐ์ • ๋ถ„์„ (Valence-Arousal-Dominance)
  • ์‹ค์‹œ๊ฐ„ ๊ฐ์ • ๋ถ„๋ฅ˜: 7๊ฐ€์ง€ ์ฃผ์š” ๊ฐ์ • (happy, sad, angry, excited, surprised, calm, neutral)
  • ์œ„ํ—˜ ์‹ ํ˜ธ ๊ฐ์ง€: ์ž๋™ ์œ„ํ—˜ ์ˆ˜์ค€ ํ‰๊ฐ€ ๋ฐ ๊ถŒ์žฅ์‚ฌํ•ญ ์ œ๊ณต
  • CBT ํ”ผ๋“œ๋ฐฑ: ๊ฐœ์ธํ™”๋œ ์ธ์ง€ํ–‰๋™์น˜๋ฃŒ ๊ธฐ๋ฒ• ์ œ์•ˆ
  • ์„ธ์…˜ ๊ด€๋ฆฌ: ๋Œ€ํ™” ์„ธ์…˜ ์ƒ์„ฑ ๋ฐ ๊ฐ์ • ๋ณ€ํ™” ์ถ”์ 
  • ํžˆ์Šคํ† ๋ฆฌ ์กฐํšŒ: ๊ณผ๊ฑฐ ๋ถ„์„ ๊ฒฐ๊ณผ ๋ฐ ๊ฐ์ • ํŒจํ„ด ๋ถ„์„

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

  • Framework: NestJS
  • Database: PostgreSQL + Prisma
  • AI: Google Gemini 2.5-flash API
  • Language: TypeScript
  • Validation: class-validator, class-transformer
  • File Upload: Multer
  • Authentication: JWT (์ค€๋น„ ์ค‘)

๐Ÿ“‹ API ์—”๋“œํฌ์ธํŠธ

๊ฐ์ • ๋ถ„์„ API

  • POST /emotion/analyze/text - ํ…์ŠคํŠธ ๊ฐ์ • ๋ถ„์„
  • POST /emotion/analyze/facial - ์–ผ๊ตด ํ‘œ์ • ๋ถ„์„
  • POST /emotion/analyze/voice - ์Œ์„ฑ ํ†ค ๋ถ„์„
  • POST /emotion/analyze/multimodal - ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ํ†ตํ•ฉ ๋ถ„์„

CBT ํ”ผ๋“œ๋ฐฑ API

  • POST /emotion/cbt/feedback - CBT ํ”ผ๋“œ๋ฐฑ ์ƒ์„ฑ
  • POST /emotion/risk-assessment - ์œ„ํ—˜ ์‹ ํ˜ธ ๊ฐ์ง€
  • GET /emotion/patterns/{sessionId} - ๊ฐ์ • ํŒจํ„ด ๋ถ„์„

ํžˆ์Šคํ† ๋ฆฌ API

  • GET /emotion/history/{sessionId} - ๊ฐ์ • ๋ถ„์„ ํžˆ์Šคํ† ๋ฆฌ ์กฐํšŒ

ํ…Œ์ŠคํŠธ API

  • POST /emotion/test/face-detection - ์–ผ๊ตด ๊ฐ์ง€ ํ…Œ์ŠคํŠธ
  • POST /emotion/test/audio-quality - ์Œ์„ฑ ํ’ˆ์งˆ ํ‰๊ฐ€

์ž์„ธํ•œ API ๋ฌธ์„œ๋Š” API_DOCUMENTATION.md๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ

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

  • Node.js 18+
  • PostgreSQL 12+
  • Google Gemini API ํ‚ค (์„ ํƒ์‚ฌํ•ญ - Mock ์‘๋‹ต ์ง€์›)

์„ค์น˜

  1. ์ €์žฅ์†Œ ํด๋ก 
git clone https://github.com/BeMore-CapstoneDesign/bemoreBackend.git
cd bemore-backend
  1. ์˜์กด์„ฑ ์„ค์น˜
npm install
  1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
cp env.example .env

.env ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜์—ฌ ๋‹ค์Œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”:

# Database
DATABASE_URL="postgresql://postgres:password@localhost:5432/bemore"

# Gemini API (์„ ํƒ์‚ฌํ•ญ - ์—†์œผ๋ฉด Mock ์‘๋‹ต ์‚ฌ์šฉ)
GEMINI_API_KEY="your-gemini-api-key"

# JWT
JWT_SECRET="your-jwt-secret-key-for-development"

# Server
PORT=3000

# File Upload
MAX_FILE_SIZE=10485760  # 10MB
UPLOAD_DEST="./uploads"
  1. PostgreSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •
# PostgreSQL์— ์ ‘์†
psql -U postgres

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ
CREATE DATABASE bemore;
\q
  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
npx prisma generate
npx prisma db push
  1. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
npm run start:dev

์„œ๋ฒ„๊ฐ€ http://localhost:3000์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ

npm run build
npm run start:prod

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

src/
โ”œโ”€โ”€ modules/
โ”‚   โ”œโ”€โ”€ emotion/           # ๊ฐ์ • ๋ถ„์„ ๋ชจ๋“ˆ
โ”‚   โ”‚   โ”œโ”€โ”€ controllers/
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ emotion.controller.ts
โ”‚   โ”‚   โ”œโ”€โ”€ services/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ text-analysis.service.ts
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ facial-analysis.service.ts
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ voice-analysis.service.ts
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ multimodal-analysis.service.ts
โ”‚   โ”‚   โ””โ”€โ”€ emotion.module.ts
โ”‚   โ””โ”€โ”€ cbt/              # CBT ํ”ผ๋“œ๋ฐฑ ๋ชจ๋“ˆ
โ”‚       โ”œโ”€โ”€ services/
โ”‚       โ”‚   โ””โ”€โ”€ psychological-analysis.service.ts
โ”‚       โ””โ”€โ”€ cbt.module.ts
โ”œโ”€โ”€ chat/                 # ์ฑ„ํŒ… ๊ด€๋ จ ๋ชจ๋“ˆ
โ”‚   โ”œโ”€โ”€ chat.controller.ts
โ”‚   โ”œโ”€โ”€ chat.service.ts
โ”‚   โ””โ”€โ”€ chat.module.ts
โ”œโ”€โ”€ history/              # ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ ๋ชจ๋“ˆ
โ”‚   โ”œโ”€โ”€ history.controller.ts
โ”‚   โ”œโ”€โ”€ history.service.ts
โ”‚   โ””โ”€โ”€ history.module.ts
โ”œโ”€โ”€ health/               # ํ—ฌ์Šค์ฒดํฌ ๋ชจ๋“ˆ
โ”‚   โ”œโ”€โ”€ health.controller.ts
โ”‚   โ””โ”€โ”€ health.module.ts
โ”œโ”€โ”€ prisma/               # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •
โ”‚   โ”œโ”€โ”€ prisma.service.ts
โ”‚   โ””โ”€โ”€ prisma.module.ts
โ”œโ”€โ”€ services/             # ๊ณตํ†ต ์„œ๋น„์Šค
โ”‚   โ”œโ”€โ”€ gemini.service.ts
โ”‚   โ”œโ”€โ”€ context.service.ts
โ”‚   โ”œโ”€โ”€ prompt-engineering.service.ts
โ”‚   โ””โ”€โ”€ token-manager.service.ts
โ”œโ”€โ”€ dto/                  # ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด
โ”‚   โ”œโ”€โ”€ chat.dto.ts
โ”‚   โ”œโ”€โ”€ emotion.dto.ts
โ”‚   โ”œโ”€โ”€ history.dto.ts
โ”‚   โ””โ”€โ”€ multimodal.dto.ts
โ”œโ”€โ”€ types/                # ํƒ€์ž… ์ •์˜
โ”‚   โ””โ”€โ”€ vad.types.ts
โ”œโ”€โ”€ app.controller.ts
โ”œโ”€โ”€ app.module.ts
โ””โ”€โ”€ main.ts

๐Ÿง  ๊ฐ์ • ๋ถ„์„ ์‹œ์Šคํ…œ

VAD ๋ชจ๋ธ (Valence-Arousal-Dominance)

interface VADScore {
  valence: number;    // ๊ฐ์ •์˜ ๊ธ์ •์„ฑ (0-1)
  arousal: number;    // ๊ฐ์ •์˜ ํ™œ์„ฑํ™” ์ •๋„ (0-1)
  dominance: number;  // ๊ฐ์ •์˜ ์ง€๋ฐฐ์„ฑ (0-1)
}

๊ฐ์ • ๋ถ„๋ฅ˜

  • happy (๊ธฐ์จ): valence > 0.7, arousal โ‰ค 0.6
  • excited (ํฅ๋ถ„): valence > 0.7, arousal > 0.6
  • angry (๋ถ„๋…ธ): valence โ‰ค 0.3, arousal > 0.6
  • sad (์Šฌํ””): valence โ‰ค 0.3, arousal โ‰ค 0.6
  • surprised (๋†€๋žŒ): valence 0.4-0.7, arousal > 0.6
  • calm (ํ‰์˜จ): valence 0.4-0.7, arousal โ‰ค 0.6
  • neutral (์ค‘๋ฆฝ): ๊ธฐํƒ€

๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ํ†ตํ•ฉ ๋ถ„์„

  • ์–ผ๊ตด ํ‘œ์ •: 40% ๊ฐ€์ค‘์น˜ (๋†’์€ ์‹ ๋ขฐ๋„)
  • ์Œ์„ฑ ํ†ค: 35% ๊ฐ€์ค‘์น˜ (์ค‘๊ฐ„ ์‹ ๋ขฐ๋„)
  • ํ…์ŠคํŠธ: 25% ๊ฐ€์ค‘์น˜ (๋‚ฎ์€ ์‹ ๋ขฐ๋„)

๐Ÿ”ง ๊ฐœ๋ฐœ

์Šคํฌ๋ฆฝํŠธ

  • npm run start:dev - ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ (ํ•ซ ๋ฆฌ๋กœ๋“œ)
  • npm run build - ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ
  • npm run start:prod - ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„ ์‹คํ–‰
  • npm run test - ํ…Œ์ŠคํŠธ ์‹คํ–‰
  • npm run lint - ์ฝ”๋“œ ๋ฆฐํŒ…
  • npx prisma studio - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค GUI
  • npx prisma db push - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋™๊ธฐํ™”

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

npx prisma migrate dev --name <migration-name>

๐Ÿงช ํ…Œ์ŠคํŠธ

API ํ…Œ์ŠคํŠธ

test-api.http ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# ํ…์ŠคํŠธ ๊ฐ์ • ๋ถ„์„
curl -X POST http://localhost:3000/emotion/analyze/text \
  -H "Content-Type: application/json" \
  -d '{"text": "์˜ค๋Š˜ ์ •๋ง ๊ธฐ๋ถ„์ด ์ข‹์•„์š”!"}'

# ์–ผ๊ตด ํ‘œ์ • ๋ถ„์„
curl -X POST http://localhost:3000/emotion/analyze/facial \
  -F "image=@test_image.jpg"

# ์Œ์„ฑ ํ†ค ๋ถ„์„
curl -X POST http://localhost:3000/emotion/analyze/voice \
  -F "audio=@test_audio.wav"

# ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ํ†ตํ•ฉ ๋ถ„์„
curl -X POST http://localhost:3000/emotion/analyze/multimodal \
  -H "Content-Type: application/json" \
  -d '{
    "text": {"content": "์˜ค๋Š˜ ์ •๋ง ๊ธฐ๋ถ„์ด ์ข‹์•„์š”!"},
    "context": "์ผ์ƒ ๋Œ€ํ™”",
    "sessionId": "session_123"
  }'

๋‹จ์œ„ ํ…Œ์ŠคํŠธ

# ๋‹จ์œ„ ํ…Œ์ŠคํŠธ
npm run test

# e2e ํ…Œ์ŠคํŠธ
npm run test:e2e

# ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€
npm run test:cov

๐Ÿ“ ํ™˜๊ฒฝ ๋ณ€์ˆ˜

๋ณ€์ˆ˜๋ช… ์„ค๋ช… ๊ธฐ๋ณธ๊ฐ’ ํ•„์ˆ˜
DATABASE_URL PostgreSQL ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด - โœ…
GEMINI_API_KEY Google Gemini API ํ‚ค - โŒ (Mock ์‘๋‹ต ์ง€์›)
JWT_SECRET JWT ์‹œํฌ๋ฆฟ ํ‚ค - โœ…
PORT ์„œ๋ฒ„ ํฌํŠธ 3000 โŒ
MAX_FILE_SIZE ์ตœ๋Œ€ ํŒŒ์ผ ํฌ๊ธฐ (bytes) 10485760 โŒ
UPLOAD_DEST ํŒŒ์ผ ์—…๋กœ๋“œ ๊ฒฝ๋กœ ./uploads โŒ

๐Ÿ”’ ๋ณด์•ˆ

  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜: ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” .env ํŒŒ์ผ์— ์ €์žฅ (git์— ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์Œ)
  • ์ž…๋ ฅ ๊ฒ€์ฆ: class-validator๋ฅผ ํ†ตํ•œ ์š”์ฒญ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ
  • ํŒŒ์ผ ์—…๋กœ๋“œ: ํŒŒ์ผ ํฌ๊ธฐ ๋ฐ ํ˜•์‹ ์ œํ•œ
  • CORS: ํ”„๋ก ํŠธ์—”๋“œ ๋„๋ฉ”์ธ ํ—ˆ์šฉ ์„ค์ •
  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ: ์ƒ์„ธํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋ฐ ๋กœ๊น…

๐Ÿš€ ๋ฐฐํฌ

Docker ๋ฐฐํฌ (์ค€๋น„ ์ค‘)

# Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ
docker build -t bemore-backend .

# ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
docker run -p 3000:3000 bemore-backend

ํ™˜๊ฒฝ๋ณ„ ์„ค์ •

  • ๊ฐœ๋ฐœ: .env
  • ํ…Œ์ŠคํŠธ: .env.test
  • ํ”„๋กœ๋•์…˜: .env.production

๐Ÿ†• ์ตœ๊ทผ ์—…๋ฐ์ดํŠธ

v1.2.0 (2025-01-XX)

  • โœ… ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ๊ฐ์ • ๋ถ„์„: ํ…์ŠคํŠธ, ์Œ์„ฑ, ์–ผ๊ตด ํ‘œ์ • ํ†ตํ•ฉ ๋ถ„์„ ๊ตฌํ˜„
  • โœ… VAD ๋ชจ๋ธ: ๊ณผํ•™์  ๊ฐ์ • ๋ถ„์„ ๋ชจ๋ธ ์ ์šฉ
  • โœ… ๊ฐ์ • ๋ถ„๋ฅ˜ ์‹œ์Šคํ…œ: 7๊ฐ€์ง€ ์ฃผ์š” ๊ฐ์ • ์ž๋™ ๋ถ„๋ฅ˜
  • โœ… ์œ„ํ—˜ ์‹ ํ˜ธ ๊ฐ์ง€: ์ž๋™ ์œ„ํ—˜ ์ˆ˜์ค€ ํ‰๊ฐ€ ๋ฐ ๊ถŒ์žฅ์‚ฌํ•ญ
  • โœ… CBT ํ”ผ๋“œ๋ฐฑ: ๊ฐœ์ธํ™”๋œ ์ธ์ง€ํ–‰๋™์น˜๋ฃŒ ๊ธฐ๋ฒ• ์ œ์•ˆ
  • โœ… ํŒŒ์ผ ์—…๋กœ๋“œ: ์ด๋ฏธ์ง€/์˜ค๋””์˜ค ํŒŒ์ผ ์ฒ˜๋ฆฌ ๋ฐ ๊ฒ€์ฆ
  • โœ… API ์—”๋“œํฌ์ธํŠธ: ์™„์ „ํ•œ ๊ฐ์ • ๋ถ„์„ API ๊ตฌํ˜„

๊ฐœ๋ฐœ ์ƒํƒœ

  • ๐ŸŸข ๊ฐ์ • ๋ถ„์„ ์‹œ์Šคํ…œ: ์™„๋ฃŒ ๋ฐ ํ…Œ์ŠคํŠธ ์™„๋ฃŒ
  • ๐ŸŸข ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ํ†ตํ•ฉ: ์™„๋ฃŒ ๋ฐ ํ…Œ์ŠคํŠธ ์™„๋ฃŒ
  • ๐ŸŸข CBT ํ”ผ๋“œ๋ฐฑ: ์™„๋ฃŒ ๋ฐ ํ…Œ์ŠคํŠธ ์™„๋ฃŒ
  • ๐ŸŸก ํ”„๋ก ํŠธ์—”๋“œ ์—ฐ๋™: ์ง„ํ–‰ ์ค‘
  • ๐ŸŸก ์‹ค์ œ Gemini API: ํ…Œ์ŠคํŠธ ํ•„์š”
  • ๐Ÿ”ด ๋ฐฐํฌ ์ž๋™ํ™”: ์ค€๋น„ ์ค‘

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

๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

๐Ÿ“ž ๋ฌธ์˜

ํ”„๋กœ์ ํŠธ ๊ด€๋ จ ๋ฌธ์˜์‚ฌํ•ญ์ด ์žˆ์œผ์‹œ๋ฉด ์ด์Šˆ๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published