Skip to content

Latest commit

 

History

History
581 lines (450 loc) · 14.6 KB

File metadata and controls

581 lines (450 loc) · 14.6 KB

Mingling API 문서 (프론트엔드용)

📋 목차


공통 사항

기본 URL

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는 각 섹션에서 명시

모임 API

1. 모임 생성

새로운 모임을 생성합니다.

엔드포인트

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 일부 모임 목적을 찾을 수 없습니다. 정의되지 않은 목적명 포함

검증 에러 우선순위

  1. deadline - 마감 시간은 현재 시간 이후여야 합니다.
  2. capacity - 모임 인원은 최소 2명 이상이어야 합니다.
  3. 기타 필수 필드

검증 에러 예시

{
    "success": false,
    "code": "VALIDATION_ERROR",
    "message": "요청 값이 유효하지 않습니다.",
    "data": {
        "deadline": "마감 시간은 현재 시간 이후여야 합니다."
    },
    "timestamp": "2026-01-29T10:30:00"
}

2. 모임 참여 현황 조회

모임의 전체 정원, 현재 참여자 수, 참여자 목록을 조회합니다.

엔드포인트

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

3. 중간지점 조회

모임 참여자들의 중간지점 후보들을 조회합니다.

엔드포인트

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

4. 장소 추천

중간지점 근처의 모임 목적에 맞는 장소를 추천합니다.

엔드포인트

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

5. 모임 결과 공유

모임 결과 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

참여자 API

1. 모임 입장

닉네임과 비밀번호로 모임에 입장합니다.

엔드포인트

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

2. 출발역 등록

참여자의 출발역을 등록합니다.

엔드포인트

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 이미 마감된 모임입니다. 모임이 마감된 상태

3. 출발역 수정

참여자의 출발역을 수정합니다.

엔드포인트

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 이미 마감된 모임입니다. 모임이 마감된 상태

에러 코드 전체 목록

400 Bad Request

에러 코드 메시지 설명
BAD_REQUEST 잘못된 요청입니다. 일반적인 잘못된 요청
VALIDATION_ERROR 요청 값이 유효하지 않습니다. 입력값 검증 실패 (data에 상세 정보 포함)
PURPOSE_NOT_FOUND 일부 모임 목적을 찾을 수 없습니다. 정의되지 않은 모임 목적 포함
STATION_NOT_FOUND 유효하지 않은 역 이름입니다. 존재하지 않는 지하철역

401 Unauthorized

에러 코드 메시지 설명
UNAUTHORIZED 인증이 필요합니다. 인증 정보 없음
USER_UNAUTHORIZED 사용자 인증에 실패했습니다. 세션 없음 또는 만료
INVALID_CREDENTIALS 인증 정보가 올바르지 않습니다. 닉네임/비밀번호 불일치

403 Forbidden

에러 코드 메시지 설명
FORBIDDEN 접근 권한이 없습니다. 권한 없음

404 Not Found

에러 코드 메시지 설명
NOT_FOUND 요청한 리소스를 찾을 수 없습니다. 일반적인 리소스 없음
MEETING_NOT_FOUND 모임을 찾을 수 없습니다. 존재하지 않는 모임 ID

409 Conflict

에러 코드 메시지 설명
CONFLICT 요청이 현재 리소스 상태와 충돌합니다. 일반적인 충돌
MEETING_CLOSED 이미 마감된 모임입니다. 모임이 마감된 상태

500 Internal Server Error

에러 코드 메시지 설명
INTERNAL_SERVER_ERROR 서버 내부 오류가 발생했습니다. 서버 오류
HOT_PLACE_NOT_FOUND 핫플레이스 정보를 찾을 수 없습니다. 핫플레이스 조회 실패

참고 사항

DateTime 형식

  • ISO 8601 형식 사용: YYYY-MM-DDTHH:mm:ss
  • 예시: 2026-01-30T23:59:59
  • 시간대: Asia/Seoul (KST)

UUID 형식

  • 표준 UUID 형식 (36자)
  • 예시: 62db1c35-f7db-4aad-acc8-0ad64f61a312

세션 관리

  • 쿠키 기반 세션
  • 세션 유효 기간: 7일 (60 * 60 * 24 * 7초)
  • 쿠키 이름: nickname, fakeSessionId

검증 에러 응답 우선순위

모임 생성 API에서 여러 필드에 에러가 있을 경우, 다음 우선순위로 하나의 에러만 반환됩니다:

  1. deadline (마감 시간)
  2. capacity (정원)
  3. 기타 필수 필드 (순서 무관)

마지막 업데이트: 2026-01-29