유저 (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"
}