유저 (User)

1. 카카오 로그인

Request Example
POST /api/oauth/kakao/login HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 29
Host: localhost:8080

{
  "idToken" : "idToken"
}
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 588

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "user" : {
      "id" : 1,
      "loginId" : "KAKAO_123456789",
      "username" : "ssar",
      "profileUrl" : "http://example.com/profiles/ssar.jpg",
      "height" : 175.0,
      "weight" : 70.0,
      "gender" : "남",
      "location" : "부산광역시",
      "letter" : "안녕하세요, 러닝을 사랑하는 ssar입니다.",
      "provider" : "KAKAO",
      "userTag" : "#A1B2C3",
      "fcmToken" : "token_ssar_123",
      "createdAt" : "2025-05-30 12:00:00"
    },
    "idToken" : "idToken"
  }
}

2. 유저 정보 수정 성공

Request Example
PUT /s/api/users/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 172
Host: localhost:8080

{
  "username" : null,
  "email" : null,
  "profileUrl" : null,
  "height" : 185.0,
  "weight" : 65.5,
  "gender" : "여",
  "location" : null,
  "letter" : null
}
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 384

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 1,
    "username" : "ssar",
    "profileUrl" : "http://example.com/profiles/ssar.jpg",
    "height" : 185.0,
    "weight" : 65.5,
    "gender" : "여",
    "location" : "부산광역시",
    "letter" : "안녕하세요, 러닝을 사랑하는 ssar입니다.",
    "updatedAt" : "2025-07-16 16:34:47"
  }
}

3. 유저 정보 수정 실패 (권한 없음)

Request Example
PUT /s/api/users/2 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 172
Host: localhost:8080

{
  "username" : null,
  "email" : null,
  "profileUrl" : null,
  "height" : 185.0,
  "weight" : 65.5,
  "gender" : "여",
  "location" : null,
  "letter" : null
}
Response Example
HTTP/1.1 403 Forbidden
Content-Type: application/json;charset=UTF-8
Content-Length: 85

{
  "status" : 403,
  "msg" : "접근 권한이 없습니다.",
  "data" : null
}

4. 유저 정보 삭제 성공

Request Example
DELETE /s/api/users/1 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 61

{
  "status" : 200,
  "msg" : "성공",
  "data" : null
}

5. 유저 정보 삭제 실패 (권한 없음)

Request Example
DELETE /s/api/users/10 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 403 Forbidden
Content-Type: application/json;charset=UTF-8
Content-Length: 85

{
  "status" : 403,
  "msg" : "접근 권한이 없습니다.",
  "data" : null
}

6. 유저 상세 조회 성공

Request Example
GET /s/api/users/1 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 733

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "loginId" : "KAKAO_123456789",
    "id" : 1,
    "username" : "ssar",
    "profileUrl" : "http://example.com/profiles/ssar.jpg",
    "height" : 175.0,
    "weight" : 70.0,
    "gender" : "남",
    "location" : "부산광역시",
    "letter" : "안녕하세요, 러닝을 사랑하는 ssar입니다.",
    "userTag" : "#A1B2C3",
    "fcmToken" : "token_ssar_123",
    "runLevel" : {
      "id" : 1,
      "name" : "옐로우",
      "minDistance" : 0,
      "maxDistance" : 49999,
      "description" : "0 ~ 49.99킬로미터",
      "sortOrder" : 0
    },
    "createdAt" : "2025-05-30 12:00:00",
    "updatedAt" : null,
    "isOwner" : true
  }
}

7. 유저 상세 조회 실패 (사용자 없음)

Request Example
GET /s/api/users/10 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 98

{
  "status" : 404,
  "msg" : "해당 사용자를 찾을 수 없습니다",
  "data" : null
}

러닝 기록 (Run Record)

1. 러닝 기록 저장 성공

Request Example
POST /s/api/runs HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 1123
Host: localhost:8080

{
  "title" : "부산 해운대 아침 달리기",
  "calories" : 200,
  "segments" : [ {
    "startDate" : "2025-06-22 06:30:00",
    "endDate" : "2025-06-22 06:37:10",
    "durationSeconds" : 430,
    "distanceMeters" : 1000,
    "coordinates" : [ {
      "lat" : 35.1587,
      "lon" : 129.1604,
      "recordedAt" : "2025-06-22 06:30:00"
    }, {
      "lat" : 35.1595,
      "lon" : 129.1612,
      "recordedAt" : "2025-06-22 06:33:45"
    }, {
      "lat" : 35.1602,
      "lon" : 129.162,
      "recordedAt" : "2025-06-22 06:37:10"
    } ]
  }, {
    "startDate" : "2025-06-22 06:37:11",
    "endDate" : "2025-06-22 06:43:05",
    "durationSeconds" : 354,
    "distanceMeters" : 1000,
    "coordinates" : [ {
      "lat" : 35.161,
      "lon" : 129.1628,
      "recordedAt" : "2025-06-22 06:40:00"
    }, {
      "lat" : 35.1618,
      "lon" : 129.1635,
      "recordedAt" : "2025-06-22 06:43:05"
    } ]
  } ],
  "pictures" : [ {
    "fileUrl" : "http://example.com/profiles/cos.jpg",
    "lat" : 35.1598,
    "lon" : 129.1615,
    "savedAt" : "2025-06-22 06:43:05"
  } ]
}
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 1971

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 17,
    "title" : "부산 해운대 아침 달리기",
    "calories" : 200,
    "totalDistanceMeters" : 2000,
    "totalDurationSeconds" : 784,
    "avgPace" : 392,
    "bestPace" : 354,
    "segments" : [ {
      "id" : 32,
      "startDate" : "2025-06-22 06:30:00",
      "endDate" : "2025-06-22 06:37:10",
      "durationSeconds" : 430,
      "distanceMeters" : 1000,
      "pace" : 430,
      "coordinates" : [ {
        "lat" : 35.1587,
        "lon" : 129.1604,
        "recordedAt" : "2025-06-22 06:30:00"
      }, {
        "lat" : 35.1595,
        "lon" : 129.1612,
        "recordedAt" : "2025-06-22 06:33:45"
      }, {
        "lat" : 35.1602,
        "lon" : 129.162,
        "recordedAt" : "2025-06-22 06:37:10"
      } ]
    }, {
      "id" : 33,
      "startDate" : "2025-06-22 06:37:11",
      "endDate" : "2025-06-22 06:43:05",
      "durationSeconds" : 354,
      "distanceMeters" : 1000,
      "pace" : 354,
      "coordinates" : [ {
        "lat" : 35.161,
        "lon" : 129.1628,
        "recordedAt" : "2025-06-22 06:40:00"
      }, {
        "lat" : 35.1618,
        "lon" : 129.1635,
        "recordedAt" : "2025-06-22 06:43:05"
      } ]
    } ],
    "pictures" : [ {
      "fileUrl" : "http://example.com/profiles/cos.jpg",
      "lat" : 35.1598,
      "lon" : 129.1615,
      "savedAt" : "2025-06-22 06:43:05"
    } ],
    "createdAt" : "2025-07-16 16:34:46",
    "userId" : 1,
    "badges" : [ {
      "id" : 2,
      "name" : "1K 최고 기록",
      "description" : "나의 1,000미터 최고 기록",
      "imageUrl" : "https://example.com/badges/1k_best.png",
      "type" : "최고기록",
      "achievedAt" : "2025-07-16 16:34:46",
      "runRecordDistance" : 2000,
      "runRecordSeconds" : 784,
      "runRecordPace" : 392,
      "isAchieved" : true,
      "achievedCount" : null
    } ]
  }
}

2. 러닝 기록 저장 실패 (제목 없음)

Request Example
POST /s/api/runs HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 1092
Host: localhost:8080

{
  "title" : null,
  "calories" : 200,
  "segments" : [ {
    "startDate" : "2025-06-22 06:30:00",
    "endDate" : "2025-06-22 06:37:10",
    "durationSeconds" : 430,
    "distanceMeters" : 1000,
    "coordinates" : [ {
      "lat" : 35.1587,
      "lon" : 129.1604,
      "recordedAt" : "2025-06-22 06:30:00"
    }, {
      "lat" : 35.1595,
      "lon" : 129.1612,
      "recordedAt" : "2025-06-22 06:33:45"
    }, {
      "lat" : 35.1602,
      "lon" : 129.162,
      "recordedAt" : "2025-06-22 06:37:10"
    } ]
  }, {
    "startDate" : "2025-06-22 06:37:11",
    "endDate" : "2025-06-22 06:43:05",
    "durationSeconds" : 354,
    "distanceMeters" : 1000,
    "coordinates" : [ {
      "lat" : 35.161,
      "lon" : 129.1628,
      "recordedAt" : "2025-06-22 06:40:00"
    }, {
      "lat" : 35.1618,
      "lon" : 129.1635,
      "recordedAt" : "2025-06-22 06:43:05"
    } ]
  } ],
  "pictures" : [ {
    "fileUrl" : "http://example.com/profiles/cos.jpg",
    "lat" : 35.1598,
    "lon" : 129.1615,
    "savedAt" : "2025-06-22 06:43:05"
  } ]
}
Response Example
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Content-Length: 103

{
  "status" : 400,
  "msg" : "title : 제목은 필수 입력 항목입니다.",
  "data" : null
}

3. 러닝 기록 상세 조회 성공

Request Example
GET /s/api/runs/1 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 3905

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 1,
    "title" : "부산 서면역 15번 출구 100m 러닝",
    "memo" : "서면역 15번 출구에서 NC백화점 방향으로 100m 직선 러닝",
    "calories" : 10,
    "totalDistanceMeters" : 100,
    "totalDurationSeconds" : 50,
    "elapsedTimeInSeconds" : 50,
    "avgPace" : 500,
    "bestPace" : 500,
    "userId" : 1,
    "segments" : [ {
      "id" : 1,
      "startDate" : "2025-06-20 09:00:00",
      "endDate" : "2025-06-20 09:00:50",
      "durationSeconds" : 50,
      "distanceMeters" : 100,
      "pace" : 500,
      "coordinates" : [ {
        "lat" : 35.1579,
        "lon" : 129.0594,
        "recordedAt" : "2025-06-20 09:00:00"
      }, {
        "lat" : 35.1579,
        "lon" : 129.05944545,
        "recordedAt" : "2025-06-20 09:00:02"
      }, {
        "lat" : 35.1579,
        "lon" : 129.05949091,
        "recordedAt" : "2025-06-20 09:00:04"
      }, {
        "lat" : 35.1579,
        "lon" : 129.05953636,
        "recordedAt" : "2025-06-20 09:00:06"
      }, {
        "lat" : 35.1579,
        "lon" : 129.05958182,
        "recordedAt" : "2025-06-20 09:00:08"
      }, {
        "lat" : 35.1579,
        "lon" : 129.05962727,
        "recordedAt" : "2025-06-20 09:00:10"
      }, {
        "lat" : 35.1579,
        "lon" : 129.05967273,
        "recordedAt" : "2025-06-20 09:00:12"
      }, {
        "lat" : 35.1579,
        "lon" : 129.05971818,
        "recordedAt" : "2025-06-20 09:00:14"
      }, {
        "lat" : 35.1579,
        "lon" : 129.05976364,
        "recordedAt" : "2025-06-20 09:00:16"
      }, {
        "lat" : 35.1579,
        "lon" : 129.05980909,
        "recordedAt" : "2025-06-20 09:00:18"
      }, {
        "lat" : 35.1579,
        "lon" : 129.05985455,
        "recordedAt" : "2025-06-20 09:00:20"
      }, {
        "lat" : 35.1579,
        "lon" : 129.0599,
        "recordedAt" : "2025-06-20 09:00:22"
      }, {
        "lat" : 35.1579,
        "lon" : 129.05994545,
        "recordedAt" : "2025-06-20 09:00:24"
      }, {
        "lat" : 35.1579,
        "lon" : 129.05999091,
        "recordedAt" : "2025-06-20 09:00:26"
      }, {
        "lat" : 35.1579,
        "lon" : 129.06003636,
        "recordedAt" : "2025-06-20 09:00:28"
      }, {
        "lat" : 35.1579,
        "lon" : 129.06008182,
        "recordedAt" : "2025-06-20 09:00:30"
      }, {
        "lat" : 35.1579,
        "lon" : 129.06012727,
        "recordedAt" : "2025-06-20 09:00:32"
      }, {
        "lat" : 35.1579,
        "lon" : 129.06017273,
        "recordedAt" : "2025-06-20 09:00:34"
      }, {
        "lat" : 35.1579,
        "lon" : 129.06021818,
        "recordedAt" : "2025-06-20 09:00:36"
      }, {
        "lat" : 35.1579,
        "lon" : 129.06026364,
        "recordedAt" : "2025-06-20 09:00:38"
      }, {
        "lat" : 35.1579,
        "lon" : 129.06030909,
        "recordedAt" : "2025-06-20 09:00:40"
      }, {
        "lat" : 35.1579,
        "lon" : 129.06035455,
        "recordedAt" : "2025-06-20 09:00:42"
      }, {
        "lat" : 35.1579,
        "lon" : 129.0604,
        "recordedAt" : "2025-06-20 09:00:44"
      }, {
        "lat" : 35.1579,
        "lon" : 129.06044545,
        "recordedAt" : "2025-06-20 09:00:46"
      }, {
        "lat" : 35.1579,
        "lon" : 129.06049091,
        "recordedAt" : "2025-06-20 09:00:48"
      }, {
        "lat" : 35.1579,
        "lon" : 129.06053636,
        "recordedAt" : "2025-06-20 09:00:50"
      } ]
    } ],
    "pictures" : [ {
      "fileUrl" : "https://example.com/images/run1.jpg",
      "lat" : 37.5665,
      "lon" : 126.978,
      "savedAt" : "2025-07-01 08:30:00"
    } ],
    "createdAt" : "2025-06-20 09:00:50",
    "intensity" : 3,
    "place" : "도로"
  }
}

4. 러닝 기록 수정 성공

Request Example
PUT /s/api/runs/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 105
Host: localhost:8080

{
  "title" : "수정 확인",
  "memo" : "수정 확인",
  "intensity" : 1,
  "place" : "트랙"
}
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 187

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 1,
    "title" : "수정 확인",
    "memo" : "수정 확인",
    "intensity" : 1,
    "place" : "트랙"
  }
}

5. 러닝 기록 수정 실패 (권한 없음)

Request Example
PUT /s/api/runs/2 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 105
Host: localhost:8080

{
  "title" : "수정 확인",
  "memo" : "수정 확인",
  "intensity" : 1,
  "place" : "트랙"
}
Response Example
HTTP/1.1 403 Forbidden
Content-Type: application/json;charset=UTF-8
Content-Length: 85

{
  "status" : 403,
  "msg" : "접근 권한이 없습니다.",
  "data" : null
}

6. 러닝 기록 삭제 성공

Request Example
DELETE /s/api/runs/1 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 61

{
  "status" : 200,
  "msg" : "성공",
  "data" : null
}

7. 러닝 기록 삭제 실패 (기록 없음)

Request Example
DELETE /s/api/runs/111 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 95

{
  "status" : 404,
  "msg" : "해당 러닝을 찾을 수 없습니다",
  "data" : null
}

활동 (Activities)

1. 활동 요약 조회 (주간)

Request Example
GET /s/api/activities/week HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 2520

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "avgStats" : {
      "recodeCount" : 2,
      "avgPace" : 348,
      "totalDistanceMeters" : 7400,
      "totalDurationSeconds" : 2580
    },
    "achievementHistory" : [ {
      "type" : "챌린지 수상자",
      "name" : "금메달",
      "description" : "챌린지에서 1위를 달성하셨습니다!",
      "imageUrl" : "https://example.com/rewards/gold.png",
      "achievedAt" : "2025-06-16 00:01:00",
      "achievedCount" : 1,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : true
    }, {
      "type" : "챌린지 우승자",
      "name" : "완주자",
      "description" : "챌린지를 완료하셨습니다!",
      "imageUrl" : "https://example.com/rewards/participation.png",
      "achievedAt" : "2025-06-14 10:00:00",
      "achievedCount" : 1,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : true
    }, {
      "type" : "월간업적",
      "name" : "첫 시작",
      "description" : "매달 첫 러닝을 완료했어요!",
      "imageUrl" : "https://example.com/badges/first_run.png",
      "achievedAt" : "2025-03-15 10:00:00",
      "achievedCount" : 4,
      "runRecordDistance" : 600,
      "runRecordSeconds" : 270,
      "runRecordPace" : 450,
      "isAchieved" : true
    } ],
    "recentRuns" : [ {
      "id" : 16,
      "title" : "트랙 러닝 15",
      "totalDistanceMeters" : 1900,
      "totalDurationSeconds" : 660,
      "avgPace" : 347,
      "createdAt" : "2025-06-24 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 15,
      "title" : "트레일 러닝 14",
      "totalDistanceMeters" : 1800,
      "totalDurationSeconds" : 630,
      "avgPace" : 350,
      "createdAt" : "2025-06-23 00:00:00",
      "badges" : [ {
        "id" : 1,
        "name" : "첫 시작",
        "imageUrl" : "https://example.com/badges/first_run.png"
      } ]
    }, {
      "id" : 14,
      "title" : "6월 러닝 13",
      "totalDistanceMeters" : 1700,
      "totalDurationSeconds" : 600,
      "avgPace" : 352,
      "createdAt" : "2025-06-22 00:00:00",
      "badges" : [ ]
    } ],
    "runLevel" : {
      "totalDistance" : 17600,
      "distanceToNextLevel" : 32400,
      "name" : "옐로우"
    },
    "weeks" : {
      "2025-06" : [ "06.09~06.15", "06.16~06.22", "06.23~06.29" ]
    }
  }
}

2. 활동 요약 조회 (월간)

Request Example
GET /s/api/activities/month HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 2504

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "avgStats" : {
      "recodeCount" : 15,
      "avgPace" : 372,
      "totalDistanceMeters" : 35200,
      "totalDurationSeconds" : 13120
    },
    "achievementHistory" : [ {
      "type" : "챌린지 수상자",
      "name" : "금메달",
      "description" : "챌린지에서 1위를 달성하셨습니다!",
      "imageUrl" : "https://example.com/rewards/gold.png",
      "achievedAt" : "2025-06-16 00:01:00",
      "achievedCount" : 1,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : true
    }, {
      "type" : "챌린지 우승자",
      "name" : "완주자",
      "description" : "챌린지를 완료하셨습니다!",
      "imageUrl" : "https://example.com/rewards/participation.png",
      "achievedAt" : "2025-06-14 10:00:00",
      "achievedCount" : 1,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : true
    }, {
      "type" : "월간업적",
      "name" : "첫 시작",
      "description" : "매달 첫 러닝을 완료했어요!",
      "imageUrl" : "https://example.com/badges/first_run.png",
      "achievedAt" : "2025-03-15 10:00:00",
      "achievedCount" : 4,
      "runRecordDistance" : 600,
      "runRecordSeconds" : 270,
      "runRecordPace" : 450,
      "isAchieved" : true
    } ],
    "recentRuns" : [ {
      "id" : 16,
      "title" : "트랙 러닝 15",
      "totalDistanceMeters" : 1900,
      "totalDurationSeconds" : 660,
      "avgPace" : 347,
      "createdAt" : "2025-06-24 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 15,
      "title" : "트레일 러닝 14",
      "totalDistanceMeters" : 1800,
      "totalDurationSeconds" : 630,
      "avgPace" : 350,
      "createdAt" : "2025-06-23 00:00:00",
      "badges" : [ {
        "id" : 1,
        "name" : "첫 시작",
        "imageUrl" : "https://example.com/badges/first_run.png"
      } ]
    }, {
      "id" : 14,
      "title" : "6월 러닝 13",
      "totalDistanceMeters" : 1700,
      "totalDurationSeconds" : 600,
      "avgPace" : 352,
      "createdAt" : "2025-06-22 00:00:00",
      "badges" : [ ]
    } ],
    "runLevel" : {
      "totalDistance" : 17600,
      "distanceToNextLevel" : 32400,
      "name" : "옐로우"
    },
    "years" : [ 2025 ],
    "mounts" : {
      "2025" : [ 6 ]
    }
  }
}

3. 활동 요약 조회 (연간)

Request Example
GET /s/api/activities/year HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 2623

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "avgStats" : {
      "recodeCount" : 15,
      "avgPace" : 372,
      "totalDistanceMeters" : 35200,
      "totalDurationSeconds" : 13120
    },
    "totalStats" : {
      "runCountPerWeek" : 0.2,
      "avgPace" : 372,
      "avgDistanceMetersPerRun" : 1173,
      "avgDurationSecondsPerRun" : 437
    },
    "achievementHistory" : [ {
      "type" : "챌린지 수상자",
      "name" : "금메달",
      "description" : "챌린지에서 1위를 달성하셨습니다!",
      "imageUrl" : "https://example.com/rewards/gold.png",
      "achievedAt" : "2025-06-16 00:01:00",
      "achievedCount" : 1,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : true
    }, {
      "type" : "챌린지 우승자",
      "name" : "완주자",
      "description" : "챌린지를 완료하셨습니다!",
      "imageUrl" : "https://example.com/rewards/participation.png",
      "achievedAt" : "2025-06-14 10:00:00",
      "achievedCount" : 1,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : true
    }, {
      "type" : "월간업적",
      "name" : "첫 시작",
      "description" : "매달 첫 러닝을 완료했어요!",
      "imageUrl" : "https://example.com/badges/first_run.png",
      "achievedAt" : "2025-03-15 10:00:00",
      "achievedCount" : 4,
      "runRecordDistance" : 600,
      "runRecordSeconds" : 270,
      "runRecordPace" : 450,
      "isAchieved" : true
    } ],
    "recentRuns" : [ {
      "id" : 16,
      "title" : "트랙 러닝 15",
      "totalDistanceMeters" : 1900,
      "totalDurationSeconds" : 660,
      "avgPace" : 347,
      "createdAt" : "2025-06-24 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 15,
      "title" : "트레일 러닝 14",
      "totalDistanceMeters" : 1800,
      "totalDurationSeconds" : 630,
      "avgPace" : 350,
      "createdAt" : "2025-06-23 00:00:00",
      "badges" : [ {
        "id" : 1,
        "name" : "첫 시작",
        "imageUrl" : "https://example.com/badges/first_run.png"
      } ]
    }, {
      "id" : 14,
      "title" : "6월 러닝 13",
      "totalDistanceMeters" : 1700,
      "totalDurationSeconds" : 600,
      "avgPace" : 352,
      "createdAt" : "2025-06-22 00:00:00",
      "badges" : [ ]
    } ],
    "runLevel" : {
      "totalDistance" : 17600,
      "distanceToNextLevel" : 32400,
      "name" : "옐로우"
    },
    "years" : [ 2025 ]
  }
}

4. 활동 요약 조회 (전체)

Request Example
GET /s/api/activities/all HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 2597

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "avgStats" : {
      "recodeCount" : 15,
      "avgPace" : 372,
      "totalDistanceMeters" : 17600,
      "totalDurationSeconds" : 6560
    },
    "totalStats" : {
      "runCountPerWeek" : 5.0,
      "avgPace" : 372,
      "avgDistanceMetersPerRun" : 1173,
      "avgDurationSecondsPerRun" : 437
    },
    "achievementHistory" : [ {
      "type" : "챌린지 수상자",
      "name" : "금메달",
      "description" : "챌린지에서 1위를 달성하셨습니다!",
      "imageUrl" : "https://example.com/rewards/gold.png",
      "achievedAt" : "2025-06-16 00:01:00",
      "achievedCount" : 1,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : true
    }, {
      "type" : "챌린지 우승자",
      "name" : "완주자",
      "description" : "챌린지를 완료하셨습니다!",
      "imageUrl" : "https://example.com/rewards/participation.png",
      "achievedAt" : "2025-06-14 10:00:00",
      "achievedCount" : 1,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : true
    }, {
      "type" : "월간업적",
      "name" : "첫 시작",
      "description" : "매달 첫 러닝을 완료했어요!",
      "imageUrl" : "https://example.com/badges/first_run.png",
      "achievedAt" : "2025-03-15 10:00:00",
      "achievedCount" : 4,
      "runRecordDistance" : 600,
      "runRecordSeconds" : 270,
      "runRecordPace" : 450,
      "isAchieved" : true
    } ],
    "recentRuns" : [ {
      "id" : 16,
      "title" : "트랙 러닝 15",
      "totalDistanceMeters" : 1900,
      "totalDurationSeconds" : 660,
      "avgPace" : 347,
      "createdAt" : "2025-06-24 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 15,
      "title" : "트레일 러닝 14",
      "totalDistanceMeters" : 1800,
      "totalDurationSeconds" : 630,
      "avgPace" : 350,
      "createdAt" : "2025-06-23 00:00:00",
      "badges" : [ {
        "id" : 1,
        "name" : "첫 시작",
        "imageUrl" : "https://example.com/badges/first_run.png"
      } ]
    }, {
      "id" : 14,
      "title" : "6월 러닝 13",
      "totalDistanceMeters" : 1700,
      "totalDurationSeconds" : 600,
      "avgPace" : 352,
      "createdAt" : "2025-06-22 00:00:00",
      "badges" : [ ]
    } ],
    "runLevel" : {
      "totalDistance" : 17600,
      "distanceToNextLevel" : 32400,
      "name" : "옐로우"
    }
  }
}

5. 최근 활동 목록 조회 - 최신순

Request Example
GET /s/api/activities/recent HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 4600

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "groupedRecentList" : [ {
      "yearMonth" : "2025-06-01 00:00:00",
      "avgStats" : {
        "recodeCount" : 15,
        "avgPace" : 372,
        "totalDistanceMeters" : 17600,
        "totalDurationSeconds" : 6560
      },
      "recentRuns" : [ {
        "id" : 16,
        "title" : "트랙 러닝 15",
        "totalDistanceMeters" : 1900,
        "totalDurationSeconds" : 660,
        "avgPace" : 347,
        "createdAt" : "2025-06-24 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 15,
        "title" : "트레일 러닝 14",
        "totalDistanceMeters" : 1800,
        "totalDurationSeconds" : 630,
        "avgPace" : 350,
        "createdAt" : "2025-06-23 00:00:00",
        "badges" : [ {
          "id" : 1,
          "name" : "첫 시작",
          "imageUrl" : "https://example.com/badges/first_run.png"
        } ]
      }, {
        "id" : 14,
        "title" : "6월 러닝 13",
        "totalDistanceMeters" : 1700,
        "totalDurationSeconds" : 600,
        "avgPace" : 352,
        "createdAt" : "2025-06-22 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 13,
        "title" : "두번째 러닝 12",
        "totalDistanceMeters" : 1600,
        "totalDurationSeconds" : 570,
        "avgPace" : 356,
        "createdAt" : "2025-06-21 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 1,
        "title" : "부산 서면역 15번 출구 100m 러닝",
        "totalDistanceMeters" : 100,
        "totalDurationSeconds" : 50,
        "avgPace" : 500,
        "createdAt" : "2025-06-20 09:00:50",
        "badges" : [ {
          "id" : 1,
          "name" : "첫 시작",
          "imageUrl" : "https://example.com/badges/first_run.png"
        } ]
      }, {
        "id" : 12,
        "title" : "테스트 러닝 11",
        "totalDistanceMeters" : 1500,
        "totalDurationSeconds" : 540,
        "avgPace" : 360,
        "createdAt" : "2025-06-20 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 11,
        "title" : "롱 러닝 10",
        "totalDistanceMeters" : 1400,
        "totalDurationSeconds" : 510,
        "avgPace" : 364,
        "createdAt" : "2025-06-19 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 10,
        "title" : "인터벌 러닝 9",
        "totalDistanceMeters" : 1300,
        "totalDurationSeconds" : 480,
        "avgPace" : 369,
        "createdAt" : "2025-06-18 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 9,
        "title" : "지구력 러닝 8",
        "totalDistanceMeters" : 1200,
        "totalDurationSeconds" : 450,
        "avgPace" : 375,
        "createdAt" : "2025-06-17 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 8,
        "title" : "스피드 러닝 7",
        "totalDistanceMeters" : 1100,
        "totalDurationSeconds" : 420,
        "avgPace" : 381,
        "createdAt" : "2025-06-16 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 7,
        "title" : "로드 러닝 6",
        "totalDistanceMeters" : 1000,
        "totalDurationSeconds" : 390,
        "avgPace" : 390,
        "createdAt" : "2025-06-15 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 6,
        "title" : "트랙 러닝 5",
        "totalDistanceMeters" : 900,
        "totalDurationSeconds" : 360,
        "avgPace" : 400,
        "createdAt" : "2025-06-14 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 5,
        "title" : "트레일 러닝 4",
        "totalDistanceMeters" : 800,
        "totalDurationSeconds" : 330,
        "avgPace" : 412,
        "createdAt" : "2025-06-13 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 4,
        "title" : "6월 러닝 3",
        "totalDistanceMeters" : 700,
        "totalDurationSeconds" : 300,
        "avgPace" : 428,
        "createdAt" : "2025-06-12 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 3,
        "title" : "두번째 러닝 2",
        "totalDistanceMeters" : 600,
        "totalDurationSeconds" : 270,
        "avgPace" : 450,
        "createdAt" : "2025-06-11 00:00:00",
        "badges" : [ {
          "id" : 1,
          "name" : "첫 시작",
          "imageUrl" : "https://example.com/badges/first_run.png"
        } ]
      } ]
    } ],
    "page" : {
      "totalCount" : 1,
      "current" : 1,
      "size" : 3,
      "totalPage" : 1,
      "isFirst" : true,
      "isLast" : true
    }
  }
}

6. 최근 활동 목록 조회 - 오래된 순

Request Example
GET /s/api/activities/recent?order=oldest HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 4600

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "groupedRecentList" : [ {
      "yearMonth" : "2025-06-01 00:00:00",
      "avgStats" : {
        "recodeCount" : 15,
        "avgPace" : 372,
        "totalDistanceMeters" : 17600,
        "totalDurationSeconds" : 6560
      },
      "recentRuns" : [ {
        "id" : 3,
        "title" : "두번째 러닝 2",
        "totalDistanceMeters" : 600,
        "totalDurationSeconds" : 270,
        "avgPace" : 450,
        "createdAt" : "2025-06-11 00:00:00",
        "badges" : [ {
          "id" : 1,
          "name" : "첫 시작",
          "imageUrl" : "https://example.com/badges/first_run.png"
        } ]
      }, {
        "id" : 4,
        "title" : "6월 러닝 3",
        "totalDistanceMeters" : 700,
        "totalDurationSeconds" : 300,
        "avgPace" : 428,
        "createdAt" : "2025-06-12 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 5,
        "title" : "트레일 러닝 4",
        "totalDistanceMeters" : 800,
        "totalDurationSeconds" : 330,
        "avgPace" : 412,
        "createdAt" : "2025-06-13 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 6,
        "title" : "트랙 러닝 5",
        "totalDistanceMeters" : 900,
        "totalDurationSeconds" : 360,
        "avgPace" : 400,
        "createdAt" : "2025-06-14 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 7,
        "title" : "로드 러닝 6",
        "totalDistanceMeters" : 1000,
        "totalDurationSeconds" : 390,
        "avgPace" : 390,
        "createdAt" : "2025-06-15 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 8,
        "title" : "스피드 러닝 7",
        "totalDistanceMeters" : 1100,
        "totalDurationSeconds" : 420,
        "avgPace" : 381,
        "createdAt" : "2025-06-16 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 9,
        "title" : "지구력 러닝 8",
        "totalDistanceMeters" : 1200,
        "totalDurationSeconds" : 450,
        "avgPace" : 375,
        "createdAt" : "2025-06-17 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 10,
        "title" : "인터벌 러닝 9",
        "totalDistanceMeters" : 1300,
        "totalDurationSeconds" : 480,
        "avgPace" : 369,
        "createdAt" : "2025-06-18 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 11,
        "title" : "롱 러닝 10",
        "totalDistanceMeters" : 1400,
        "totalDurationSeconds" : 510,
        "avgPace" : 364,
        "createdAt" : "2025-06-19 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 12,
        "title" : "테스트 러닝 11",
        "totalDistanceMeters" : 1500,
        "totalDurationSeconds" : 540,
        "avgPace" : 360,
        "createdAt" : "2025-06-20 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 1,
        "title" : "부산 서면역 15번 출구 100m 러닝",
        "totalDistanceMeters" : 100,
        "totalDurationSeconds" : 50,
        "avgPace" : 500,
        "createdAt" : "2025-06-20 09:00:50",
        "badges" : [ {
          "id" : 1,
          "name" : "첫 시작",
          "imageUrl" : "https://example.com/badges/first_run.png"
        } ]
      }, {
        "id" : 13,
        "title" : "두번째 러닝 12",
        "totalDistanceMeters" : 1600,
        "totalDurationSeconds" : 570,
        "avgPace" : 356,
        "createdAt" : "2025-06-21 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 14,
        "title" : "6월 러닝 13",
        "totalDistanceMeters" : 1700,
        "totalDurationSeconds" : 600,
        "avgPace" : 352,
        "createdAt" : "2025-06-22 00:00:00",
        "badges" : [ ]
      }, {
        "id" : 15,
        "title" : "트레일 러닝 14",
        "totalDistanceMeters" : 1800,
        "totalDurationSeconds" : 630,
        "avgPace" : 350,
        "createdAt" : "2025-06-23 00:00:00",
        "badges" : [ {
          "id" : 1,
          "name" : "첫 시작",
          "imageUrl" : "https://example.com/badges/first_run.png"
        } ]
      }, {
        "id" : 16,
        "title" : "트랙 러닝 15",
        "totalDistanceMeters" : 1900,
        "totalDurationSeconds" : 660,
        "avgPace" : 347,
        "createdAt" : "2025-06-24 00:00:00",
        "badges" : [ ]
      } ]
    } ],
    "page" : {
      "totalCount" : 1,
      "current" : 1,
      "size" : 3,
      "totalPage" : 1,
      "isFirst" : true,
      "isLast" : true
    }
  }
}

7. 최근 활동 목록 조회 - 최장 거리 순

Request Example
GET /s/api/activities/recent?order=distance-desc HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 2673

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "recentList" : [ {
      "id" : 16,
      "title" : "트랙 러닝 15",
      "totalDistanceMeters" : 1900,
      "totalDurationSeconds" : 660,
      "avgPace" : 347,
      "createdAt" : "2025-06-24 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 15,
      "title" : "트레일 러닝 14",
      "totalDistanceMeters" : 1800,
      "totalDurationSeconds" : 630,
      "avgPace" : 350,
      "createdAt" : "2025-06-23 00:00:00",
      "badges" : [ {
        "id" : 1,
        "name" : "첫 시작",
        "imageUrl" : "https://example.com/badges/first_run.png"
      } ]
    }, {
      "id" : 14,
      "title" : "6월 러닝 13",
      "totalDistanceMeters" : 1700,
      "totalDurationSeconds" : 600,
      "avgPace" : 352,
      "createdAt" : "2025-06-22 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 13,
      "title" : "두번째 러닝 12",
      "totalDistanceMeters" : 1600,
      "totalDurationSeconds" : 570,
      "avgPace" : 356,
      "createdAt" : "2025-06-21 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 12,
      "title" : "테스트 러닝 11",
      "totalDistanceMeters" : 1500,
      "totalDurationSeconds" : 540,
      "avgPace" : 360,
      "createdAt" : "2025-06-20 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 11,
      "title" : "롱 러닝 10",
      "totalDistanceMeters" : 1400,
      "totalDurationSeconds" : 510,
      "avgPace" : 364,
      "createdAt" : "2025-06-19 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 10,
      "title" : "인터벌 러닝 9",
      "totalDistanceMeters" : 1300,
      "totalDurationSeconds" : 480,
      "avgPace" : 369,
      "createdAt" : "2025-06-18 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 9,
      "title" : "지구력 러닝 8",
      "totalDistanceMeters" : 1200,
      "totalDurationSeconds" : 450,
      "avgPace" : 375,
      "createdAt" : "2025-06-17 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 8,
      "title" : "스피드 러닝 7",
      "totalDistanceMeters" : 1100,
      "totalDurationSeconds" : 420,
      "avgPace" : 381,
      "createdAt" : "2025-06-16 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 7,
      "title" : "로드 러닝 6",
      "totalDistanceMeters" : 1000,
      "totalDurationSeconds" : 390,
      "avgPace" : 390,
      "createdAt" : "2025-06-15 00:00:00",
      "badges" : [ ]
    } ],
    "page" : {
      "totalCount" : 15,
      "current" : 1,
      "size" : 3,
      "totalPage" : 5,
      "isFirst" : true,
      "isLast" : false
    }
  }
}

8. 최근 활동 목록 조회 - 최단 거리 순

Request Example
GET /s/api/activities/recent?order=distance-asc HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 2807

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "recentList" : [ {
      "id" : 1,
      "title" : "부산 서면역 15번 출구 100m 러닝",
      "totalDistanceMeters" : 100,
      "totalDurationSeconds" : 50,
      "avgPace" : 500,
      "createdAt" : "2025-06-20 09:00:50",
      "badges" : [ {
        "id" : 1,
        "name" : "첫 시작",
        "imageUrl" : "https://example.com/badges/first_run.png"
      } ]
    }, {
      "id" : 3,
      "title" : "두번째 러닝 2",
      "totalDistanceMeters" : 600,
      "totalDurationSeconds" : 270,
      "avgPace" : 450,
      "createdAt" : "2025-06-11 00:00:00",
      "badges" : [ {
        "id" : 1,
        "name" : "첫 시작",
        "imageUrl" : "https://example.com/badges/first_run.png"
      } ]
    }, {
      "id" : 4,
      "title" : "6월 러닝 3",
      "totalDistanceMeters" : 700,
      "totalDurationSeconds" : 300,
      "avgPace" : 428,
      "createdAt" : "2025-06-12 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 5,
      "title" : "트레일 러닝 4",
      "totalDistanceMeters" : 800,
      "totalDurationSeconds" : 330,
      "avgPace" : 412,
      "createdAt" : "2025-06-13 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 6,
      "title" : "트랙 러닝 5",
      "totalDistanceMeters" : 900,
      "totalDurationSeconds" : 360,
      "avgPace" : 400,
      "createdAt" : "2025-06-14 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 7,
      "title" : "로드 러닝 6",
      "totalDistanceMeters" : 1000,
      "totalDurationSeconds" : 390,
      "avgPace" : 390,
      "createdAt" : "2025-06-15 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 8,
      "title" : "스피드 러닝 7",
      "totalDistanceMeters" : 1100,
      "totalDurationSeconds" : 420,
      "avgPace" : 381,
      "createdAt" : "2025-06-16 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 9,
      "title" : "지구력 러닝 8",
      "totalDistanceMeters" : 1200,
      "totalDurationSeconds" : 450,
      "avgPace" : 375,
      "createdAt" : "2025-06-17 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 10,
      "title" : "인터벌 러닝 9",
      "totalDistanceMeters" : 1300,
      "totalDurationSeconds" : 480,
      "avgPace" : 369,
      "createdAt" : "2025-06-18 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 11,
      "title" : "롱 러닝 10",
      "totalDistanceMeters" : 1400,
      "totalDurationSeconds" : 510,
      "avgPace" : 364,
      "createdAt" : "2025-06-19 00:00:00",
      "badges" : [ ]
    } ],
    "page" : {
      "totalCount" : 15,
      "current" : 1,
      "size" : 3,
      "totalPage" : 5,
      "isFirst" : true,
      "isLast" : false
    }
  }
}

9. 최근 활동 목록 조회 - 최저 페이스 순

Request Example
GET /s/api/activities/recent?order=pace-desc HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 2807

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "recentList" : [ {
      "id" : 1,
      "title" : "부산 서면역 15번 출구 100m 러닝",
      "totalDistanceMeters" : 100,
      "totalDurationSeconds" : 50,
      "avgPace" : 500,
      "createdAt" : "2025-06-20 09:00:50",
      "badges" : [ {
        "id" : 1,
        "name" : "첫 시작",
        "imageUrl" : "https://example.com/badges/first_run.png"
      } ]
    }, {
      "id" : 3,
      "title" : "두번째 러닝 2",
      "totalDistanceMeters" : 600,
      "totalDurationSeconds" : 270,
      "avgPace" : 450,
      "createdAt" : "2025-06-11 00:00:00",
      "badges" : [ {
        "id" : 1,
        "name" : "첫 시작",
        "imageUrl" : "https://example.com/badges/first_run.png"
      } ]
    }, {
      "id" : 4,
      "title" : "6월 러닝 3",
      "totalDistanceMeters" : 700,
      "totalDurationSeconds" : 300,
      "avgPace" : 428,
      "createdAt" : "2025-06-12 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 5,
      "title" : "트레일 러닝 4",
      "totalDistanceMeters" : 800,
      "totalDurationSeconds" : 330,
      "avgPace" : 412,
      "createdAt" : "2025-06-13 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 6,
      "title" : "트랙 러닝 5",
      "totalDistanceMeters" : 900,
      "totalDurationSeconds" : 360,
      "avgPace" : 400,
      "createdAt" : "2025-06-14 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 7,
      "title" : "로드 러닝 6",
      "totalDistanceMeters" : 1000,
      "totalDurationSeconds" : 390,
      "avgPace" : 390,
      "createdAt" : "2025-06-15 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 8,
      "title" : "스피드 러닝 7",
      "totalDistanceMeters" : 1100,
      "totalDurationSeconds" : 420,
      "avgPace" : 381,
      "createdAt" : "2025-06-16 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 9,
      "title" : "지구력 러닝 8",
      "totalDistanceMeters" : 1200,
      "totalDurationSeconds" : 450,
      "avgPace" : 375,
      "createdAt" : "2025-06-17 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 10,
      "title" : "인터벌 러닝 9",
      "totalDistanceMeters" : 1300,
      "totalDurationSeconds" : 480,
      "avgPace" : 369,
      "createdAt" : "2025-06-18 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 11,
      "title" : "롱 러닝 10",
      "totalDistanceMeters" : 1400,
      "totalDurationSeconds" : 510,
      "avgPace" : 364,
      "createdAt" : "2025-06-19 00:00:00",
      "badges" : [ ]
    } ],
    "page" : {
      "totalCount" : 15,
      "current" : 1,
      "size" : 3,
      "totalPage" : 5,
      "isFirst" : true,
      "isLast" : false
    }
  }
}

10. 최근 활동 목록 조회 - 최고 페이스 순

Request Example
GET /s/api/activities/recent?order=pace-asc HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 2673

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "recentList" : [ {
      "id" : 16,
      "title" : "트랙 러닝 15",
      "totalDistanceMeters" : 1900,
      "totalDurationSeconds" : 660,
      "avgPace" : 347,
      "createdAt" : "2025-06-24 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 15,
      "title" : "트레일 러닝 14",
      "totalDistanceMeters" : 1800,
      "totalDurationSeconds" : 630,
      "avgPace" : 350,
      "createdAt" : "2025-06-23 00:00:00",
      "badges" : [ {
        "id" : 1,
        "name" : "첫 시작",
        "imageUrl" : "https://example.com/badges/first_run.png"
      } ]
    }, {
      "id" : 14,
      "title" : "6월 러닝 13",
      "totalDistanceMeters" : 1700,
      "totalDurationSeconds" : 600,
      "avgPace" : 352,
      "createdAt" : "2025-06-22 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 13,
      "title" : "두번째 러닝 12",
      "totalDistanceMeters" : 1600,
      "totalDurationSeconds" : 570,
      "avgPace" : 356,
      "createdAt" : "2025-06-21 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 12,
      "title" : "테스트 러닝 11",
      "totalDistanceMeters" : 1500,
      "totalDurationSeconds" : 540,
      "avgPace" : 360,
      "createdAt" : "2025-06-20 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 11,
      "title" : "롱 러닝 10",
      "totalDistanceMeters" : 1400,
      "totalDurationSeconds" : 510,
      "avgPace" : 364,
      "createdAt" : "2025-06-19 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 10,
      "title" : "인터벌 러닝 9",
      "totalDistanceMeters" : 1300,
      "totalDurationSeconds" : 480,
      "avgPace" : 369,
      "createdAt" : "2025-06-18 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 9,
      "title" : "지구력 러닝 8",
      "totalDistanceMeters" : 1200,
      "totalDurationSeconds" : 450,
      "avgPace" : 375,
      "createdAt" : "2025-06-17 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 8,
      "title" : "스피드 러닝 7",
      "totalDistanceMeters" : 1100,
      "totalDurationSeconds" : 420,
      "avgPace" : 381,
      "createdAt" : "2025-06-16 00:00:00",
      "badges" : [ ]
    }, {
      "id" : 7,
      "title" : "로드 러닝 6",
      "totalDistanceMeters" : 1000,
      "totalDurationSeconds" : 390,
      "avgPace" : 390,
      "createdAt" : "2025-06-15 00:00:00",
      "badges" : [ ]
    } ],
    "page" : {
      "totalCount" : 15,
      "current" : 1,
      "size" : 3,
      "totalPage" : 5,
      "isFirst" : true,
      "isLast" : false
    }
  }
}

런 레벨 (Run Level)

1. 런 레벨 목록 및 진행도 조회

Request Example
GET /s/api/run-levels HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 1461

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "runLevels" : [ {
      "id" : 1,
      "name" : "옐로우",
      "minDistance" : 0,
      "maxDistance" : 49999,
      "description" : "0 ~ 49.99킬로미터",
      "sortOrder" : 0,
      "isCurrent" : true
    }, {
      "id" : 2,
      "name" : "오렌지",
      "minDistance" : 50000,
      "maxDistance" : 249999,
      "description" : "50.00 ~ 249.9킬로미터",
      "sortOrder" : 1,
      "isCurrent" : false
    }, {
      "id" : 3,
      "name" : "그린",
      "minDistance" : 250000,
      "maxDistance" : 999999,
      "description" : "250.0 ~ 999.9킬로미터",
      "sortOrder" : 2,
      "isCurrent" : false
    }, {
      "id" : 4,
      "name" : "블루",
      "minDistance" : 1000000,
      "maxDistance" : 2499000,
      "description" : "1,000 ~ 2,499킬로미터",
      "sortOrder" : 3,
      "isCurrent" : false
    }, {
      "id" : 5,
      "name" : "퍼플",
      "minDistance" : 2500000,
      "maxDistance" : 4999000,
      "description" : "2,500 ~ 4,999킬로미터",
      "sortOrder" : 4,
      "isCurrent" : false
    }, {
      "id" : 6,
      "name" : "블랙",
      "minDistance" : 5000000,
      "maxDistance" : 14999000,
      "description" : "5,000 ~ 14,999킬로미터",
      "sortOrder" : 5,
      "isCurrent" : false
    } ],
    "totalDistance" : 17600,
    "distanceToNextLevel" : 32400
  }
}

런 뱃지 (Run Badge)

1. 런 뱃지 목록 조회

Request Example
GET /s/api/run-badges HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 5924

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "recents" : [ {
      "id" : 1,
      "name" : "금메달",
      "description" : "챌린지에서 1위를 달성하셨습니다!",
      "imageUrl" : "https://example.com/rewards/gold.png",
      "type" : "챌린지 수상자",
      "achievedAt" : "2025-06-16 00:01:00",
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : true,
      "achievedCount" : 1
    }, {
      "id" : 4,
      "name" : "완주자",
      "description" : "챌린지를 완료하셨습니다!",
      "imageUrl" : "https://example.com/rewards/participation.png",
      "type" : "챌린지 우승자",
      "achievedAt" : "2025-06-14 10:00:00",
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : true,
      "achievedCount" : 1
    }, {
      "id" : 1,
      "name" : "첫 시작",
      "description" : "매달 첫 러닝을 완료했어요!",
      "imageUrl" : "https://example.com/badges/first_run.png",
      "type" : "월간업적",
      "achievedAt" : "2025-03-15 10:00:00",
      "runRecordDistance" : 600,
      "runRecordSeconds" : 270,
      "runRecordPace" : 450,
      "isAchieved" : true,
      "achievedCount" : 4
    }, {
      "id" : 1,
      "name" : "첫 시작",
      "description" : "매달 첫 러닝을 완료했어요!",
      "imageUrl" : "https://example.com/badges/first_run.png",
      "type" : "월간업적",
      "achievedAt" : "2025-03-15 10:00:00",
      "runRecordDistance" : 1800,
      "runRecordSeconds" : 630,
      "runRecordPace" : 350,
      "isAchieved" : true,
      "achievedCount" : 4
    }, {
      "id" : 1,
      "name" : "첫 시작",
      "description" : "매달 첫 러닝을 완료했어요!",
      "imageUrl" : "https://example.com/badges/first_run.png",
      "type" : "월간업적",
      "achievedAt" : "2025-02-15 10:00:00",
      "runRecordDistance" : 500,
      "runRecordSeconds" : 240,
      "runRecordPace" : 480,
      "isAchieved" : true,
      "achievedCount" : 4
    } ],
    "bests" : [ {
      "id" : 2,
      "name" : "1K 최고 기록",
      "description" : "나의 1,000미터 최고 기록",
      "imageUrl" : "https://example.com/badges/1k_best.png",
      "type" : "최고기록",
      "achievedAt" : null,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : false,
      "achievedCount" : null
    }, {
      "id" : 3,
      "name" : "5K 최고 기록",
      "description" : "나의 5,000미터 최고 기록",
      "imageUrl" : "https://example.com/badges/5k_best.png",
      "type" : "최고기록",
      "achievedAt" : null,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : false,
      "achievedCount" : null
    } ],
    "monthly" : [ {
      "id" : 1,
      "name" : "첫 시작",
      "description" : "매달 첫 러닝을 완료했어요!",
      "imageUrl" : "https://example.com/badges/first_run.png",
      "type" : "월간업적",
      "achievedAt" : "2025-03-15 10:00:00",
      "runRecordDistance" : 600,
      "runRecordSeconds" : 270,
      "runRecordPace" : 450,
      "isAchieved" : true,
      "achievedCount" : 4
    }, {
      "id" : 4,
      "name" : "브론즈",
      "description" : "한 달에 24킬로미터 이상 러닝",
      "imageUrl" : "https://example.com/badges/bronze.png",
      "type" : "월간업적",
      "achievedAt" : null,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : false,
      "achievedCount" : null
    }, {
      "id" : 5,
      "name" : "실버",
      "description" : "한 달에 40킬로미터 이상 러닝",
      "imageUrl" : "https://example.com/badges/silver.png",
      "type" : "월간업적",
      "achievedAt" : null,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : false,
      "achievedCount" : null
    }, {
      "id" : 6,
      "name" : "골드",
      "description" : "한 달에 80킬로미터 이상 러닝",
      "imageUrl" : "https://example.com/badges/gold.png",
      "type" : "월간업적",
      "achievedAt" : null,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : false,
      "achievedCount" : null
    }, {
      "id" : 7,
      "name" : "플래티넘",
      "description" : "한 달에 160킬로미터 이상 러닝",
      "imageUrl" : "https://example.com/badges/platinum.png",
      "type" : "월간업적",
      "achievedAt" : null,
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : false,
      "achievedCount" : null
    } ],
    "challenges" : [ {
      "id" : 1,
      "name" : "금메달",
      "description" : "챌린지에서 1위를 달성하셨습니다!",
      "imageUrl" : "https://example.com/rewards/gold.png",
      "type" : "챌린지 수상자",
      "achievedAt" : "2025-06-16 00:01:00",
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : true,
      "achievedCount" : 1
    }, {
      "id" : 4,
      "name" : "완주자",
      "description" : "챌린지를 완료하셨습니다!",
      "imageUrl" : "https://example.com/rewards/participation.png",
      "type" : "챌린지 우승자",
      "achievedAt" : "2025-06-14 10:00:00",
      "runRecordDistance" : null,
      "runRecordSeconds" : null,
      "runRecordPace" : null,
      "isAchieved" : true,
      "achievedCount" : 1
    } ]
  }
}

포스트 (Post)

1. 포스트 목록 조회 성공

Request Example
GET /s/api/community/posts HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 915

{
  "status" : 200,
  "msg" : "성공",
  "data" : [ {
    "likeCount" : 1,
    "commentCount" : 27,
    "isLiked" : false,
    "id" : 1,
    "content" : "ssar의 러닝 기록을 공유합니다.",
    "createdAt" : "2025-07-16 16:34:45",
    "pictures" : [ {
      "fileUrl" : "https://example.com/images/run1.jpg",
      "lat" : 37.5665,
      "lon" : 126.978,
      "savedAt" : "2025-07-01 08:30:00"
    } ],
    "user" : {
      "id" : 1,
      "username" : "ssar",
      "profileUrl" : "http://example.com/profiles/ssar.jpg"
    }
  }, {
    "likeCount" : 1,
    "commentCount" : 0,
    "isLiked" : true,
    "id" : 2,
    "content" : "love의 러닝 기록을 공유합니다.",
    "createdAt" : "2025-07-16 16:34:45",
    "pictures" : [ ],
    "user" : {
      "id" : 3,
      "username" : "love",
      "profileUrl" : "http://example.com/profiles/love.jpg"
    }
  } ]
}

2. 포스트 쓰기 성공

Request Example
POST /s/api/community/posts HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 60
Host: localhost:8080

{
  "content" : "내용입니다",
  "runRecordId" : 10
}
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 199

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 3,
    "content" : "내용입니다",
    "userId" : 1,
    "createdAt" : "2025-07-16 16:34:46",
    "runRecordId" : 10
  }
}

3. 포스트 쓰기 실패 (존재하지 않는 러닝 기록 ID)

Request Example
POST /s/api/community/posts HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 61
Host: localhost:8080

{
  "content" : "내용입니다",
  "runRecordId" : 999
}
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 95

{
  "status" : 404,
  "msg" : "해당 러닝을 찾을 수 없습니다",
  "data" : null
}

4. 포스트 상세 조회 성공

Request Example
GET /s/api/community/posts/1 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 7787

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "commentsInfo" : {
      "current" : 1,
      "totalCount" : 10,
      "next" : 2,
      "totalPage" : 5,
      "isLast" : false,
      "comments" : [ {
        "id" : 22,
        "postId" : 1,
        "userId" : 2,
        "username" : "cos",
        "content" : "감동적인 글이었습니다.",
        "parentId" : null,
        "createdAt" : "2025-07-16 16:34:45",
        "updatedAt" : "2025-07-16 16:34:45",
        "children" : [ ]
      }, {
        "id" : 21,
        "postId" : 1,
        "userId" : 1,
        "username" : "ssar",
        "content" : "앞으로도 잘 부탁드려요.",
        "parentId" : null,
        "createdAt" : "2025-07-16 16:34:45",
        "updatedAt" : "2025-07-16 16:34:45",
        "children" : [ {
          "id" : 26,
          "postId" : 1,
          "userId" : 2,
          "username" : "cos",
          "content" : "앞으로 자주 뵈어요!",
          "parentId" : 21,
          "createdAt" : "2025-07-16 16:34:45",
          "updatedAt" : "2025-07-16 16:34:45"
        }, {
          "id" : 27,
          "postId" : 1,
          "userId" : 3,
          "username" : "love",
          "content" : "저도 기대하고 있겠습니다.",
          "parentId" : 21,
          "createdAt" : "2025-07-16 16:34:45",
          "updatedAt" : "2025-07-16 16:34:45"
        } ]
      }, {
        "id" : 20,
        "postId" : 1,
        "userId" : 3,
        "username" : "love",
        "content" : "정성 가득한 포스팅이에요.",
        "parentId" : null,
        "createdAt" : "2025-07-16 16:34:45",
        "updatedAt" : "2025-07-16 16:34:45",
        "children" : [ {
          "id" : 25,
          "postId" : 1,
          "userId" : 2,
          "username" : "cos",
          "content" : "진짜 정성이 느껴졌어요.",
          "parentId" : 20,
          "createdAt" : "2025-07-16 16:34:45",
          "updatedAt" : "2025-07-16 16:34:45"
        } ]
      }, {
        "id" : 19,
        "postId" : 1,
        "userId" : 2,
        "username" : "cos",
        "content" : "댓글 안 달 수가 없네요.",
        "parentId" : null,
        "createdAt" : "2025-07-16 16:34:45",
        "updatedAt" : "2025-07-16 16:34:45",
        "children" : [ {
          "id" : 23,
          "postId" : 1,
          "userId" : 1,
          "username" : "ssar",
          "content" : "저도 같은 생각이에요!",
          "parentId" : 19,
          "createdAt" : "2025-07-16 16:34:45",
          "updatedAt" : "2025-07-16 16:34:45"
        }, {
          "id" : 24,
          "postId" : 1,
          "userId" : 3,
          "username" : "love",
          "content" : "공감 백퍼입니다.",
          "parentId" : 19,
          "createdAt" : "2025-07-16 16:34:45",
          "updatedAt" : "2025-07-16 16:34:45"
        } ]
      }, {
        "id" : 18,
        "postId" : 1,
        "userId" : 1,
        "username" : "ssar",
        "content" : "열정이 느껴져요.",
        "parentId" : null,
        "createdAt" : "2025-07-16 16:34:45",
        "updatedAt" : "2025-07-16 16:34:45",
        "children" : [ ]
      } ]
    },
    "likeCount" : 1,
    "commentCount" : 27,
    "isLiked" : false,
    "user" : {
      "id" : 1,
      "username" : "ssar",
      "profileUrl" : "http://example.com/profiles/ssar.jpg"
    },
    "id" : 1,
    "content" : "ssar의 러닝 기록을 공유합니다.",
    "runRecord" : {
      "id" : 1,
      "title" : "부산 서면역 15번 출구 100m 러닝",
      "memo" : "서면역 15번 출구에서 NC백화점 방향으로 100m 직선 러닝",
      "calories" : 10,
      "totalDistanceMeters" : 100,
      "totalDurationSeconds" : 50,
      "elapsedTimeInSeconds" : 50,
      "avgPace" : 500,
      "bestPace" : 500,
      "userId" : 1,
      "segments" : [ {
        "id" : 1,
        "startDate" : "2025-06-20 09:00:00",
        "endDate" : "2025-06-20 09:00:50",
        "durationSeconds" : 50,
        "distanceMeters" : 100,
        "pace" : 500,
        "coordinates" : [ {
          "lat" : 35.1579,
          "lon" : 129.0594,
          "recordedAt" : "2025-06-20 09:00:00"
        }, {
          "lat" : 35.1579,
          "lon" : 129.05944545,
          "recordedAt" : "2025-06-20 09:00:02"
        }, {
          "lat" : 35.1579,
          "lon" : 129.05949091,
          "recordedAt" : "2025-06-20 09:00:04"
        }, {
          "lat" : 35.1579,
          "lon" : 129.05953636,
          "recordedAt" : "2025-06-20 09:00:06"
        }, {
          "lat" : 35.1579,
          "lon" : 129.05958182,
          "recordedAt" : "2025-06-20 09:00:08"
        }, {
          "lat" : 35.1579,
          "lon" : 129.05962727,
          "recordedAt" : "2025-06-20 09:00:10"
        }, {
          "lat" : 35.1579,
          "lon" : 129.05967273,
          "recordedAt" : "2025-06-20 09:00:12"
        }, {
          "lat" : 35.1579,
          "lon" : 129.05971818,
          "recordedAt" : "2025-06-20 09:00:14"
        }, {
          "lat" : 35.1579,
          "lon" : 129.05976364,
          "recordedAt" : "2025-06-20 09:00:16"
        }, {
          "lat" : 35.1579,
          "lon" : 129.05980909,
          "recordedAt" : "2025-06-20 09:00:18"
        }, {
          "lat" : 35.1579,
          "lon" : 129.05985455,
          "recordedAt" : "2025-06-20 09:00:20"
        }, {
          "lat" : 35.1579,
          "lon" : 129.0599,
          "recordedAt" : "2025-06-20 09:00:22"
        }, {
          "lat" : 35.1579,
          "lon" : 129.05994545,
          "recordedAt" : "2025-06-20 09:00:24"
        }, {
          "lat" : 35.1579,
          "lon" : 129.05999091,
          "recordedAt" : "2025-06-20 09:00:26"
        }, {
          "lat" : 35.1579,
          "lon" : 129.06003636,
          "recordedAt" : "2025-06-20 09:00:28"
        }, {
          "lat" : 35.1579,
          "lon" : 129.06008182,
          "recordedAt" : "2025-06-20 09:00:30"
        }, {
          "lat" : 35.1579,
          "lon" : 129.06012727,
          "recordedAt" : "2025-06-20 09:00:32"
        }, {
          "lat" : 35.1579,
          "lon" : 129.06017273,
          "recordedAt" : "2025-06-20 09:00:34"
        }, {
          "lat" : 35.1579,
          "lon" : 129.06021818,
          "recordedAt" : "2025-06-20 09:00:36"
        }, {
          "lat" : 35.1579,
          "lon" : 129.06026364,
          "recordedAt" : "2025-06-20 09:00:38"
        }, {
          "lat" : 35.1579,
          "lon" : 129.06030909,
          "recordedAt" : "2025-06-20 09:00:40"
        }, {
          "lat" : 35.1579,
          "lon" : 129.06035455,
          "recordedAt" : "2025-06-20 09:00:42"
        }, {
          "lat" : 35.1579,
          "lon" : 129.0604,
          "recordedAt" : "2025-06-20 09:00:44"
        }, {
          "lat" : 35.1579,
          "lon" : 129.06044545,
          "recordedAt" : "2025-06-20 09:00:46"
        }, {
          "lat" : 35.1579,
          "lon" : 129.06049091,
          "recordedAt" : "2025-06-20 09:00:48"
        }, {
          "lat" : 35.1579,
          "lon" : 129.06053636,
          "recordedAt" : "2025-06-20 09:00:50"
        } ]
      } ],
      "pictures" : [ {
        "fileUrl" : "https://example.com/images/run1.jpg",
        "lat" : 37.5665,
        "lon" : 126.978,
        "savedAt" : "2025-07-01 08:30:00"
      } ],
      "createdAt" : "2025-06-20 09:00:50",
      "intensity" : 3,
      "place" : "도로"
    },
    "isOwner" : true,
    "createdAt" : "2025-07-16 16:34:45",
    "updatedAt" : "2025-07-16 16:34:45"
  }
}

5. 포스트 상세 조회 실패 (존재하지 않는 게시글)

Request Example
GET /s/api/community/posts/999 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 98

{
  "status" : 404,
  "msg" : "해당 게시글을 찾을 수 없습니다",
  "data" : null
}

6. 포스트 수정 성공

Request Example
PUT /s/api/community/posts/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 37
Host: localhost:8080

{
  "content" : "내용입니다"
}
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 197

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 1,
    "content" : "내용입니다",
    "createdAt" : "2025-07-16 16:34:45",
    "updatedAt" : "2025-07-16 16:34:45"
  }
}

7. 포스트 수정 실패 (존재하지 않는 게시글)

Request Example
PUT /s/api/community/posts/999 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 37
Host: localhost:8080

{
  "content" : "내용입니다"
}
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 98

{
  "status" : 404,
  "msg" : "해당 게시글을 찾을 수 없습니다",
  "data" : null
}

8. 포스트 삭제 성공

Request Example
DELETE /s/api/community/posts/1 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 61

{
  "status" : 200,
  "msg" : "성공",
  "data" : null
}

9. 포스트 삭제 실패 (존재하지 않는 게시글)

Request Example
DELETE /s/api/community/posts/999 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 98

{
  "status" : 404,
  "msg" : "해당 게시글을 찾을 수 없습니다",
  "data" : null
}

10. 게시글 등록용 러닝 목록

Request Example
GET /s/api/runs HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 1585

{
  "status" : 200,
  "msg" : "성공",
  "data" : [ {
    "id" : 16,
    "title" : "트랙 러닝 15",
    "createdAt" : "2025-06-24 00:00:00"
  }, {
    "id" : 15,
    "title" : "트레일 러닝 14",
    "createdAt" : "2025-06-23 00:00:00"
  }, {
    "id" : 14,
    "title" : "6월 러닝 13",
    "createdAt" : "2025-06-22 00:00:00"
  }, {
    "id" : 13,
    "title" : "두번째 러닝 12",
    "createdAt" : "2025-06-21 00:00:00"
  }, {
    "id" : 1,
    "title" : "부산 서면역 15번 출구 100m 러닝",
    "createdAt" : "2025-06-20 09:00:50"
  }, {
    "id" : 12,
    "title" : "테스트 러닝 11",
    "createdAt" : "2025-06-20 00:00:00"
  }, {
    "id" : 11,
    "title" : "롱 러닝 10",
    "createdAt" : "2025-06-19 00:00:00"
  }, {
    "id" : 10,
    "title" : "인터벌 러닝 9",
    "createdAt" : "2025-06-18 00:00:00"
  }, {
    "id" : 9,
    "title" : "지구력 러닝 8",
    "createdAt" : "2025-06-17 00:00:00"
  }, {
    "id" : 8,
    "title" : "스피드 러닝 7",
    "createdAt" : "2025-06-16 00:00:00"
  }, {
    "id" : 7,
    "title" : "로드 러닝 6",
    "createdAt" : "2025-06-15 00:00:00"
  }, {
    "id" : 6,
    "title" : "트랙 러닝 5",
    "createdAt" : "2025-06-14 00:00:00"
  }, {
    "id" : 5,
    "title" : "트레일 러닝 4",
    "createdAt" : "2025-06-13 00:00:00"
  }, {
    "id" : 4,
    "title" : "6월 러닝 3",
    "createdAt" : "2025-06-12 00:00:00"
  }, {
    "id" : 3,
    "title" : "두번째 러닝 2",
    "createdAt" : "2025-06-11 00:00:00"
  } ]
}

댓글 (Comment)

1. 댓글 조회 성공

Request Example
GET /s/api/community/posts/1/comments HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 3033

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "current" : 1,
    "totalCount" : 10,
    "next" : 2,
    "totalPage" : 5,
    "isLast" : false,
    "comments" : [ {
      "id" : 22,
      "postId" : 1,
      "userId" : 2,
      "username" : "cos",
      "content" : "감동적인 글이었습니다.",
      "parentId" : null,
      "createdAt" : "2025-07-16 16:34:45",
      "updatedAt" : "2025-07-16 16:34:45",
      "children" : [ ]
    }, {
      "id" : 21,
      "postId" : 1,
      "userId" : 1,
      "username" : "ssar",
      "content" : "앞으로도 잘 부탁드려요.",
      "parentId" : null,
      "createdAt" : "2025-07-16 16:34:45",
      "updatedAt" : "2025-07-16 16:34:45",
      "children" : [ {
        "id" : 26,
        "postId" : 1,
        "userId" : 2,
        "username" : "cos",
        "content" : "앞으로 자주 뵈어요!",
        "parentId" : 21,
        "createdAt" : "2025-07-16 16:34:45",
        "updatedAt" : "2025-07-16 16:34:45"
      }, {
        "id" : 27,
        "postId" : 1,
        "userId" : 3,
        "username" : "love",
        "content" : "저도 기대하고 있겠습니다.",
        "parentId" : 21,
        "createdAt" : "2025-07-16 16:34:45",
        "updatedAt" : "2025-07-16 16:34:45"
      } ]
    }, {
      "id" : 20,
      "postId" : 1,
      "userId" : 3,
      "username" : "love",
      "content" : "정성 가득한 포스팅이에요.",
      "parentId" : null,
      "createdAt" : "2025-07-16 16:34:45",
      "updatedAt" : "2025-07-16 16:34:45",
      "children" : [ {
        "id" : 25,
        "postId" : 1,
        "userId" : 2,
        "username" : "cos",
        "content" : "진짜 정성이 느껴졌어요.",
        "parentId" : 20,
        "createdAt" : "2025-07-16 16:34:45",
        "updatedAt" : "2025-07-16 16:34:45"
      } ]
    }, {
      "id" : 19,
      "postId" : 1,
      "userId" : 2,
      "username" : "cos",
      "content" : "댓글 안 달 수가 없네요.",
      "parentId" : null,
      "createdAt" : "2025-07-16 16:34:45",
      "updatedAt" : "2025-07-16 16:34:45",
      "children" : [ {
        "id" : 23,
        "postId" : 1,
        "userId" : 1,
        "username" : "ssar",
        "content" : "저도 같은 생각이에요!",
        "parentId" : 19,
        "createdAt" : "2025-07-16 16:34:45",
        "updatedAt" : "2025-07-16 16:34:45"
      }, {
        "id" : 24,
        "postId" : 1,
        "userId" : 3,
        "username" : "love",
        "content" : "공감 백퍼입니다.",
        "parentId" : 19,
        "createdAt" : "2025-07-16 16:34:45",
        "updatedAt" : "2025-07-16 16:34:45"
      } ]
    }, {
      "id" : 18,
      "postId" : 1,
      "userId" : 1,
      "username" : "ssar",
      "content" : "열정이 느껴져요.",
      "parentId" : null,
      "createdAt" : "2025-07-16 16:34:45",
      "updatedAt" : "2025-07-16 16:34:45",
      "children" : [ ]
    } ]
  }
}

2. 댓글 조회 실패 (게시글 없음)

Request Example
GET /s/api/community/posts/999/comments HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 98

{
  "status" : 404,
  "msg" : "해당 게시글을 찾을 수 없습니다",
  "data" : null
}

3. 댓글 쓰기 성공

Request Example
POST /s/api/community/posts/1/comments HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 59
Host: localhost:8080

{
  "parentId" : null,
  "content" : "내용입니다"
}
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 244

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 28,
    "postId" : 1,
    "userId" : 1,
    "username" : "ssar",
    "content" : "내용입니다",
    "parentId" : null,
    "createdAt" : "2025-07-16 16:34:45"
  }
}

4. 댓글 쓰기 실패 (게시글 없음)

Request Example
POST /s/api/community/posts/99/comments HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 59
Host: localhost:8080

{
  "parentId" : null,
  "content" : "댓글입니다"
}
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 98

{
  "status" : 404,
  "msg" : "해당 게시글을 찾을 수 없습니다",
  "data" : null
}

5. 댓글 수정 성공

Request Example
PUT /s/api/community/posts/1/comments/3 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 47
Host: localhost:8080

{
  "content" : "수정된 내용입니다"
}
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 253

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 3,
    "postId" : 1,
    "userId" : 1,
    "username" : "ssar",
    "content" : "수정된 내용입니다",
    "parentId" : null,
    "updatedAt" : "2025-07-16 16:34:45"
  }
}

6. 댓글 수정 실패 (댓글 없음)

Request Example
PUT /s/api/community/posts/1/comments/999 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 47
Host: localhost:8080

{
  "content" : "수정된 내용입니다"
}
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 95

{
  "status" : 404,
  "msg" : "해당 댓글을 찾을 수 없습니다",
  "data" : null
}

7. 댓글 삭제 성공

Request Example
DELETE /s/api/community/posts/1/comments/3 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 61

{
  "status" : 200,
  "msg" : "성공",
  "data" : null
}

8. 댓글 삭제 실패 (댓글 없음)

Request Example
DELETE /s/api/community/posts/1/comments/999 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 95

{
  "status" : 404,
  "msg" : "해당 댓글을 찾을 수 없습니다",
  "data" : null
}

좋아요 (Like)

1. 게시글 좋아요 성공

Request Example
POST /s/api/community/posts/1/likes HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 103

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "likeId" : 4,
    "likeCount" : 2
  }
}

2. 게시글 좋아요 실패 (게시글 없음)

Request Example
POST /s/api/community/posts/10/likes HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 98

{
  "status" : 404,
  "msg" : "해당 게시글을 찾을 수 없습니다",
  "data" : null
}

3. 게시글 좋아요 취소 성공

Request Example
DELETE /s/api/community/posts/1/likes/3 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 84

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "likeCount" : 0
  }
}

4. 게시글 좋아요 취소 실패 (좋아요 없음)

Request Example
DELETE /s/api/community/posts/1/likes/100 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 98

{
  "status" : 404,
  "msg" : "해당 좋아요를 찾을 수 없습니다",
  "data" : null
}

5. 댓글 좋아요 성공

Request Example
POST /s/api/community/comments/1/likes HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 103

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "likeId" : 4,
    "likeCount" : 2
  }
}

6. 댓글 좋아요 실패 (댓글 없음)

Request Example
POST /s/api/community/comments/30/likes HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 95

{
  "status" : 404,
  "msg" : "해당 댓글을 찾을 수 없습니다",
  "data" : null
}

7. 댓글 좋아요 취소 성공

Request Example
DELETE /s/api/community/comments/1/likes/2 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 84

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "likeCount" : 0
  }
}

8. 댓글 좋아요 취소 실패 (좋아요 없음)

Request Example
DELETE /s/api/community/comments/1/likes/100 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 98

{
  "status" : 404,
  "msg" : "해당 좋아요를 찾을 수 없습니다",
  "data" : null
}

알림 (Notification)

1. 알림 목록 조회

Request Example
GET /s/api/notifications HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 995

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "notifications" : [ {
      "type" : "challengeInvite",
      "profileUrl" : "http://example.com/profiles/leo.jpg",
      "username" : "leo",
      "status" : "대기",
      "createdAt" : "2025-07-11 15:36:00",
      "inviteId" : 1
    }, {
      "type" : "challengeInvite",
      "profileUrl" : "http://example.com/profiles/love.jpg",
      "username" : "love",
      "status" : "대기",
      "createdAt" : "2025-07-05 15:36:00",
      "inviteId" : 2
    }, {
      "type" : "friendInvite",
      "profileUrl" : "http://example.com/profiles/leo.jpg",
      "username" : "leo",
      "status" : "대기",
      "createdAt" : "2025-06-12 00:00:00",
      "inviteId" : 2
    }, {
      "type" : "friendInvite",
      "profileUrl" : "http://example.com/profiles/haha.jpg",
      "username" : "haha",
      "status" : "대기",
      "createdAt" : "2025-06-11 00:00:00",
      "inviteId" : 3
    } ]
  }
}

리더보드 (Leaderboard)

1. 리더보드 조회 (이번 주)

Request Example
GET /s/api/community/leaderboards/week HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 1039

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "myRanking" : {
      "totalDistanceMeters" : 3700,
      "rank" : 1
    },
    "rankingList" : [ {
      "profileUrl" : "http://example.com/profiles/ssar.jpg",
      "username" : "ssar",
      "totalDistanceMeters" : 3700,
      "rank" : 1,
      "userId" : 1
    }, {
      "profileUrl" : "http://example.com/profiles/love.jpg",
      "username" : "love",
      "totalDistanceMeters" : 0,
      "rank" : 2,
      "userId" : 3
    }, {
      "profileUrl" : "http://example.com/profiles/haha.jpg",
      "username" : "haha",
      "totalDistanceMeters" : 0,
      "rank" : 2,
      "userId" : 4
    }, {
      "profileUrl" : "http://example.com/profiles/green.jpg",
      "username" : "green",
      "totalDistanceMeters" : 0,
      "rank" : 2,
      "userId" : 5
    }, {
      "profileUrl" : "http://example.com/profiles/leo.jpg",
      "username" : "leo",
      "totalDistanceMeters" : 0,
      "rank" : 2,
      "userId" : 6
    } ]
  }
}

2. 리더보드 조회 (지난 주)

Request Example
GET /s/api/community/leaderboards/week?before=1 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 1039

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "myRanking" : {
      "totalDistanceMeters" : 9900,
      "rank" : 1
    },
    "rankingList" : [ {
      "profileUrl" : "http://example.com/profiles/ssar.jpg",
      "username" : "ssar",
      "totalDistanceMeters" : 9900,
      "rank" : 1,
      "userId" : 1
    }, {
      "profileUrl" : "http://example.com/profiles/love.jpg",
      "username" : "love",
      "totalDistanceMeters" : 0,
      "rank" : 2,
      "userId" : 3
    }, {
      "profileUrl" : "http://example.com/profiles/haha.jpg",
      "username" : "haha",
      "totalDistanceMeters" : 0,
      "rank" : 2,
      "userId" : 4
    }, {
      "profileUrl" : "http://example.com/profiles/green.jpg",
      "username" : "green",
      "totalDistanceMeters" : 0,
      "rank" : 2,
      "userId" : 5
    }, {
      "profileUrl" : "http://example.com/profiles/leo.jpg",
      "username" : "leo",
      "totalDistanceMeters" : 0,
      "rank" : 2,
      "userId" : 6
    } ]
  }
}

3. 리더보드 조회 (이번 월)

Request Example
GET /s/api/community/leaderboards/mouth HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 1043

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "myRanking" : {
      "totalDistanceMeters" : 17600,
      "rank" : 1
    },
    "rankingList" : [ {
      "profileUrl" : "http://example.com/profiles/ssar.jpg",
      "username" : "ssar",
      "totalDistanceMeters" : 17600,
      "rank" : 1,
      "userId" : 1
    }, {
      "profileUrl" : "http://example.com/profiles/love.jpg",
      "username" : "love",
      "totalDistanceMeters" : 500,
      "rank" : 2,
      "userId" : 3
    }, {
      "profileUrl" : "http://example.com/profiles/haha.jpg",
      "username" : "haha",
      "totalDistanceMeters" : 0,
      "rank" : 3,
      "userId" : 4
    }, {
      "profileUrl" : "http://example.com/profiles/green.jpg",
      "username" : "green",
      "totalDistanceMeters" : 0,
      "rank" : 3,
      "userId" : 5
    }, {
      "profileUrl" : "http://example.com/profiles/leo.jpg",
      "username" : "leo",
      "totalDistanceMeters" : 0,
      "rank" : 3,
      "userId" : 6
    } ]
  }
}

4. 리더보드 조회 (지난 월)

Request Example
GET /s/api/community/leaderboards/mouth?before=1 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 1033

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "myRanking" : {
      "totalDistanceMeters" : 0,
      "rank" : 1
    },
    "rankingList" : [ {
      "profileUrl" : "http://example.com/profiles/ssar.jpg",
      "username" : "ssar",
      "totalDistanceMeters" : 0,
      "rank" : 1,
      "userId" : 1
    }, {
      "profileUrl" : "http://example.com/profiles/love.jpg",
      "username" : "love",
      "totalDistanceMeters" : 0,
      "rank" : 1,
      "userId" : 3
    }, {
      "profileUrl" : "http://example.com/profiles/haha.jpg",
      "username" : "haha",
      "totalDistanceMeters" : 0,
      "rank" : 1,
      "userId" : 4
    }, {
      "profileUrl" : "http://example.com/profiles/green.jpg",
      "username" : "green",
      "totalDistanceMeters" : 0,
      "rank" : 1,
      "userId" : 5
    }, {
      "profileUrl" : "http://example.com/profiles/leo.jpg",
      "username" : "leo",
      "totalDistanceMeters" : 0,
      "rank" : 1,
      "userId" : 6
    } ]
  }
}

5. 리더보드 조회 (연간)

Request Example
GET /s/api/community/leaderboards/year HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 1043

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "myRanking" : {
      "totalDistanceMeters" : 17600,
      "rank" : 1
    },
    "rankingList" : [ {
      "profileUrl" : "http://example.com/profiles/ssar.jpg",
      "username" : "ssar",
      "totalDistanceMeters" : 17600,
      "rank" : 1,
      "userId" : 1
    }, {
      "profileUrl" : "http://example.com/profiles/love.jpg",
      "username" : "love",
      "totalDistanceMeters" : 500,
      "rank" : 2,
      "userId" : 3
    }, {
      "profileUrl" : "http://example.com/profiles/haha.jpg",
      "username" : "haha",
      "totalDistanceMeters" : 0,
      "rank" : 3,
      "userId" : 4
    }, {
      "profileUrl" : "http://example.com/profiles/green.jpg",
      "username" : "green",
      "totalDistanceMeters" : 0,
      "rank" : 3,
      "userId" : 5
    }, {
      "profileUrl" : "http://example.com/profiles/leo.jpg",
      "username" : "leo",
      "totalDistanceMeters" : 0,
      "rank" : 3,
      "userId" : 6
    } ]
  }
}

친구 요청 (Friend Invite)

1. 친구 요청 성공

Request Example
POST /s/api/friends/invite/users/3 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 143

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 6,
    "fromUser" : 1,
    "toUser" : 3,
    "status" : "대기"
  }
}

2. 친구 요청 실패 (사용자 없음)

Request Example
POST /s/api/friends/invite/users/9 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 98

{
  "status" : 404,
  "msg" : "해당 사용자를 찾을 수 없습니다",
  "data" : null
}

3. 친구 요청 수락 성공

Request Example
PUT /s/api/friends/invite/2/accept HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 103

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 2,
    "status" : "수락"
  }
}

4. 친구 요청 수락 실패 (권한 없음)

Request Example
PUT /s/api/friends/invite/6/accept HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 403 Forbidden
Content-Type: application/json;charset=UTF-8
Content-Length: 85

{
  "status" : 403,
  "msg" : "접근 권한이 없습니다.",
  "data" : null
}

5. 친구 요청 거절 성공

Request Example
PUT /s/api/friends/invite/2/reject HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 103

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 2,
    "status" : "거절"
  }
}

6. 친구 요청 거절 실패 (권한 없음)

Request Example
PUT /s/api/friends/invite/6/reject HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 403 Forbidden
Content-Type: application/json;charset=UTF-8
Content-Length: 85

{
  "status" : 403,
  "msg" : "접근 권한이 없습니다.",
  "data" : null
}

친구 (Friend)

1. 친구 검색 성공 (유저 태그)

Request Example
GET /s/api/friends/search?user-tag=1 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 195

{
  "status" : 200,
  "msg" : "성공",
  "data" : [ {
    "id" : 3,
    "profileUrl" : "http://example.com/profiles/love.jpg",
    "username" : "love",
    "userTag" : "#123ABC"
  } ]
}

2. 친구 검색 실패 (유효하지 않은 유저 태그)

Request Example
GET /s/api/friends/search?user-tag=%23as2E HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Content-Length: 117

{
  "status" : 400,
  "msg" : "유저 태그는 영문, 숫자만 사용할 수 있습니다.",
  "data" : null
}

3. 친구 목록 조회

Request Example
GET /s/api/friends/list HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 491

{
  "status" : 200,
  "msg" : "성공",
  "data" : [ {
    "id" : 3,
    "profileUrl" : "http://example.com/profiles/love.jpg",
    "username" : "love"
  }, {
    "id" : 4,
    "profileUrl" : "http://example.com/profiles/haha.jpg",
    "username" : "haha"
  }, {
    "id" : 5,
    "profileUrl" : "http://example.com/profiles/green.jpg",
    "username" : "green"
  }, {
    "id" : 6,
    "profileUrl" : "http://example.com/profiles/leo.jpg",
    "username" : "leo"
  } ]
}

4. 친구 삭제

Request Example
DELETE /s/api/friends/users/3 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 61

{
  "status" : 200,
  "msg" : "성공",
  "data" : null
}

5. 친구 삭제 실패 (본인의 친구가 아닌 경우)

Request Example
DELETE /s/api/friends/users/2 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 84

{
  "status" : 404,
  "msg" : "서로 친구가 아닙니다",
  "data" : null
}

챌린지 참여 (Challenge Join)

1. 챌린지 참여 성공

Request Example
POST /s/api/community/challenges/2/join HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 161

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 8,
    "challengeId" : 2,
    "userId" : 1,
    "joinDate" : "2025-07-16 16:34:44"
  }
}

2. 챌린지 참여 실패 (챌린지 없음)

Request Example
POST /s/api/community/challenges/10/join HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 98

{
  "status" : 404,
  "msg" : "해당 챌린지를 찾을 수 없습니다",
  "data" : null
}

3. 챌린지 나가기 성공

Request Example
DELETE /s/api/community/challenges/1/join HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 61

{
  "status" : 200,
  "msg" : "성공",
  "data" : null
}

4. 챌린지 나가기 실패 (참여하지 않은 챌린지)

Request Example
DELETE /s/api/community/challenges/10/join HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 103

{
  "status" : 404,
  "msg" : "해당 챌린지에 참가하지 않았습니다",
  "data" : null
}

챌린지 초대 (Challenge Invite)

1. 챌린지에 친구 초대 성공

Request Example
POST /s/api/community/challenges/1/invite HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 33
Host: localhost:8080

{
  "friendIds" : [ 3, 4, 5 ]
}
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 395

{
  "status" : 200,
  "msg" : "성공",
  "data" : [ {
    "id" : 3,
    "fromUser" : 1,
    "toUser" : 3,
    "challengeId" : 1,
    "status" : "대기"
  }, {
    "id" : 4,
    "fromUser" : 1,
    "toUser" : 4,
    "challengeId" : 1,
    "status" : "대기"
  }, {
    "id" : 5,
    "fromUser" : 1,
    "toUser" : 5,
    "challengeId" : 1,
    "status" : "대기"
  } ]
}

2. 챌린지에 친구 초대 실패 (친구가 아님)

Request Example
POST /s/api/community/challenges/1/invite HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 27
Host: localhost:8080

{
  "friendIds" : [ 2 ]
}
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 84

{
  "status" : 404,
  "msg" : "서로 친구가 아닙니다",
  "data" : null
}

3. 초대 가능한 친구 목록 조회 성공

Request Example
GET /s/api/community/challenges/1/invite/available-friends HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 165

{
  "status" : 200,
  "msg" : "성공",
  "data" : [ {
    "id" : 6,
    "profileUrl" : "http://example.com/profiles/leo.jpg",
    "username" : "leo"
  } ]
}

4. 초대 가능한 친구 목록 조회 실패 (챌린지 미참여)

Request Example
GET /s/api/community/challenges/3/invite/available-friends HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 103

{
  "status" : 404,
  "msg" : "해당 챌린지에 참가하지 않았습니다",
  "data" : null
}

5. 챌린지 초대 수락 성공

Request Example
PUT /s/api/community/challenges/invite/1/accept HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 103

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 1,
    "status" : "수락"
  }
}

6. 챌린지 초대 수락 실패 (권한 없음)

Request Example
PUT /s/api/community/challenges/invite/4/accept HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 403 Forbidden
Content-Type: application/json;charset=UTF-8
Content-Length: 85

{
  "status" : 403,
  "msg" : "접근 권한이 없습니다.",
  "data" : null
}

7. 챌린지 초대 거절 성공

Request Example
PUT /s/api/community/challenges/invite/1/reject HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 103

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 1,
    "status" : "거절"
  }
}

8. 챌린지 초대 거절 실패 (권한 없음)

Request Example
PUT /s/api/community/challenges/invite/4/reject HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Response Example
HTTP/1.1 403 Forbidden
Content-Type: application/json;charset=UTF-8
Content-Length: 85

{
  "status" : 403,
  "msg" : "접근 권한이 없습니다.",
  "data" : null
}

챌린지 (Challenge)

1. 챌린지 목록 조회 성공

Request Example
GET /s/api/community/challenges HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 3022

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "inviteChallenges" : [ {
      "challengeInfo" : {
        "id" : 1,
        "name" : "6월 5k 챌린지",
        "sub" : "이번 주 5km를 달려보세요.",
        "remainingTime" : 691199,
        "myDistance" : null,
        "targetDistance" : 5000,
        "isInProgress" : true,
        "startDate" : "2025-06-01 00:00:00",
        "endDate" : "2025-06-30 23:59:59",
        "type" : "공개"
      },
      "fromUsername" : "leo",
      "challengeInviteId" : 1
    }, {
      "challengeInfo" : {
        "id" : 2,
        "name" : "6월 15k 챌린지",
        "sub" : "6월 한 달 동안 15km를 달성해보세요!",
        "remainingTime" : 691199,
        "myDistance" : null,
        "targetDistance" : 10000,
        "isInProgress" : true,
        "startDate" : "2025-06-01 00:00:00",
        "endDate" : "2025-06-30 23:59:59",
        "type" : "공개"
      },
      "fromUsername" : "love",
      "challengeInviteId" : 2
    } ],
    "recommendedChallenge" : {
      "id" : 3,
      "name" : "6월 25k 챌린지",
      "participantCount" : 0,
      "type" : "공개"
    },
    "myChallenges" : [ {
      "id" : 1,
      "name" : "6월 5k 챌린지",
      "sub" : null,
      "remainingTime" : 691199,
      "myDistance" : 17600,
      "targetDistance" : 5000,
      "isInProgress" : true,
      "endDate" : null,
      "type" : "공개"
    }, {
      "id" : 6,
      "name" : "가볍게 1km 달리기",
      "sub" : null,
      "remainingTime" : 0,
      "myDistance" : 4000,
      "targetDistance" : 1000,
      "isInProgress" : true,
      "endDate" : null,
      "type" : "사설"
    } ],
    "joinableChallenges" : [ {
      "id" : 2,
      "name" : "6월 15k 챌린지",
      "sub" : "6월 한 달 동안 15km를 달성해보세요!",
      "remainingTime" : 691199,
      "myDistance" : null,
      "targetDistance" : null,
      "isInProgress" : true,
      "endDate" : null,
      "type" : "공개"
    }, {
      "id" : 3,
      "name" : "6월 25k 챌린지",
      "sub" : "6월 한 달 동안 25km를 달성해보세요!",
      "remainingTime" : 691199,
      "myDistance" : null,
      "targetDistance" : null,
      "isInProgress" : true,
      "endDate" : null,
      "type" : "공개"
    }, {
      "id" : 4,
      "name" : "6월 50k 챌린지",
      "sub" : "6월 한 달 동안 50km를 달성해보세요!",
      "remainingTime" : 691199,
      "myDistance" : null,
      "targetDistance" : null,
      "isInProgress" : true,
      "endDate" : null,
      "type" : "공개"
    }, {
      "id" : 5,
      "name" : "6월 100k 챌린지",
      "sub" : "6월 한 달 동안 100km를 달성해보세요!",
      "remainingTime" : 691199,
      "myDistance" : null,
      "targetDistance" : null,
      "isInProgress" : true,
      "endDate" : null,
      "type" : "공개"
    } ],
    "pastChallenges" : [ ]
  }
}

2. 챌린지 상세 조회 성공

Request Example
GET /s/api/community/challenges/1 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 860

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "participantCount" : 4,
    "myDistance" : 17600,
    "isJoined" : true,
    "id" : 1,
    "name" : "6월 5k 챌린지",
    "sub" : "이번 주 5km를 달려보세요.",
    "description" : "주간 챌린지를 통해 나의 한계를 뛰어넘어 보세요. 이번 주 5km를 달리면 특별한 완주자 기록을 달성할 수 있습니다.",
    "startDate" : "2025-06-01 00:00:00",
    "endDate" : "2025-06-30 23:59:59",
    "targetDistance" : 5000,
    "remainingTime" : 691199,
    "isInProgress" : true,
    "creatorName" : null,
    "type" : "공개",
    "rank" : 1,
    "imgIndex" : null,
    "rewards" : [ {
      "rewardName" : "6월 5k 챌린지",
      "rewardImageUrl" : "https://example.com/rewards/participation.png",
      "status" : "달성"
    } ]
  }
}

3. 챌린지 상세 조회 실패 (챌린지 없음)

Request Example
GET /s/api/community/challenges/10 HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 404 Not Found
Content-Type: application/json;charset=UTF-8
Content-Length: 98

{
  "status" : 404,
  "msg" : "해당 챌린지를 찾을 수 없습니다",
  "data" : null
}

4. 사설 챌린지 생성 성공

Request Example
POST /s/api/community/challenges HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 171
Host: localhost:8080

{
  "name" : "달리기 초보 모여라!",
  "imgIndex" : 1,
  "targetDistance" : 5000,
  "startDate" : "2025-07-08 00:00:00",
  "endDate" : "2025-07-15 23:59:00"
}
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 451

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 7,
    "name" : "달리기 초보 모여라!",
    "startDate" : "2025-07-08 00:00:00",
    "endDate" : "2025-07-15 23:59:00",
    "targetDistance" : 5000,
    "remainingTime" : 1987140,
    "isInProgress" : true,
    "participantCount" : 1,
    "creatorName" : "ssar",
    "type" : "사설",
    "isJoined" : true,
    "imgIndex" : 1,
    "periodType" : "기타"
  }
}

5. 사설 챌린지 생성 실패 (제목 없음)

Request Example
POST /s/api/community/challenges HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 146
Host: localhost:8080

{
  "name" : null,
  "imgIndex" : 2,
  "targetDistance" : 5000,
  "startDate" : "2025-07-08 00:00:00",
  "endDate" : "2025-07-15 23:59:00"
}
Response Example
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Content-Length: 112

{
  "status" : 400,
  "msg" : "name : 챌린지 이름은 필수 입력 항목입니다.",
  "data" : null
}

6. 사설 챌린지 수정 성공

Request Example
PUT /s/api/community/challenges/6 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 46
Host: localhost:8080

{
  "name" : "달리기 초보 모여라!"
}
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 122

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "id" : 6,
    "name" : "달리기 초보 모여라!"
  }
}

7. 사설 챌린지 수정 실패 (권한 없음)

Request Example
PUT /s/api/community/challenges/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Content-Length: 46
Host: localhost:8080

{
  "name" : "달리기 초보 모여라!"
}
Response Example
HTTP/1.1 403 Forbidden
Content-Type: application/json;charset=UTF-8
Content-Length: 85

{
  "status" : 403,
  "msg" : "접근 권한이 없습니다.",
  "data" : null
}

8. 챌린지 리더보드 조회

Request Example
GET /s/api/community/challenges/1/leaderboard HTTP/1.1
Authorization: Bearer eyJraWQiOiI5ZjI1MmRhZGQ1ZjIzM2Y5M2QyZmE1MjhkMTJmZWEiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI1NmI0YjNmYjY1ZmRjNDI3Y2Y4OTQ3ZmZhNDg2NjhjZSIsInN1YiI6IjQzMjA0MDI5NjEiLCJhdXRoX3RpbWUiOjE3NTIxMDg3NjEsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLstZzsnqzsm5AiLCJleHAiOjE3NTIxNTE5NjEsImlhdCI6MTc1MjEwODc2MSwicGljdHVyZSI6Imh0dHA6Ly9pbWcxLmtha2FvY2RuLm5ldC90aHVtYi9SMTEweDExMC5xNzAvP2ZuYW1lPWh0dHAlM0ElMkYlMkZ0MS5rYWthb2Nkbi5uZXQlMkZhY2NvdW50X2ltYWdlcyUyRmRlZmF1bHRfcHJvZmlsZS5qcGVnIn0.cO_UFNhM9GhC3MAMFewWO9G2gFYGKIlz1-CzaVn-4yp5i-GDPY04YaPoqfEDAPgWWmLtDjB8EbKE5GiTNonjTph-DwckDliH_1cJ4UXTRJFiwnTdXXAyuWgT0TcD-D6w0DM2EwFnqcv6xevP5B1IV_RIOUaGTtfd24xnEC08ek4gRJuYmfo8KOWA2tuAbHccWFg47ojvJVNbvFJoSz7PjQEvPcQImXzsmJg3dT6hAA5roSvIJLR-F9saDa7St51SDoK3Z1gC7-fk36HvStpdoFuKodp5F4fcNjumQVewbXxEa94j3dtP82RmvCZBVtZNoRC-Dz0VQ8u5iwGvp1clzA
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 787

{
  "status" : 200,
  "msg" : "성공",
  "data" : {
    "rankingList" : [ {
      "profileUrl" : "http://example.com/profiles/ssar.jpg",
      "username" : "ssar",
      "totalDistanceMeters" : 17600,
      "rank" : 1,
      "userId" : 1
    }, {
      "profileUrl" : "http://example.com/profiles/love.jpg",
      "username" : "love",
      "totalDistanceMeters" : 500,
      "rank" : 2,
      "userId" : 3
    }, {
      "profileUrl" : "http://example.com/profiles/haha.jpg",
      "username" : "haha",
      "totalDistanceMeters" : 0,
      "rank" : 3,
      "userId" : 4
    }, {
      "profileUrl" : "http://example.com/profiles/green.jpg",
      "username" : "green",
      "totalDistanceMeters" : 0,
      "rank" : 3,
      "userId" : 5
    } ]
  }
}

S3 파일 업로드 (S3)

1. 파일 업로드용 Pre-signed URL 생성

클라이언트(Flutter)가 S3에 파일을 직접 업로드하기 전에, 업로드 권한이 담긴 임시 URL을 발급받는 API입니다. 응답으로 받은 URL에 HTTP PUT 메서드로 실제 파일(binary)을 전송하여 업로드를 완료합니다.

Request Example
GET /api/s3/presigned-url?fileName=123.png HTTP/1.1
Host: localhost:8080
Response Example
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 421

{
  "status" : 200,
  "msg" : "성공",
  "data" : "https://tracky-s3.s3.ap-northeast-2.amazonaws.com/8ac203cc-24aa-44db-9667-c56340f25b11..png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20250716T073446Z&X-Amz-SignedHeaders=host&X-Amz-Expires=600&X-Amz-Credential=AKIA2RG7JJCYH6IZFKXO%2F20250716%2Fap-northeast-2%2Fs3%2Faws4_request&X-Amz-Signature=f9341ab4ee81acab4eadc1c27f7e2bb0b532a5c8f6b7887755e8df93cb1fa5ac"
}