1. API 목록
2. 투표 기간 관련
2.1. GET: 투표 기간 조회
GET /contests/1/vote HTTP/1.1
Host: localhost:8080
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 82
{
"voteStartAt" : "2026-01-01T00:00:00",
"voteEndAt" : "2026-01-02T00:00:00"
}
| Parameter | Description |
|---|---|
|
대회 ID |
| Path | Type | Description |
|---|---|---|
|
|
투표 시작일 (ISO-8601) |
|
|
투표 종료일 (ISO-8601) |
2.2. PUT: 투표 기간 수정
PUT /contests/1/vote HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 82
Host: localhost:8080
{
"voteStartAt" : "2026-02-01T00:00:00",
"voteEndAt" : "2026-02-10T00:00:00"
}
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
| Parameter | Description |
|---|---|
|
대회 ID |
| Name | Description |
|---|---|
|
Bearer admin.access.token |
| Path | Type | Description |
|---|---|---|
|
|
투표 시작일 (ISO-8601) |
|
|
투표 종료일 (ISO-8601) |
3. 최대 투표 개수 관리
3.1. PATCH: 최대 투표 개수 설정
| Parameter | Description |
|---|---|
|
대회의 고유 ID |
| Name | Description |
|---|---|
|
Bearer admin.access.token |
PATCH /contests/1/votes HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 25
Host: localhost:8080
{
"maxVotesLimit" : 2
}
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
| Path | Type | Description |
|---|---|---|
|
|
최대 투표 개수 |
3.1.1. ⚠️ 실패 케이스
❌ Case 1: 존재하지 않는 대회
PATCH /contests/999/votes HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 25
Host: localhost:8080
{
"maxVotesLimit" : 2
}
HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 56
{
"message" : "존재하지 않는 대회입니다."
}
❌ Case 2: 투표 진행 중
PATCH /contests/1/votes HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 25
Host: localhost:8080
{
"maxVotesLimit" : 2
}
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 94
{
"message" : "현재 투표 기간이므로 해당 작업을 수행할 수 없습니다."
}
3.2. GET: 최대 투표 개수 조회
| Parameter | Description |
|---|---|
|
대회의 고유 ID |
| Name | Description |
|---|---|
|
Bearer admin.access.token |
GET /contests/1/votes HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 25
{
"maxVotesLimit" : 2
}
| Path | Type | Description |
|---|---|---|
|
|
최대 투표 개수 |
3.2.1. ⚠️ 실패 케이스
❌ Case 1: 존재하지 않는 대회
GET /contests/999/votes HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 56
{
"message" : "존재하지 않는 대회입니다."
}
4. 대회 배너 이미지 관리
4.1. GET: 대회 배너 이미지 조회
| Parameter | Description |
|---|---|
|
대회 ID |
GET /contests/1/image/banner HTTP/1.1
Host: localhost:8080
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: image/png;charset=UTF-8
Accept-Ranges: bytes
Content-Length: 18
test-image-content
4.1.1. ⚠️ 실패 케이스
❌ Case 1: 존재하지 않는 대회
GET /contests/999/image/banner HTTP/1.1
Host: localhost:8080
HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 56
{
"message" : "존재하지 않는 대회입니다."
}
❌ Case 2: 등록되지 않은 이미지
GET /contests/1/image/banner HTTP/1.1
Host: localhost:8080
HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 71
{
"message" : "아이디와 일치하는 이미지가 없습니다"
}
❌ Case 3: 변환 중인 이미지
GET /contests/1/image/banner HTTP/1.1
Host: localhost:8080
HTTP/1.1 202 Accepted
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 49
{
"message" : "이미지 변환중 입니다"
}
4.2. POST: 대회 배너 이미지 등록
| Parameter | Description |
|---|---|
|
대회 ID |
| Name | Description |
|---|---|
|
Bearer admin.access.token |
| Part | Description |
|---|---|
|
등록할 배너 이미지 (모든 이미지 형식 지원) |
POST /contests/1/image/banner HTTP/1.1
Content-Type: multipart/form-data;charset=UTF-8; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Authorization: Bearer admin.access.token
Host: localhost:8080
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=image; filename=banner.png
Content-Type: image/png
test-image-content
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
4.3. DELETE: 대회 배너 이미지 삭제
| Parameter | Description |
|---|---|
|
대회 ID |
| Name | Description |
|---|---|
|
Bearer admin.access.token |
DELETE /contests/1/image/banner HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
5. 정렬 관리
5.1. PUT: 대회 정렬 설정 변경
| Parameter | Description |
|---|---|
|
대회 ID |
| Name | Description |
|---|---|
|
Bearer admin.access.token |
PUT /contests/1/sort HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 20
Host: localhost:8080
{
"mode" : "ASC"
}
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
| Path | Type | Description |
|---|---|---|
|
|
수정할 대회 정렬 모드 |
5.2. GET: 대회 정렬 방식 조회
| Parameter | Description |
|---|---|
|
대회 ID |
| Name | Description |
|---|---|
|
Bearer admin.access.token |
GET /contests/1/sort HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 27
{
"currentMode" : "ASC"
}
| Path | Type | Description |
|---|---|---|
|
|
현재 적용되어 있는 모드 정보 |
5.3. PUT: 대회 수동 정렬 순서 저장
| Parameter | Description |
|---|---|
|
대회 ID |
| Name | Description |
|---|---|
|
Bearer {accessToken} (관리자) |
PUT /contests/1/sort/custom HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 119
Host: localhost:8080
[ {
"teamId" : 1,
"itemOrder" : 1
}, {
"teamId" : 2,
"itemOrder" : 3
}, {
"teamId" : 3,
"itemOrder" : 2
} ]
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
| Path | Type | Description |
|---|---|---|
|
|
정렬 순서를 담은 팀 배열(모든 팀 다 보내주세요) |
|
|
정렬 순서를 변경할 팀 ID |
|
|
팀의 정렬 순서 (1부터 팀 개수까지) |
5.3.1. ⚠️ 실패 케이스
❌ Case 1: CUSTOM 모드가 아님
PUT /contests/1/sort/custom HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 119
Host: localhost:8080
[ {
"teamId" : 1,
"itemOrder" : 1
}, {
"teamId" : 2,
"itemOrder" : 3
}, {
"teamId" : 3,
"itemOrder" : 2
} ]
HTTP/1.1 403 Forbidden
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 80
{
"message" : "CUSTOM 모드에서만 정렬을 수정할 수 있습니다."
}
❌ Case 2: request에 중복된 teamId 존재
PUT /contests/1/sort/custom HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 119
Host: localhost:8080
[ {
"teamId" : 1,
"itemOrder" : 1
}, {
"teamId" : 2,
"itemOrder" : 3
}, {
"teamId" : 1,
"itemOrder" : 2
} ]
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 52
{
"message" : "중복된 팀ID가 있습니다."
}
| Path | Type | Description |
|---|---|---|
|
|
정렬 순서를 담은 팀 배열 |
|
|
팀 ID(중복 존재) |
|
|
팀의 정렬 순서 |
❌ Case 3: request에 중복된 itemOrder 존재
PUT /contests/1/sort/custom HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 119
Host: localhost:8080
[ {
"teamId" : 1,
"itemOrder" : 1
}, {
"teamId" : 2,
"itemOrder" : 3
}, {
"teamId" : 3,
"itemOrder" : 1
} ]
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 56
{
"message" : "중복된 itemOrder가 있습니다."
}
| Path | Type | Description |
|---|---|---|
|
|
정렬 순서를 담은 팀 배열 |
|
|
팀 ID |
|
|
팀의 정렬 순서(중복 존재) |
❌ Case 4: 요청 팀 개수와 저장된 팀 개수 다름
PUT /contests/1/sort/custom HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 119
Host: localhost:8080
[ {
"teamId" : 1,
"itemOrder" : 1
}, {
"teamId" : 2,
"itemOrder" : 3
}, {
"teamId" : 3,
"itemOrder" : 2
} ]
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 81
{
"message" : "저장된 팀 개수와 request의 팀 개수가 다릅니다"
}
❌ Case 5: itemOrder가 팀 개수를 넘어감
PUT /contests/1/sort/custom HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 119
Host: localhost:8080
[ {
"teamId" : 1,
"itemOrder" : 1
}, {
"teamId" : 2,
"itemOrder" : 3
}, {
"teamId" : 3,
"itemOrder" : 2
} ]
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 104
{
"message" : "적절하지 않은 itemOrder입니다.(최대 팀 개수보다 초과된 itemOrder)"
}
6. 대회 관리
6.1. POST: 대회 생성
| Name | Description |
|---|---|
|
Bearer admin.access.token |
POST /contests HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 61
Host: localhost:8080
{
"contestName" : "제6회 해커톤",
"categoryId" : 1
}
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 183
{
"contestId" : 1,
"contestName" : "제6회 해커톤",
"categoryId" : 1,
"categoryName" : "해커톤",
"isCurrent" : true,
"updatedAt" : "2026-03-28T15:18:11.720418165"
}
| Path | Type | Description |
|---|---|---|
|
|
대회 이름 |
|
|
카테고리 ID |
6.1.1. ⚠️ 실패 케이스
❌ Case 1: 동일한 대회명 존재
POST /contests HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 61
Host: localhost:8080
{
"contestName" : "제6회 해커톤",
"categoryId" : 1
}
HTTP/1.1 409 Conflict
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 56
{
"message" : "동일한 대회명이 있습니다."
}
| Path | Type | Description |
|---|---|---|
|
|
이미 존재하는 대회 이름 |
|
|
카테고리 ID |
6.2. PATCH: 대회 수정
| 대회 생성과 동일하게 이미 저장되어 있는 대회 이름은 저장 불가 |
| Name | Description |
|---|---|
|
Bearer admin.access.token |
| Parameter | Description |
|---|---|
|
대회 ID |
PATCH /contests/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 61
Host: localhost:8080
{
"contestName" : "제6회 해커톤",
"categoryId" : 1
}
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
| Path | Type | Description |
|---|---|---|
|
|
대회 이름 |
|
|
카테고리 ID |
6.3. DELETE: 대회 삭제
| Name | Description |
|---|---|
|
Bearer admin.access.token |
| Parameter | Description |
|---|---|
|
대회 ID |
DELETE /contests/1 HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
6.4. GET: 대회 목록 조회
GET /contests HTTP/1.1
Host: localhost:8080
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 369
[ {
"contestId" : 1,
"contestName" : "제6회 해커톤",
"categoryId" : 1,
"categoryName" : "해커톤",
"isCurrent" : true,
"updatedAt" : "2026-03-28T15:18:11.419428501"
}, {
"contestId" : 2,
"contestName" : "CSE 캡스톤",
"categoryId" : 2,
"categoryName" : "캡스톤",
"isCurrent" : false,
"updatedAt" : "2026-03-28T15:18:11.419442155"
} ]
| Path | Type | Description |
|---|---|---|
|
|
대회 목록 |
|
|
대회 ID |
|
|
대회 이름 |
|
|
카테고리 ID |
|
|
카테고리 이름 |
|
|
현재 진행 대회 여부 |
|
|
수정 일시 (ISO-8601) |
7. 투표 로그 관리
7.1. GET: 투표 로그 조회
| Name | Description |
|---|---|
|
Bearer admin.access.token |
| Parameter | Description |
|---|---|
|
대회 ID |
|
페이지 번호 (0부터 시작) |
|
페이지 크기 |
GET /contests/1/vote-log?page=0&size=20 HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 775
{
"content" : [ {
"voterName" : "이옵스",
"voterEmail" : "lee@pusan.ac.kr",
"teamName" : "teamA",
"votedAt" : "2026-03-28T15:18:11.388993425"
}, {
"voterName" : "김옵스",
"voterEmail" : "kim@pusan.ac.kr",
"teamName" : "teamB",
"votedAt" : "2026-03-28T15:18:10.389001064"
} ],
"pageable" : {
"pageNumber" : 0,
"pageSize" : 20,
"sort" : {
"empty" : false,
"sorted" : true,
"unsorted" : false
},
"offset" : 0,
"paged" : true,
"unpaged" : false
},
"last" : true,
"totalElements" : 2,
"totalPages" : 1,
"size" : 20,
"number" : 0,
"sort" : {
"empty" : false,
"sorted" : true,
"unsorted" : false
},
"first" : true,
"numberOfElements" : 2,
"empty" : false
}
| Path | Type | Description |
|---|---|---|
|
|
투표 로그 목록 (최신순) |
|
|
투표자 이름 |
|
|
투표자 이메일 |
|
|
투표한 팀 이름 |
|
|
투표 시점 (ISO-8601) |
|
|
페이지 정보 |
|
|
마지막 페이지 여부 |
|
|
전체 페이지 수 |
|
|
전체 요소 수 |
|
|
첫 페이지 여부 |
|
|
페이지 크기 |
|
|
현재 페이지 번호 |
|
|
정렬 정보 |
|
|
현재 페이지 요소 수 |
|
|
비어있는 페이지 여부 |
8. 프로젝트 등록 현황 조회
8.1. GET: 대회 팀별 프로젝트 등록 현황 조회
| Parameter | Description |
|---|---|
|
대회의 고유 ID |
| Name | Description |
|---|---|
|
Bearer admin.access.token |
GET /contests/1/submissions HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 521
[ {
"teamId" : 1,
"teamName" : "딥러닝 드리머즈",
"projectName" : "AI 음성 번역기",
"trackName" : "소프트웨어/인공지능",
"isSubmitted" : true
}, {
"teamId" : 2,
"teamName" : "패킷 마스터즈",
"projectName" : "실시간 트래픽 분석기",
"trackName" : "네트워크/통신",
"isSubmitted" : true
}, {
"teamId" : 3,
"teamName" : "시큐리티 가디언즈",
"projectName" : "IoT 취약점 스캐너",
"trackName" : "하드웨어/보안",
"isSubmitted" : false
} ]
| Path | Type | Description |
|---|---|---|
|
|
팀별 프로젝트 등록 현황 목록 |
|
|
팀 ID |
|
|
팀명 |
|
|
프로젝트명 |
|
|
트랙/분과명 |
|
|
프로젝트 제출 여부 |
8.1.1. ⚠️ 실패 케이스
❌ Case 1: 존재하지 않는 대회
| Parameter | Description |
|---|---|
|
존재하지 않는 대회 ID |
GET /contests/999/submissions HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 56
{
"message" : "존재하지 않는 대회입니다."
}
9. 투표 랭킹 조회
9.1. GET: 대회 투표 랭킹 조회
| Parameter | Description |
|---|---|
|
대회의 고유 ID |
| Name | Description |
|---|---|
|
Bearer admin.access.token |
GET /contests/1/ranking HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 595
[ {
"rank" : 1,
"teamId" : 10,
"teamName" : "팀 A",
"projectName" : "AI 번역기",
"trackName" : "AI 트랙",
"voteCount" : 150
}, {
"rank" : 2,
"teamId" : 11,
"teamName" : "팀 B",
"projectName" : "헬스 분석기",
"trackName" : "헬스케어 트랙",
"voteCount" : 120
}, {
"rank" : 2,
"teamId" : 12,
"teamName" : "팀 C",
"projectName" : "노인 케어봇",
"trackName" : "AI 트랙",
"voteCount" : 120
}, {
"rank" : 4,
"teamId" : 13,
"teamName" : "팀 D",
"projectName" : "감정 분석기",
"trackName" : "AI 트랙",
"voteCount" : 85
} ]
| Path | Type | Description |
|---|---|---|
|
|
팀 랭킹 목록 |
|
|
투표 기준 순위 (Ranking) 예: 1-2-2-4 |
|
|
팀 ID |
|
|
팀명 |
|
|
프로젝트명 |
|
|
트랙/분과명 |
|
|
투표 수 |
9.1.1. ⚠️ 실패 케이스
❌ Case 1: 존재하지 않는 대회
| Parameter | Description |
|---|---|
|
존재하지 않는 대회 ID |
GET /contests/999/ranking HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 56
{
"message" : "존재하지 않는 대회입니다."
}
10. 투표 집계 조회
10.1. GET: 대회 투표 집계 조회
| Parameter | Description |
|---|---|
|
대회의 고유 ID |
| Name | Description |
|---|---|
|
Bearer admin.access.token |
GET /contests/1/votes/statistics HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 79
{
"totalVotes" : 366,
"totalVoters" : 249,
"averageVotesPerVoter" : 1.5
}
| Path | Type | Description |
|---|---|---|
|
|
총 투표 수 |
|
|
투표한 사람 수 |
|
|
1인당 평균 투표 수 |
10.1.1. ⚠️ 실패 케이스
❌ Case 1: 존재하지 않는 대회
| Parameter | Description |
|---|---|
|
존재하지 않는 대회 ID |
GET /contests/999/votes/statistics HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 56
{
"message" : "존재하지 않는 대회입니다."
}
11. 대회 팀 템플릿 설정 관리
11.1. GET: 대회의 템플릿 조회
| Parameter | Description |
|---|---|
|
대회 ID |
GET /contests/1/template HTTP/1.1
Host: localhost:8080
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 359
{
"trackRequired" : true,
"projectNameRequired" : true,
"teamNameRequired" : true,
"leaderRequired" : true,
"teamMembersRequired" : true,
"professorRequired" : true,
"githubPathRequired" : true,
"youTubePathRequired" : true,
"productionPathRequired" : true,
"overviewRequired" : true,
"posterRequired" : true,
"imagesRequired" : true
}
| Path | Type | Description |
|---|---|---|
|
|
트랙/분과 필수 여부 |
|
|
프로젝트명 필수 여부 |
|
|
팀명 필수 여부 |
|
|
팀장 필수 여부 |
|
|
팀원 필수 여부 |
|
|
지도교수 필수 여부 |
|
|
GitHub 링크 필수 여부 |
|
|
YouTube 링크 필수 여부 |
|
|
배포 링크 필수 여부 |
|
|
프로젝트 개요 필수 여부 |
|
|
포스터 필수 여부 |
|
|
이미지 필수 여부 |
11.1.1. ⚠️ 실패 케이스
❌ Case 1: 존재하지 않는 대회
| Parameter | Description |
|---|---|
|
존재하지 않는 대회 ID |
GET /contests/999/template HTTP/1.1
Host: localhost:8080
HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 56
{
"message" : "존재하지 않는 대회입니다."
}
11.2. PUT: 대회의 템플릿 수정
| Parameter | Description |
|---|---|
|
대회 ID |
| Name | Description |
|---|---|
|
Bearer admin.access.token |
| Path | Type | Description |
|---|---|---|
|
|
트랙/분과 필수 여부 |
|
|
프로젝트명 필수 여부 |
|
|
팀명 필수 여부 |
|
|
팀장 필수 여부 |
|
|
팀원 필수 여부 |
|
|
지도교수 필수 여부 |
|
|
GitHub 링크 필수 여부 |
|
|
YouTube 링크 필수 여부 |
|
|
배포 링크 필수 여부 |
|
|
프로젝트 개요 필수 여부 |
|
|
포스터 필수 여부 |
|
|
이미지 필수 여부 |
PUT /contests/1/template HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 371
Host: localhost:8080
{
"trackRequired" : false,
"projectNameRequired" : false,
"teamNameRequired" : false,
"leaderRequired" : false,
"teamMembersRequired" : false,
"professorRequired" : false,
"githubPathRequired" : false,
"youTubePathRequired" : false,
"productionPathRequired" : false,
"overviewRequired" : false,
"posterRequired" : false,
"imagesRequired" : false
}
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
11.2.1. ⚠️ 실패 케이스
❌ Case 1: 존재하지 않는 대회
| Parameter | Description |
|---|---|
|
존재하지 않는 대회 ID |
PUT /contests/999/template HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 371
Host: localhost:8080
{
"trackRequired" : false,
"projectNameRequired" : false,
"teamNameRequired" : false,
"leaderRequired" : false,
"teamMembersRequired" : false,
"professorRequired" : false,
"githubPathRequired" : false,
"youTubePathRequired" : false,
"productionPathRequired" : false,
"overviewRequired" : false,
"posterRequired" : false,
"imagesRequired" : false
}
HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 56
{
"message" : "존재하지 않는 대회입니다."
}
12. 대회 전체 팀 조회
12.1. GET: 대회의 팀 목록 조회 (비회원용)
비회원용 메인 페이지 API입니다. isLiked`와 `isVoted 값이 항상 false 입니다.
|
| Parameter | Description |
|---|---|
|
대회의 고유 ID |
GET /contests/1/teams/public HTTP/1.1
Host: localhost:8080
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 410
[ {
"teamId" : 1,
"teamName" : "team1",
"projectName" : "team1 Project",
"isLiked" : false,
"isVoted" : false,
"awards" : [ {
"awardName" : "대상",
"awardColor" : "#FF0000"
}, {
"awardName" : "우수상",
"awardColor" : "#00A3FF"
} ]
}, {
"teamId" : 2,
"teamName" : "team2",
"projectName" : "team2 Project",
"isLiked" : false,
"isVoted" : false,
"awards" : [ ]
} ]
| Path | Type | Description |
|---|---|---|
|
|
팀 목록 |
|
|
팀 ID |
|
|
팀명 |
|
|
프로젝트명 |
|
|
좋아요 여부 (항상 false) |
|
|
투표 여부 (항상 false) |
|
|
수상 목록 |
|
|
수상명 |
|
|
수상 색상 |
12.2. GET: 대회의 팀 목록 조회 (회원용 - 미투표 기간)
회원만 접근 가능한 메인 페이지용 API입니다. 미투표 기간에는 로그인한 사용자의 isLiked 여부가 포함됩니다.
|
| Parameter | Description |
|---|---|
|
대회의 고유 ID |
| Name | Description |
|---|---|
|
Bearer member.access.token |
GET /contests/1/teams HTTP/1.1
Authorization: Bearer member.access.token
Host: localhost:8080
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 342
[ {
"teamId" : 1,
"teamName" : "team1",
"projectName" : "team1 Project",
"isLiked" : true,
"isVoted" : false,
"awards" : [ {
"awardName" : "대상",
"awardColor" : "#FF0000"
} ]
}, {
"teamId" : 2,
"teamName" : "team2",
"projectName" : "team2 Project",
"isLiked" : false,
"isVoted" : false,
"awards" : [ ]
} ]
| Path | Type | Description |
|---|---|---|
|
|
팀 목록 |
|
|
팀 ID |
|
|
팀명 |
|
|
프로젝트명 |
|
|
좋아요 여부 (투표 기간인 경우 false, 회원은 로그인한 사용자의 좋아요 여부에 따라) |
|
|
투표 여부 (투표 기간이 아닌 경우 false, 회원은 로그인한 사용자의 투표 여부에 따라) |
|
|
수상 목록 |
|
|
수상명 |
|
|
수상 색상 |
12.3. GET: 대회의 팀 목록 조회 (회원용 - 투표 기간)
회원만 접근 가능한 메인 페이지용 API입니다. 투표 기간에는 로그인한 사용자의 isVoted 여부가 포함됩니다.
|
| Parameter | Description |
|---|---|
|
대회의 고유 ID |
| Name | Description |
|---|---|
|
Bearer member.access.token |
GET /contests/1/teams HTTP/1.1
Authorization: Bearer member.access.token
Host: localhost:8080
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 342
[ {
"teamId" : 1,
"teamName" : "team1",
"projectName" : "team1 Project",
"isLiked" : false,
"isVoted" : true,
"awards" : [ {
"awardName" : "대상",
"awardColor" : "#FF0000"
} ]
}, {
"teamId" : 2,
"teamName" : "team2",
"projectName" : "team2 Project",
"isLiked" : false,
"isVoted" : false,
"awards" : [ ]
} ]
| Path | Type | Description |
|---|---|---|
|
|
팀 목록 |
|
|
팀 ID |
|
|
팀명 |
|
|
프로젝트명 |
|
|
좋아요 여부 (투표 기간인 경우 false, 회원은 로그인한 사용자의 좋아요 여부에 따라) |
|
|
투표 여부 (투표 기간이 아닌 경우 false, 회원은 로그인한 사용자의 투표 여부에 따라) |
|
|
수상 목록 |
|
|
수상명 |
|
|
수상 색상 |
12.3.1. ⚠️ 실패 케이스
❌ Case 1: 존재하지 않는 대회 ID
GET /contests/999/teams HTTP/1.1
Authorization: Bearer member.access.token
Host: localhost:8080
HTTP/1.1 404 Not Found
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 56
{
"message" : "존재하지 않는 대회입니다."
}
| Parameter | Description |
|---|---|
|
존재하지 않는 대회 ID |