.env ํ์ผ ๋ง๋ค๊ณ ์คํ
PORT=3001
NODE_ENV=dev
COOKIE_SECRET=secret
DB_HOST=localhost
DB_PORT=3307
DB_USER=root
DB_PASSWORD=1234
DB_NAME=mydb
MAP_API_KEY=YOUR_GOOGLE_MAP_API_KEY
AI_SERVER_URL=http://localhost:8000
docker compose up
๐จ Local Server URL (Server Host) ๐จ
http://127.0.0.1:3001
๐ธ Overview
| HTTP METHOD | End Point | Description | ๊ตฌํ ์ฌ๋ถ |
|---|---|---|---|
| GET | /user | ํ์ ์ ๋ณด ์กฐํ | O |
| PATCH | /user | ํ์์ ๋ณด ์์ | O |
| DELETE | /user | ํ์์ญ์ | O |
| GET | /auth/login | ๋ก๊ทธ์ธ | O |
| GET | /auth/logout | ๋ก๊ทธ์์ | O |
| POST | /auth/register | ํ์๊ฐ์ | O |
| GET | /sport | ์คํฌ์ธ ๊ฐ์ข ์ด์ฉ๊ถ ์ ๋ณด ์กฐํ | O |
| GET | /sport/detail/:sport_id | ์คํฌ์ธ ๊ฐ์ข ์ด์ฉ๊ถ ์ ๋ณด ์์ธ ์กฐํ | O |
| GET | /sport/ai | AI ์ถ์ฒ ์ด๋ ๊ฐ์ ธ์ค๊ธฐ | O |
| POST | /sport/ai | AI ์ค๋ฌธ ์กฐ์ฌ | O |
| GET | /class | ๋ด๊ฐ ๋ฑ๋กํ ์คํฌ์ธ ๊ฐ์ข ์กฐํ | O |
| POST | /class/:class_id | ์คํฌ์ธ ๊ฐ์ข ๋ฑ๋ก | O |
| DELETE | /class/:class_id | ์คํฌ์ธ ๊ฐ์ข ๋ฑ๋ก ์ทจ์ | O |
| GET | /clsss/bookmark | ์คํฌ์ธ ๊ฐ์ข ์ฆ๊ฒจ์ฐพ๊ธฐ ์กฐํ | O |
| POST | /class/bookmark/:class_id | ์คํฌ์ธ ๊ฐ์ข ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฑ๋ก | O |
| DELETE | /class/bookmark/:class_id | ์คํฌ์ธ ๊ฐ์ข ์ฆ๊ฒจ์ฐพ๊ธฐ ์ทจ์ | O |
๐ Server Response
โ Success
{
"user_id": 1,
"email": "test@naver.com",
"rating": "ํ๋ฆฌ๋ฏธ์",
"name": "ํ
์คํธ",
"age": 15,
"gender": "M",
"height": 160,
"weight": 50,
"school": "@@์คํ๊ต",
"phone": "010-0000-0000",
"balance": 100000,
"latitude": "37.5125402000",
"longitude": "127.1024458000"
}โ Error
{
"status": 400,
"error": "์ ์ ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค"
}๐ Request Body
{
"weight": 60
}๐ Server Response
โ Success
{
"status": 200,
"message": "์ฑ๊ณต"
}โ Error
{
"status": 400,
"error": "์ ์ ์ ๋ณด๊ฐ ์๋ชป ์
๋ ฅ ๋์์ต๋๋ค"
}๐ Server Response
โ Success
{
"status": 200,
"message": "์ฑ๊ณต"
}โ Error
{
"status": 400,
"error": "์ ์ ์ ๋ณด๊ฐ ์๋ชป ์
๋ ฅ ๋์์ต๋๋ค"
}๐ Request Body
{
"email": "test@naver.com",
"password": "1234"
}๐ Server Response
โ Success
{
"status": 200,
"message": "๋ก๊ทธ์ธ ์ฑ๊ณต"
}โ Error
{
"status": 400,
"error": "๋ก๊ทธ์ธ ์คํจ"
}๐ Server Response
โ Success
{
"status": 200,
"message": "์ฑ๊ณต"
}โ Error
{
"status": 400,
"error": "๋ก๊ทธ์ธ๋์ด ์์ง ์์ต๋๋ค"
}| ์ปฌ๋ผ ํ๊ธ๋ช | ์ปฌ๋ผ ์๋ฌธ๋ช | ๋ฐ์ดํฐ ํ์ | ํ์์ฌ๋ถ | ๋ฐ์ดํฐ ์์ |
|---|---|---|---|---|
| ์ด๋ฉ์ผ | string | Y | test@naver.com | |
| ๋น๋ฐ๋ฒํธ | password | string | Y | password |
| ๋ฑ๊ธ | rating | string | Y | ์ผ๋ฐ |
| ์ด๋ฆ | name | string | Y | ํ ์คํธ |
| ๋์ด | age | number | Y | 15 |
| ์ฑ๋ณ | gender | string | Y | M |
| ํค | height | number | Y | 160 |
| ๋ชธ๋ฌด๊ฒ | weight | number | Y | 50 |
| ํ๊ต ์ด๋ฆ | school | string | Y | ##์คํ๊ต |
| ์ ํ๋ฒํธ | phone | string | Y | 010-0000-0000 |
| ๊ด์ฌ ์ด๋ | exercies | [string] | N | [โ์ถ๊ตฌโ, โ์์โ] |
๐ Request Body
{
"email": "test@naver.com",
"password": "password",
"rating": "ํ๋ฆฌ๋ฏธ์",
"name": "ํ
์คํธ",
"age": 15,
"gender": "M",
"height": 160,
"weight": 50,
"school": "๊ด์ด์คํ๊ต",
"phone": "010-0000-0000",
"experience": "Y",
"exercies": ["์ถ๊ตฌ", "์์"]
}๐ Server Response
โ Success
{
"status": 200,
"message": "ํ์๊ฐ์
์ฑ๊ณต"
}โ Error
{
"status": 400,
"error": "์ ์ ์ ๋ณด๊ฐ ์๋ชป ์
๋ ฅ ๋์์ต๋๋ค" | "Google Map API ์๋ฌ"
}| ์ปฌ๋ผ ํ๊ธ๋ช | ์ปฌ๋ผ ์๋ฌธ๋ช | ๋ฐ์ดํฐ ํ์ | ํ์์ฌ๋ถ | ๋ฐ์ดํฐ ์์ | ์ค๋ช |
|---|---|---|---|---|---|
| ํ์ด์ง | page | number | Y | 1 | 1 ํ์ด์ง๋น 10๊ฐ์ฉ ์กฐํ |
| ์ด๋ | exercises | [string] | N | ์์, ๋ฐฐ๋๋ฏผํด | ์ด๋ ๋ฐ์ดํฐ ํํฐ๋ง |
| ๊ฑฐ๋ฆฌ | distance | number | N | 1.2 | ๊ธฐ๋ณธ๊ฐ 5km |
| ์๊ฐ๋ | time | string | N | ์ค์ | ์ค์ , ์คํ๋ก ํํฐ๋ง |
๐ Request Body
{
"page": 1,
"exercises": ["์์", "๋ฐฐ๋๋ฏผํด"],
"distance": 5,
"time": "์ค์ "
}๐ Server Response
โ Success
{
"status": 200,
"sports": [
{
"sport_id": 1,
"exercise": "์์",
"facility_name": "๊ฐ๋จ์คํฌ์ธ ๋ฌธํ์ผํฐ์์์ฅ",
"address": "์์ธํน๋ณ์ ๊ฐ๋จ๊ตฌ ๋ฐค๊ณ ๊ฐ๋ก1๊ธธ 52 (์์๋)",
"distance": 2
"time": "09:30~10:20"
},
{
"sport_id": 2,
"exercise": "๋ฐฐ๋๋ฏผํด",
"facility_name": "๊ฐ๋ถ์ฐ๋น์คํฌ์ธ ์ผํฐ",
"address": "์์ธํน๋ณ์ ๊ฐ๋ถ๊ตฌ ์คํ๋ก31๊ธธ 51 (๋ฒ๋)",
"distance": 3
"time": "09:30~10:20",
},
...
]
}โ Error
{
"status": 400,
"error": "์คํฌ์ธ ๊ฐ์ข๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค"
}ํํฐ๋ง ์์
| ์ปฌ๋ผ ํ๊ธ๋ช | ์ปฌ๋ผ ์๋ฌธ๋ช | ๋ฐ์ดํฐ ํ์ | ํ์์ฌ๋ถ | ๋ฐ์ดํฐ ์์ | ์ค๋ช |
|---|---|---|---|---|---|
| ํ์ด์ง | page | number | Y | 1 | 1 ํ์ด์ง๋น 10๊ฐ์ฉ ์กฐํ |
| ์๊ฐ๋ฃ | price | number | N | 36000 | |
| ์์ผ | day | [string] | N | ํ, ๋ชฉ |
๐ Request Body
{
"page": 1
"price": 36000
"day": ["ํ", "๋ชฉ"]
}๐ Server Response
โ Success
{
"status": 200,
"sports": [
{
"class_id": 1,
"facility_name": "๊ฐ๋จ์คํฌ์ธ ๋ฌธํ์ผํฐ์์์ฅ",
"facility_type": "์์์ฅ",
"address": "์์ธํน๋ณ์ ๊ฐ๋จ๊ตฌ ๋ฐค๊ณ ๊ฐ๋ก1๊ธธ 52 (์์๋)",
"program_name": "์ฃผ๋ง๊ทธ๋ฃน๋ ์จA",
"exercise": "์์",
"begin": "20241101",
"end": "20241130",
"day": "ํ ",
"time": "09:30~10:20",
"recruit_cnt": 5,
"price": 60000
},
{
"class_id": 2,
"facility_name": "๊ฐ๋จ์คํฌ์ธ ๋ฌธํ์ผํฐ์์์ฅ",
"facility_type": "์์์ฅ",
"address": "์์ธํน๋ณ์ ๊ฐ๋จ๊ตฌ ๋ฐค๊ณ ๊ฐ๋ก1๊ธธ 52 (์์๋)",
"program_name": "์ฃผ๋ง๊ทธ๋ฃน๋ ์จB",
"exercise": "์์",
"begin": "20241101",
"end": "20241130",
"day": "ํ ",
"time": "10:30~11:20",
"recruit_cnt": 5,
"price": 60000
},
{
"class_id": 3,
"facility_name": "๊ฐ๋จ์คํฌ์ธ ๋ฌธํ์ผํฐ์์์ฅ",
"facility_type": "์์์ฅ",
"address": "์์ธํน๋ณ์ ๊ฐ๋จ๊ตฌ ๋ฐค๊ณ ๊ฐ๋ก1๊ธธ 52 (์์๋)",
"program_name": "์ฃผ๋ง๊ทธ๋ฃน๋ ์จC",
"exercise": "์์",
"begin": "20241101",
"end": "20241130",
"day": "ํ ",
"time": "11:30~12:20",
"recruit_cnt": 5,
"price": 60000
},
...
]
}โ Error
{
"status": 400,
"error": "์คํฌ์ธ ๊ฐ์ข๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค"
}๐ Server Response
โ Success
{
"status": 200,
"exercies": ["์ฒ ์ธ๋ฐ", "์ํ์ด๋", "์ฒด์กฐ", "์ฅ์ ์ธ์คํฌ์ธ "]
}โ Error
{
"status": 400,
"error": "AI ์ค๋ฌธ์กฐ์ฌ ์คํจ"
}| ์ปฌ๋ผ ํ๊ธ๋ช | ์ปฌ๋ผ ์๋ฌธ๋ช | ๋ฐ์ดํฐ ํ์ | ํ์์ฌ๋ถ | ๋ฐ์ดํฐ ์์ |
|---|---|---|---|---|
| ์ด๋ ์ ํธ๋ | preference | number | Y | 10 |
| ์ด๋ ๊ฐ๋ | intense | number | Y | 5 |
| ์ด๋ ์ฃผ๋น ๋น๋(์ ๊ธฐ์ฑ) | frequency | number | Y | 5 |
| ์ด๋ ์น๊ตฌ ์ ๋ฌด | friend | number | Y | 10 |
| ์ด๋ ๋ชฉํ | goal | number | Y | 10 |
| ์ด๋ ๋ฐฉ์ | method | number | Y | 10 |
| ํ๋์ฑ | activity | number | Y | 5 |
| ์ค๋ด vs ์ค์ธ | place | number | Y | 10 |
| ์ด๋ ์๊ฐ๋ | time | number | Y | 5 |
| ์ด๋ ์ข ๋ฅ | type | number | Y | 10 |
๐ Request Body
{
"preference": 10,
"intense": 5,
"frequency": 5,
"friend": 10,
"goal": 10,
"method": 10,
"activity": 5,
"place": 10,
"time": 5,
"type": 10
}๐ Server Response
โ Success
{
"status": 201,
"message": "AI ์ค๋ฌธ์กฐ์ฌ ์ ์ก ์ฑ๊ณต"
}โ Error
{
"status": 400,
"error": "AI ์ค๋ฌธ์กฐ์ฌ ์ ์ก ์คํจ"
}๐ Server Response
โ Success
{
"status": 200,
"class_id": [1, 6, 23]
}โ Error
{
"status": 400,
"error": "์คํฌ์ธ ๊ฐ์ข ์กฐํ ์คํจ"
}๐ Server Response
โ Success
{
"status": 201,
"message": "์คํฌ์ธ ๊ฐ์ข ๋ฑ๋ก ์ฑ๊ณต"
}โ Error
{
"status": 400,
"error": "์คํฌ์ธ ๊ฐ์ข ๋ฑ๋ก ์คํจ"
}๐ Server Response
โ Success
{
"status": 200,
"message": "์คํฌ์ธ ๊ฐ์ข ์ทจ์์ฑ๊ณต"
}โ Error
{
"status": 400,
"error": "์คํฌ์ธ ๊ฐ์ข ์ทจ์ ์คํจ"
}๐ Server Response
โ Success
{
"status": 201,
"class_id": [1, 4, 6]
}โ Error
{
"status": 400,
"error": "์ฆ๊ฒจ์ฐพ๊ธฐ ์กฐํ ์คํจ"
}๐ Server Response
โ Success
{
"status": 201,
"message": "์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฑ๋ก ์ฑ๊ณต"
}โ Error
{
"status": 400,
"error": "์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฑ๋ก ์คํจ"
}๐ Server Response
โ Success
{
"status": 200,
"message": "์ฆ๊ฒจ์ฐพ๊ธฐ ์ทจ์ ์ฑ๊ณต"
}โ Error
{
"status": 400,
"error": "์ฆ๊ฒจ์ฐพ๊ธฐ ์ทจ์ ์คํจ"
}