1. API 목록

2. 제출물 상세 조회

2.1. GET: 제출물 상세 조회

한 팀이 특정 제출물 종류로 낸 제출 한 건의 상세 정보를 조회합니다. ROLE_학생`은 해당 팀의 팀장/팀원만 조회할 수 있으며, 관리자/교수/직원/외부멘토는 제한이 없습니다. `status`는 계산값으로, 단건 조회에서는 `SUBMITTED(마감 내) / LATE(마감 후)만 반환됩니다. `commentCount`는 제출물 코멘트 기능 추가 전까지 항상 0입니다.

HTTP Request
GET /contests/1/submissions/12 HTTP/1.1
Authorization: Bearer member.access.token
Host: localhost:8080
Table 1. /contests/{contestId}/submissions/{submissionId}
Parameter Description

contestId

대회 ID

submissionId

제출 ID

Table 2. Request Headers
Name Description

Authorization

Bearer member.access.token

HTTP Response
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
}
Table 3. Response Fields
Path Type Description

submissionId

Number

제출 ID

teamId

Number

팀 ID

teamName

String

팀 이름

projectOverview

String

프로젝트 설명

trackName

String

분과명 (분과 미지정 시 null)

submissionTypeName

String

제출물 종류명

status

String

제출 상태(계산값) - 단건 조회에서는 SUBMITTED / LATE

deadlineAt

String

제출 마감일시 (ISO-8601)

firstSubmittedAt

String

최초 제출일시 (ISO-8601)

lastModifiedAt

String

마지막 수정일시 (ISO-8601)

files[]

Array

업로드된 파일 목록

files[].fileId

Number

파일 ID

files[].fileName

String

파일명

files[].fileSize

Number

파일 용량 (byte)

commentCount

Number

코멘트 개수 (코멘트 기능 추가 전까지 항상 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_학생`은 해당 팀의 팀장/팀원이어야 합니다.

HTTP Request
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--
Table 4. /contests/{contestId}/submission-items/{submissionItemId}/submissions
Parameter Description

contestId

대회 ID

submissionItemId

제출 항목 ID

Table 5. Request Headers
Name Description

Authorization

Bearer member.access.token

Table 6. Query Parameters
Parameter Description

teamId

제출하는 팀 ID

Table 7. Request Parts
Part Description

files

업로드할 파일 목록 (여러 개 가능)

HTTP Response
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
}
Table 8. Response Fields
Path Type Description

submissionId

Number

생성된 제출 ID

4. 제출 파일 추가

4.1. POST: 제출물에 파일 추가

이미 제출된 제출물에 파일을 추가합니다. 기존 파일을 포함한 총 개수가 `maxFileCount`를 초과할 수 없습니다.

HTTP Request
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--
Table 9. /contests/{contestId}/submissions/{submissionId}/files
Parameter Description

contestId

대회 ID

submissionId

제출 ID

Table 10. Request Headers
Name Description

Authorization

Bearer member.access.token

Table 11. Request Parts
Part Description

files

추가할 파일 목록 (기존 파일 포함 maxFileCount 이내)

HTTP Response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers

5. 제출 파일 삭제

5.1. DELETE: 제출물의 파일 삭제

제출물에 첨부된 파일 한 건을 삭제합니다. 마지막 남은 파일을 삭제하면 제출 자체가 취소됩니다.

HTTP Request
DELETE /contests/1/submissions/12/files/101 HTTP/1.1
Authorization: Bearer member.access.token
Host: localhost:8080
Table 12. /contests/{contestId}/submissions/{submissionId}/files/{fileId}
Parameter Description

contestId

대회 ID

submissionId

제출 ID

fileId

삭제할 파일 ID (FileDocument ID)

Table 13. Request Headers
Name Description

Authorization

Bearer member.access.token

HTTP Response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers