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 (์ค๋น ์ค)
POST /emotion/analyze/text- ํ ์คํธ ๊ฐ์ ๋ถ์POST /emotion/analyze/facial- ์ผ๊ตด ํ์ ๋ถ์POST /emotion/analyze/voice- ์์ฑ ํค ๋ถ์POST /emotion/analyze/multimodal- ๋ฉํฐ๋ชจ๋ฌ ํตํฉ ๋ถ์
POST /emotion/cbt/feedback- CBT ํผ๋๋ฐฑ ์์ฑPOST /emotion/risk-assessment- ์ํ ์ ํธ ๊ฐ์งGET /emotion/patterns/{sessionId}- ๊ฐ์ ํจํด ๋ถ์
GET /emotion/history/{sessionId}- ๊ฐ์ ๋ถ์ ํ์คํ ๋ฆฌ ์กฐํ
POST /emotion/test/face-detection- ์ผ๊ตด ๊ฐ์ง ํ ์คํธPOST /emotion/test/audio-quality- ์์ฑ ํ์ง ํ๊ฐ
์์ธํ API ๋ฌธ์๋ API_DOCUMENTATION.md๋ฅผ ์ฐธ์กฐํ์ธ์.
- Node.js 18+
- PostgreSQL 12+
- Google Gemini API ํค (์ ํ์ฌํญ - Mock ์๋ต ์ง์)
- ์ ์ฅ์ ํด๋ก
git clone https://github.com/BeMore-CapstoneDesign/bemoreBackend.git
cd bemore-backend- ์์กด์ฑ ์ค์น
npm install- ํ๊ฒฝ ๋ณ์ ์ค์
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"- PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
# PostgreSQL์ ์ ์
psql -U postgres
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
CREATE DATABASE bemore;
\q- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์
npx prisma generate
npx prisma db push- ๊ฐ๋ฐ ์๋ฒ ์คํ
npm run start:dev์๋ฒ๊ฐ http://localhost:3000์์ ์คํ๋ฉ๋๋ค.
npm run build
npm run start:prodsrc/
โโโ 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
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- ๋ฐ์ดํฐ๋ฒ ์ด์ค GUInpx prisma db push- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋๊ธฐํ
npx prisma migrate dev --name <migration-name>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 build -t bemore-backend .
# ์ปจํ
์ด๋ ์คํ
docker run -p 3000:3000 bemore-backend- ๊ฐ๋ฐ:
.env - ํ
์คํธ:
.env.test - ํ๋ก๋์
:
.env.production
- โ ๋ฉํฐ๋ชจ๋ฌ ๊ฐ์ ๋ถ์: ํ ์คํธ, ์์ฑ, ์ผ๊ตด ํ์ ํตํฉ ๋ถ์ ๊ตฌํ
- โ VAD ๋ชจ๋ธ: ๊ณผํ์ ๊ฐ์ ๋ถ์ ๋ชจ๋ธ ์ ์ฉ
- โ ๊ฐ์ ๋ถ๋ฅ ์์คํ : 7๊ฐ์ง ์ฃผ์ ๊ฐ์ ์๋ ๋ถ๋ฅ
- โ ์ํ ์ ํธ ๊ฐ์ง: ์๋ ์ํ ์์ค ํ๊ฐ ๋ฐ ๊ถ์ฅ์ฌํญ
- โ CBT ํผ๋๋ฐฑ: ๊ฐ์ธํ๋ ์ธ์งํ๋์น๋ฃ ๊ธฐ๋ฒ ์ ์
- โ ํ์ผ ์ ๋ก๋: ์ด๋ฏธ์ง/์ค๋์ค ํ์ผ ์ฒ๋ฆฌ ๋ฐ ๊ฒ์ฆ
- โ API ์๋ํฌ์ธํธ: ์์ ํ ๊ฐ์ ๋ถ์ API ๊ตฌํ
- ๐ข ๊ฐ์ ๋ถ์ ์์คํ : ์๋ฃ ๋ฐ ํ ์คํธ ์๋ฃ
- ๐ข ๋ฉํฐ๋ชจ๋ฌ ํตํฉ: ์๋ฃ ๋ฐ ํ ์คํธ ์๋ฃ
- ๐ข CBT ํผ๋๋ฐฑ: ์๋ฃ ๋ฐ ํ ์คํธ ์๋ฃ
- ๐ก ํ๋ก ํธ์๋ ์ฐ๋: ์งํ ์ค
- ๐ก ์ค์ Gemini API: ํ ์คํธ ํ์
- ๐ด ๋ฐฐํฌ ์๋ํ: ์ค๋น ์ค
- API ๋ฌธ์ - ์์ธํ API ๋ช ์ธ
- ํ๋ก ํธ์๋ ํตํฉ ๊ฐ์ด๋ - ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ฅผ ์ํ ๊ฐ์ด๋
- ์ํคํ ์ฒ ๋ฌธ์ - ์์คํ ์ํคํ ์ฒ ์ค๋ช
- ํ๋ก์ ํธ ๊ตฌ์กฐ - ์์ธํ ํ๋ก์ ํธ ๊ตฌ์กฐ
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
ํ๋ก์ ํธ ๊ด๋ จ ๋ฌธ์์ฌํญ์ด ์์ผ์๋ฉด ์ด์๋ฅผ ์์ฑํด ์ฃผ์ธ์.