1. API 목록
2. 제출물 상세 조회
2.1. GET: 제출물 상세 조회
한 팀이 특정 제출물 종류로 낸 제출 한 건의 상세 정보를 조회합니다.
ROLE_학생`은 해당 팀의 팀장/팀원만 조회할 수 있으며, 관리자/교수/직원/외부멘토는 제한이 없습니다.
`status`는 계산값으로, 단건 조회에서는 `SUBMITTED(마감 내) / LATE(마감 후)만 반환됩니다.
`commentCount`는 제출물 코멘트 기능 추가 전까지 항상 0입니다.
GET /contests/1/submissions/12 HTTP/1.1
Authorization: Bearer member.access.token
Host: localhost:8080
| Parameter | Description |
|---|---|
|
대회 ID |
|
제출 ID |
| Name | Description |
|---|---|
|
Bearer member.access.token |
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: 579
{
"submissionId" : 12,
"teamId" : 3,
"teamName" : "오퍼스",
"projectOverview" : "교내 성과 관리 플랫폼",
"trackName" : "AI/데이터",
"submissionTypeName" : "최종 발표 자료",
"status" : "SUBMITTED",
"deadlineAt" : "2026-06-05T23:59:59",
"firstSubmittedAt" : "2026-06-01T10:12:33",
"lastModifiedAt" : "2026-06-03T22:01:00",
"files" : [ {
"fileId" : 101,
"fileName" : "발표자료.pdf",
"fileSize" : 1048576
}, {
"fileId" : 102,
"fileName" : "데모영상.mp4",
"fileSize" : 20971520
} ],
"commentCount" : 0
}
| Path | Type | Description |
|---|---|---|
|
|
제출 ID |
|
|
팀 ID |
|
|
팀 이름 |
|
|
프로젝트 설명 |
|
|
분과명 (분과 미지정 시 null) |
|
|
제출물 종류명 |
|
|
제출 상태(계산값) - 단건 조회에서는 SUBMITTED / LATE |
|
|
제출 마감일시 (ISO-8601) |
|
|
최초 제출일시 (ISO-8601) |
|
|
마지막 수정일시 (ISO-8601) |
|
|
업로드된 파일 목록 |
|
|
파일 ID |
|
|
파일명 |
|
|
파일 용량 (byte) |
|
|
코멘트 개수 (코멘트 기능 추가 전까지 항상 0) |
2.2. ⚠️ 실패 케이스
❌ Case 1: 존재하지 않는 제출
GET /contests/1/submissions/999 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: 59
{
"message" : "존재하지 않는 제출물입니다."
}
3. 제출물 제출
3.1. POST: 제출물 제출
팀이 특정 제출 항목에 파일을 제출합니다. (multipart/form-data, 여러 파일 가능)
한 팀이 동일한 제출 항목에 중복 제출할 수 없으며, 파일을 추가하려면 "제출 파일 추가" API를 사용합니다.
`teamId`는 요청 파라미터로 전달하며, `ROLE_학생`은 해당 팀의 팀장/팀원이어야 합니다.
POST /contests/1/submission-items/10/submissions?teamId=3 HTTP/1.1
Content-Type: multipart/form-data;charset=UTF-8; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Authorization: Bearer member.access.token
Host: localhost:8080
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=files; filename=발표자료.pdf
Content-Type: application/pdf
file-content
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
| Parameter | Description |
|---|---|
|
대회 ID |
|
제출 항목 ID |
| Name | Description |
|---|---|
|
Bearer member.access.token |
| Parameter | Description |
|---|---|
|
제출하는 팀 ID |
| Part | Description |
|---|---|
|
업로드할 파일 목록 (여러 개 가능) |
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
Content-Length: 25
{
"submissionId" : 12
}
| Path | Type | Description |
|---|---|---|
|
|
생성된 제출 ID |
4. 제출 파일 추가
4.1. POST: 제출물에 파일 추가
이미 제출된 제출물에 파일을 추가합니다. 기존 파일을 포함한 총 개수가 `maxFileCount`를 초과할 수 없습니다.
POST /contests/1/submissions/12/files HTTP/1.1
Content-Type: multipart/form-data;charset=UTF-8; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Authorization: Bearer member.access.token
Host: localhost:8080
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=files; filename=추가자료.pdf
Content-Type: application/pdf
file-content
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
| Parameter | Description |
|---|---|
|
대회 ID |
|
제출 ID |
| Name | Description |
|---|---|
|
Bearer member.access.token |
| Part | Description |
|---|---|
|
추가할 파일 목록 (기존 파일 포함 maxFileCount 이내) |
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
5. 제출 파일 삭제
5.1. DELETE: 제출물의 파일 삭제
제출물에 첨부된 파일 한 건을 삭제합니다. 마지막 남은 파일을 삭제하면 제출 자체가 취소됩니다.
DELETE /contests/1/submissions/12/files/101 HTTP/1.1
Authorization: Bearer member.access.token
Host: localhost:8080
| Parameter | Description |
|---|---|
|
대회 ID |
|
제출 ID |
|
삭제할 파일 ID (FileDocument ID) |
| Name | Description |
|---|---|
|
Bearer member.access.token |
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers