Base URL: http://localhost:8888
λͺ¨λ APIλ λ€μ νμμΌλ‘ μλ΅ν©λλ€:
{
"success": true,
"code": null,
"message": null,
"data": { ... },
"timestamp": "2026-01-29T10:30:00"
}{
"success": false,
"code": "ERROR_CODE",
"message": "μλ¬ λ©μμ§",
"data": null,
"timestamp": "2026-01-29T10:30:00"
}{
"success": false,
"code": "VALIDATION_ERROR",
"message": "μμ² κ°μ΄ μ ν¨νμ§ μμ΅λλ€.",
"data": {
"deadline": "λ§κ° μκ°μ νμ¬ μκ° μ΄νμ¬μΌ ν©λλ€."
},
"timestamp": "2026-01-29T10:30:00"
}- μΈμ κΈ°λ° μΈμ¦ μ¬μ©
- μΏ ν€μ
nickname,fakeSessionIdν¬ν¨ - μΈμ¦ νμν APIλ κ° μΉμ μμ λͺ μ
μλ‘μ΄ λͺ¨μμ μμ±ν©λλ€.
μλν¬μΈνΈ
POST /meeting
μΈμ¦ νμ: β μμ
Request Body
{
"meetingName": "μ λ
ν",
"purposes": ["μΉλͺ©", "νμ"],
"purposeCount": 2,
"capacity": 10,
"deadline": "2026-01-30T23:59:59"
}| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| meetingName | String | β | λͺ¨μ μ΄λ¦ |
| purposes | Array[String] | β | λͺ¨μ λͺ©μ 리μ€νΈ (μΉλͺ©, νμ, μ€ν°λ λ±) |
| purposeCount | Integer | β | λͺ¨μ λͺ©μ κ°μ |
| capacity | Integer | β | λͺ¨μ μ μ (μ΅μ 2λͺ μ΄μ) |
| deadline | DateTime | β | λ§κ° μκ° (ISO 8601 νμ, λ―Έλ μκ°μ΄μ΄μΌ ν¨) |
Success Response (200 OK)
{
"success": true,
"data": {
"meetingUrl": "https://mingling.com/meeting/62db1c35-f7db-4aad-acc8-0ad64f61a312",
"meetingId": "62db1c35-f7db-4aad-acc8-0ad64f61a312"
},
"timestamp": "2026-01-29T10:30:00"
}Error Responses
| HTTP Status | Error Code | Message | λ°μ 쑰건 |
|---|---|---|---|
| 400 | VALIDATION_ERROR | μμ² κ°μ΄ μ ν¨νμ§ μμ΅λλ€. | κ²μ¦ μ€ν¨ (μ°μ μμ μμΌλ‘ νλλ§ λ°ν) |
| 400 | PURPOSE_NOT_FOUND | μΌλΆ λͺ¨μ λͺ©μ μ μ°Ύμ μ μμ΅λλ€. | μ μλμ§ μμ λͺ©μ λͺ ν¬ν¨ |
κ²μ¦ μλ¬ μ°μ μμ
deadline- λ§κ° μκ°μ νμ¬ μκ° μ΄νμ¬μΌ ν©λλ€.capacity- λͺ¨μ μΈμμ μ΅μ 2λͺ μ΄μμ΄μ΄μΌ ν©λλ€.- κΈ°ν νμ νλ
κ²μ¦ μλ¬ μμ
{
"success": false,
"code": "VALIDATION_ERROR",
"message": "μμ² κ°μ΄ μ ν¨νμ§ μμ΅λλ€.",
"data": {
"deadline": "λ§κ° μκ°μ νμ¬ μκ° μ΄νμ¬μΌ ν©λλ€."
},
"timestamp": "2026-01-29T10:30:00"
}λͺ¨μμ μ 체 μ μ, νμ¬ μ°Έμ¬μ μ, μ°Έμ¬μ λͺ©λ‘μ μ‘°νν©λλ€.
μλν¬μΈνΈ
GET /meeting/{meetingId}/status
μΈμ¦ νμ: β μΈμ νμ
Path Parameters
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| meetingId | UUID | β | λͺ¨μ μλ³μ |
Success Response (200 OK)
{
"success": true,
"data": {
"totalParticipantCount": 10,
"currentParticipantCount": 2,
"deadlineAt": "2026-01-23T23:00:00",
"participants": [
{
"userName": "κΉλ°κΈ",
"stationName": "ꡬλ‘λμ§νΈλ¨μ§μ",
"latitude": 37.485266,
"longitude": 126.901401
},
{
"userName": "μ΄λ°κΈ",
"stationName": "ν©μ μ",
"latitude": 37.549556,
"longitude": 126.913878
}
]
},
"timestamp": "2026-01-29T10:30:00"
}Error Responses
| HTTP Status | Error Code | Message | λ°μ 쑰건 |
|---|---|---|---|
| 401 | USER_UNAUTHORIZED | μ¬μ©μ μΈμ¦μ μ€ν¨νμ΅λλ€. | μΈμ μμ λλ λ§λ£ |
| 404 | MEETING_NOT_FOUND | λͺ¨μμ μ°Ύμ μ μμ΅λλ€. | μ‘΄μ¬νμ§ μλ meetingId |
λͺ¨μ μ°Έμ¬μλ€μ μ€κ°μ§μ ν보λ€μ μ‘°νν©λλ€.
μλν¬μΈνΈ
GET /meeting/{meetingId}/midpoint
μΈμ¦ νμ: β μΈμ νμ
Path Parameters
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| meetingId | UUID | β | λͺ¨μ μλ³μ |
Session Attributes
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| userName | String | β | μΈμ μ μ μ₯λ μ¬μ©μ μ΄λ¦ |
Success Response (200 OK)
{
"success": true,
"data": {
"midpoints": [
{
"name": "ν©μ μ",
"latitude": 37.5484757,
"longitude": 126.912071,
"avgTravelTime": 30,
"transferPath": "2νΈμ > 6νΈμ "
},
{
"name": "μμΈμ",
"latitude": 37.554648,
"longitude": 126.972559,
"avgTravelTime": 35,
"transferPath": "1νΈμ > 4νΈμ "
}
]
},
"timestamp": "2026-01-29T10:30:00"
}Error Responses
| HTTP Status | Error Code | Message | λ°μ 쑰건 |
|---|---|---|---|
| 401 | USER_UNAUTHORIZED | μ¬μ©μ μΈμ¦μ μ€ν¨νμ΅λλ€. | μΈμ μμ λλ λ§λ£ |
| 404 | MEETING_NOT_FOUND | λͺ¨μμ μ°Ύμ μ μμ΅λλ€. | μ‘΄μ¬νμ§ μλ meetingId |
μ€κ°μ§μ κ·Όμ²μ λͺ¨μ λͺ©μ μ λ§λ μ₯μλ₯Ό μΆμ²ν©λλ€.
μλν¬μΈνΈ
GET /meeting/{meetingId}/recommend?midPlace={μ€κ°μ§μ λͺ
}&category={λͺ¨μλͺ©μ }
μΈμ¦ νμ: β μΈμ νμ
Path Parameters
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| meetingId | UUID | β | λͺ¨μ μλ³μ |
Query Parameters
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| midPlace | String | β | μ€κ° μ§μ μ₯μλͺ (μ: "ν©μ μ") |
| category | String | β | λͺ¨μ λͺ©μ (μ: "νμ") |
Success Response (200 OK)
{
"success": true,
"data": [
{
"title": "μΉ΄ν1",
"roadAddress": "μμΈ λμꡬ λμλλ‘..."
},
{
"title": "μΉ΄ν2",
"roadAddress": "μμΈ μμ΄κ΅¬ λ°©λ°°μ²λ‘..."
}
],
"timestamp": "2026-01-29T10:30:00"
}Error Responses
| HTTP Status | Error Code | Message | λ°μ 쑰건 |
|---|---|---|---|
| 401 | USER_UNAUTHORIZED | μ¬μ©μ μΈμ¦μ μ€ν¨νμ΅λλ€. | μΈμ μμ λλ λ§λ£ |
| 404 | MEETING_NOT_FOUND | λͺ¨μμ μ°Ύμ μ μμ΅λλ€. | μ‘΄μ¬νμ§ μλ meetingId |
λͺ¨μ κ²°κ³Ό URLμ μ‘°νν©λλ€.
μλν¬μΈνΈ
GET /meeting/{meetingId}/result
μΈμ¦ νμ: β μΈμ νμ
Path Parameters
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| meetingId | String | β | λͺ¨μ μλ³μ |
Success Response (200 OK)
{
"success": true,
"data": {
"meetingUrl": "https://mingling.com/meeting/62db1c35-f7db-4aad-acc8-0ad64f61a312"
},
"timestamp": "2026-01-29T10:30:00"
}Error Responses
| HTTP Status | Error Code | Message | λ°μ 쑰건 |
|---|---|---|---|
| 401 | USER_UNAUTHORIZED | μ¬μ©μ μΈμ¦μ μ€ν¨νμ΅λλ€. | μΈμ μμ λλ λ§λ£ |
| 404 | MEETING_NOT_FOUND | λͺ¨μμ μ°Ύμ μ μμ΅λλ€. | μ‘΄μ¬νμ§ μλ meetingId |
λλ€μκ³Ό λΉλ°λ²νΈλ‘ λͺ¨μμ μ μ₯ν©λλ€.
μλν¬μΈνΈ
POST /participant/{meetingId}/enter
μΈμ¦ νμ: β μμ (μ΄ APIλ‘ μΈμ μμ±)
Path Parameters
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| meetingId | UUID | β | λͺ¨μ μλ³μ |
Request Body
{
"userId": "μ€μν",
"password": "password123"
}| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| userId | String | β | μ¬μ©μ μ΄λ¦ (λλ€μ) |
| password | String | β | λΉλ°λ²νΈ |
Success Response (200 OK)
{
"success": true,
"data": null,
"timestamp": "2026-01-29T10:30:00"
}Response Headers
Set-Cookie: μΈμ μΏ ν€ ν¬ν¨ (nickname, fakeSessionId)
Error Responses
| HTTP Status | Error Code | Message | λ°μ 쑰건 |
|---|---|---|---|
| 400 | VALIDATION_ERROR | μμ² κ°μ΄ μ ν¨νμ§ μμ΅λλ€. | νμ νλ λλ½ |
| 401 | INVALID_CREDENTIALS | μΈμ¦ μ λ³΄κ° μ¬λ°λ₯΄μ§ μμ΅λλ€. | λλ€μμ μ‘΄μ¬νμ§λ§ λΉλ°λ²νΈ λΆμΌμΉ |
| 404 | MEETING_NOT_FOUND | λͺ¨μμ μ°Ύμ μ μμ΅λλ€. | μ‘΄μ¬νμ§ μλ meetingId |
μ°Έμ¬μμ μΆλ°μμ λ±λ‘ν©λλ€.
μλν¬μΈνΈ
POST /participant/{meetingId}/departure
μΈμ¦ νμ: β μΈμ νμ
Path Parameters
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| meetingId | UUID | β | λͺ¨μ μλ³μ |
Session Attributes
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| nickname | String | β | μΈμ μ μ μ₯λ λλ€μ |
Request Body
{
"nickname": "κΉλ°κΈ",
"departure": "ꡬλ‘λμ§νΈλ¨μ§μ"
}| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| nickname | String | β | μ°Έμ¬μ μ΄λ¦ |
| departure | String | β | μΆλ°μ μ΄λ¦ |
Success Response (200 OK)
{
"success": true,
"data": {
"nickname": "κΉλ°κΈ",
"departure": "ꡬλ‘λμ§νΈλ¨μ§μ",
"latitude": 37.485266,
"longitude": 126.901401
},
"timestamp": "2026-01-29T10:30:00"
}Error Responses
| HTTP Status | Error Code | Message | λ°μ 쑰건 |
|---|---|---|---|
| 400 | VALIDATION_ERROR | μμ² κ°μ΄ μ ν¨νμ§ μμ΅λλ€. | νμ νλ λλ½ |
| 400 | STATION_NOT_FOUND | μ ν¨νμ§ μμ μ μ΄λ¦μ λλ€. | μ‘΄μ¬νμ§ μλ μ μ΄λ¦ |
| 401 | USER_UNAUTHORIZED | μ¬μ©μ μΈμ¦μ μ€ν¨νμ΅λλ€. | μΈμ μμ λλ λ§λ£ |
| 404 | MEETING_NOT_FOUND | λͺ¨μμ μ°Ύμ μ μμ΅λλ€. | μ‘΄μ¬νμ§ μλ meetingId |
| 409 | MEETING_CLOSED | μ΄λ―Έ λ§κ°λ λͺ¨μμ λλ€. | λͺ¨μμ΄ λ§κ°λ μν |
μ°Έμ¬μμ μΆλ°μμ μμ ν©λλ€.
μλν¬μΈνΈ
PATCH /participant/{meetingId}/departure
μΈμ¦ νμ: β μΈμ νμ
Path Parameters
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| meetingId | UUID | β | λͺ¨μ μλ³μ |
Session Attributes
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| nickname | String | β | μΈμ μ μ μ₯λ λλ€μ |
Request Body
{
"departure": "ν©μ μ"
}| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
| departure | String | β | μμ ν μΆλ°μ μ΄λ¦ |
Success Response (200 OK)
{
"success": true,
"data": {
"nickname": "νκΈΈλ",
"departure": "κ°λ¨μ",
"latitude": 37.497942,
"longitude": 127.027621
},
"timestamp": "2026-01-29T10:30:00"
}Error Responses
| HTTP Status | Error Code | Message | λ°μ 쑰건 |
|---|---|---|---|
| 400 | STATION_NOT_FOUND | μ ν¨νμ§ μμ μ μ΄λ¦μ λλ€. | μ‘΄μ¬νμ§ μλ μ μ΄λ¦ |
| 401 | USER_UNAUTHORIZED | μ¬μ©μ μΈμ¦μ μ€ν¨νμ΅λλ€. | μΈμ μμ λλ λ§λ£ |
| 404 | MEETING_NOT_FOUND | λͺ¨μμ μ°Ύμ μ μμ΅λλ€. | μ‘΄μ¬νμ§ μλ meetingId |
| 409 | MEETING_CLOSED | μ΄λ―Έ λ§κ°λ λͺ¨μμ λλ€. | λͺ¨μμ΄ λ§κ°λ μν |
| μλ¬ μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
| BAD_REQUEST | μλͺ»λ μμ²μ λλ€. | μΌλ°μ μΈ μλͺ»λ μμ² |
| VALIDATION_ERROR | μμ² κ°μ΄ μ ν¨νμ§ μμ΅λλ€. | μ λ ₯κ° κ²μ¦ μ€ν¨ (dataμ μμΈ μ 보 ν¬ν¨) |
| PURPOSE_NOT_FOUND | μΌλΆ λͺ¨μ λͺ©μ μ μ°Ύμ μ μμ΅λλ€. | μ μλμ§ μμ λͺ¨μ λͺ©μ ν¬ν¨ |
| STATION_NOT_FOUND | μ ν¨νμ§ μμ μ μ΄λ¦μ λλ€. | μ‘΄μ¬νμ§ μλ μ§νμ² μ |
| μλ¬ μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
| UNAUTHORIZED | μΈμ¦μ΄ νμν©λλ€. | μΈμ¦ μ 보 μμ |
| USER_UNAUTHORIZED | μ¬μ©μ μΈμ¦μ μ€ν¨νμ΅λλ€. | μΈμ μμ λλ λ§λ£ |
| INVALID_CREDENTIALS | μΈμ¦ μ λ³΄κ° μ¬λ°λ₯΄μ§ μμ΅λλ€. | λλ€μ/λΉλ°λ²νΈ λΆμΌμΉ |
| μλ¬ μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
| FORBIDDEN | μ κ·Ό κΆνμ΄ μμ΅λλ€. | κΆν μμ |
| μλ¬ μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
| NOT_FOUND | μμ²ν 리μμ€λ₯Ό μ°Ύμ μ μμ΅λλ€. | μΌλ°μ μΈ λ¦¬μμ€ μμ |
| MEETING_NOT_FOUND | λͺ¨μμ μ°Ύμ μ μμ΅λλ€. | μ‘΄μ¬νμ§ μλ λͺ¨μ ID |
| μλ¬ μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
| CONFLICT | μμ²μ΄ νμ¬ λ¦¬μμ€ μνμ μΆ©λν©λλ€. | μΌλ°μ μΈ μΆ©λ |
| MEETING_CLOSED | μ΄λ―Έ λ§κ°λ λͺ¨μμ λλ€. | λͺ¨μμ΄ λ§κ°λ μν |
| μλ¬ μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
| INTERNAL_SERVER_ERROR | μλ² λ΄λΆ μ€λ₯κ° λ°μνμ΅λλ€. | μλ² μ€λ₯ |
| HOT_PLACE_NOT_FOUND | ν«νλ μ΄μ€ μ 보λ₯Ό μ°Ύμ μ μμ΅λλ€. | ν«νλ μ΄μ€ μ‘°ν μ€ν¨ |
- ISO 8601 νμ μ¬μ©:
YYYY-MM-DDTHH:mm:ss - μμ:
2026-01-30T23:59:59 - μκ°λ: Asia/Seoul (KST)
- νμ€ UUID νμ (36μ)
- μμ:
62db1c35-f7db-4aad-acc8-0ad64f61a312
- μΏ ν€ κΈ°λ° μΈμ
- μΈμ μ ν¨ κΈ°κ°: 7μΌ (60 * 60 * 24 * 7μ΄)
- μΏ ν€ μ΄λ¦:
nickname,fakeSessionId
λͺ¨μ μμ± APIμμ μ¬λ¬ νλμ μλ¬κ° μμ κ²½μ°, λ€μ μ°μ μμλ‘ νλμ μλ¬λ§ λ°νλ©λλ€:
- deadline (λ§κ° μκ°)
- capacity (μ μ)
- κΈ°ν νμ νλ (μμ 무κ΄)
λ§μ§λ§ μ λ°μ΄νΈ: 2026-01-29