1. API 목록
2. 팀 이미지 관리
2.1. GET: 팀 포스터 이미지 조회
GET /teams/1/image/posters 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
| Parameter | Description |
|---|---|
|
팀 ID |
2.1.1. ⚠️ 실패 케이스
❌ Case 1: 등록되지 않은 이미지
GET /teams/1/image/posters 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 2: 변환 중인 이미지
GET /teams/1/image/posters 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" : "이미지 변환중 입니다"
}
2.2. POST: 팀 포스터 이미지 등록
POST /teams/1/image/posters 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=image; filename=poster.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
| Parameter | Description |
|---|---|
|
팀 ID |
| Name | Description |
|---|---|
|
Bearer (teamLeader/admin/teamMember).access.token |
| Part | Description |
|---|---|
|
등록할 포스터 이미지 (모든 이미지 형식 지원) |
2.3. DELETE: 팀 포스터 이미지 삭제
DELETE /teams/1/image/posters HTTP/1.1
Authorization: Bearer member.access.token
Host: localhost:8080
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
| Parameter | Description |
|---|---|
|
팀 ID |
| Name | Description |
|---|---|
|
Bearer (teamLeader/admin/teamMember).access.token |
2.4. GET: 팀 썸네일 이미지 조회
| 팀 썸네일 조회 시 우선순위: [팀 전용 썸네일] > [분과 기본 썸네일] > [시스템 기본 썸네일] 순으로 조회됩니다. 따라서 별도로 등록한 팀 썸네일이 없더라도 기본 이미지가 반환됩니다. |
GET /teams/1/image/thumbnail 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
| Parameter | Description |
|---|---|
|
팀 ID |
2.4.1. ⚠️ 실패 케이스
❌ Case 1: 등록되지 않은 이미지
GET /teams/1/image/thumbnail 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 2: 변환 중인 이미지
GET /teams/1/image/thumbnail 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" : "이미지 변환중 입니다"
}
2.5. POST: 팀 썸네일 이미지 등록
POST /teams/1/image/thumbnail 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=image; filename=thumbnail.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
| Parameter | Description |
|---|---|
|
팀 ID |
| Name | Description |
|---|---|
|
Bearer (teamLeader/admin/teamMember).access.token |
| Part | Description |
|---|---|
|
등록할 썸네일 이미지 (모든 이미지 형식 지원) |
2.6. DELETE: 팀 썸네일 이미지 삭제
DELETE /teams/1/image/thumbnail HTTP/1.1
Authorization: Bearer member.access.token
Host: localhost:8080
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
| Parameter | Description |
|---|---|
|
팀 ID |
| Name | Description |
|---|---|
|
Bearer (teamLeader/admin/teamMember).access.token |
2.7. GET: 팀 프리뷰 이미지 조회
GET /teams/1/image/100 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
| Parameter | Description |
|---|---|
|
팀 ID |
|
프리뷰 이미지 ID |
2.7.1. ⚠️ 실패 케이스
❌ Case 1: 존재하지 않는 이미지
GET /teams/1/image/999 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: 82
{
"message" : "존재하지 않는 팀 프리뷰 ID 를 요청하였습니다"
}
❌ Case 2: 변환 중인 이미지
GET /teams/1/image/100 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" : "이미지 변환중 입니다"
}
❌ Case 3: 물리적 파일이 존재하지 않음
GET /teams/1/image/100 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: 65
{
"message" : "물리적 파일이 존재하지 않습니다"
}
2.8. POST: 팀 프리뷰 이미지 등록
POST /teams/1/image 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=images; filename=preview1.png
Content-Type: image/png
test-image-content
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=images; filename=preview2.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
| Parameter | Description |
|---|---|
|
팀 ID |
| Name | Description |
|---|---|
|
Bearer (teamLeader/admin/teamMember).access.token |
| Part | Description |
|---|---|
|
등록할 프리뷰 이미지 목록 (리스트) |
2.8.1. ⚠️ 실패 케이스
❌ Case 1: 이미지 개수 초과 (5개 초과)
POST /teams/1/image 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=images; filename=preview1.png
Content-Type: image/png
test-image-content
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
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: 63
{
"message" : "프리뷰 이미지는 6장 이하입니다"
}
2.9. DELETE: 팀 프리뷰 이미지 삭제
DELETE /teams/1/image HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer member.access.token
Content-Length: 31
Host: localhost:8080
{
"imageIds" : [ 100, 101 ]
}
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
| Parameter | Description |
|---|---|
|
팀 ID |
| Name | Description |
|---|---|
|
Bearer (teamLeader/admin/teamMember).access.token |
| Path | Type | Description |
|---|---|---|
|
|
삭제할 프리뷰 이미지 ID 리스트 |
3. 팀 정보 관리
3.1. POST: 팀 등록
POST /teams HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 333
Host: localhost:8080
{
"contestId" : 1,
"trackId" : 10,
"projectName" : "프로젝트명",
"teamName" : "팀 이름",
"professorName" : "이도훈",
"githubPath" : "https://github.com/team1/project",
"youTubePath" : "https://youtube.com/watch?v=demo1",
"productionPath" : "https://ditto.pnu.app",
"overview" : "team1 project overview"
}
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: 18
{
"teamId" : 1
}
| Name | Description |
|---|---|
|
Bearer admin.access.token |
| Path | Type | Description |
|---|---|---|
|
|
대회 ID |
|
|
분과 ID (선택) |
|
|
프로젝트명 (선택) |
|
|
팀명 (선택) |
|
|
지도 교수 이름 (선택) |
|
|
GitHub 링크 (선택) |
|
|
YouTube 링크 (선택) |
|
|
배포 주소 링크 (선택) |
|
|
프로젝트 설명 (선택) |
| Path | Type | Description |
|---|---|---|
|
|
생성된 팀 ID |
3.1.1. ⚠️ 실패 케이스
❌ Case 1: 요청 바디 오류
POST /teams HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 210
Host: localhost:8080
{
"contestId" : null,
"trackId" : null,
"projectName" : null,
"teamName" : null,
"professorName" : null,
"githubPath" : null,
"youTubePath" : null,
"productionPath" : null,
"overview" : null
}
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
❌ Case 2: 존재하지 않는 대회 ID
POST /teams HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 209
Host: localhost:8080
{
"contestId" : 999,
"trackId" : null,
"projectName" : null,
"teamName" : null,
"professorName" : null,
"githubPath" : null,
"youTubePath" : null,
"productionPath" : null,
"overview" : null
}
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 3: 존재하지 않는 분과 ID
POST /teams HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 206
Host: localhost:8080
{
"contestId" : 1,
"trackId" : 999,
"projectName" : null,
"teamName" : null,
"professorName" : null,
"githubPath" : null,
"youTubePath" : null,
"productionPath" : null,
"overview" : null
}
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 4: 해당 대회에 속하지 않은 분과 ID
POST /teams HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 204
Host: localhost:8080
{
"contestId" : 1,
"trackId" : 2,
"projectName" : null,
"teamName" : null,
"professorName" : null,
"githubPath" : null,
"youTubePath" : null,
"productionPath" : null,
"overview" : null
}
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: 70
{
"message" : "해당 대회에 속하지 않는 분과입니다."
}
3.2. PATCH: 팀 수정
팀의 상세 정보를 수정합니다. 관리자, 팀장, 팀원이 수정할 수 있습니다. 입력 필드의 필수 여부는 대회의 팀 상세 템플릿 설정(boolean) 에 따라 결정됩니다.
📌 권한별 수정 규칙
-
관리자
-
일부 필드만 수정하는 부분 수정 가능
-
템플릿에서 Required=true 인 필드를 모두 입력하지 않아도 저장 가능
-
contestId, trackId 변경 가능
-
-
해당 팀의 팀장 / 팀원
-
템플릿에서 Required=true 인 모든 필드를 반드시 포함해야 저장 가능
-
contestId, trackId 변경 불가
-
PATCH /teams/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer member.access.token
Content-Length: 345
Host: localhost:8080
{
"contestId" : 1,
"trackId" : 10,
"projectName" : "AI 기반 추천 시스템",
"teamName" : "Team A",
"professorName" : "이도훈",
"githubPath" : "https://github.com/teamA/project",
"youTubePath" : "https://youtube.com/watch?v=demo1",
"productionPath" : "https://teamA-demo.app",
"overview" : "프로젝트 설명 수정"
}
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
| Parameter | Description |
|---|---|
|
팀 ID |
| Name | Description |
|---|---|
|
Bearer (teamLeader/admin/teamMember).access.token |
| Path | Type | Description |
|---|---|---|
|
|
대회 ID (관리자만 변경 가능, 멤버는 변경 불가) |
|
|
분과 ID (관리자만 변경 가능, 멤버는 변경 불가) |
|
|
프로젝트명 |
|
|
팀명 |
|
|
지도 교수 이름 |
|
|
GitHub 링크 |
|
|
YouTube 링크 |
|
|
배포 링크 |
|
|
프로젝트 설명 |
3.2.1. ⚠️ 실패 케이스
❌ Case 1: 팀장/팀원 권한으로 필수 필드 누락
PATCH /teams/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer member.access.token
Content-Length: 326
Host: localhost:8080
{
"contestId" : null,
"trackId" : null,
"projectName" : null,
"teamName" : "Team A",
"professorName" : "이도훈",
"githubPath" : "https://github.com/teamA/project",
"youTubePath" : "https://youtube.com/watch?v=demo1",
"productionPath" : "https://teamA-demo.app",
"overview" : "프로젝트 설명 수정"
}
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: 79
{
"message" : "팀 상세보기의 필수 항목이 누락되었습니다."
}
❌ Case 2: 팀장/팀원 권한으로 contestId/trackId 변경 시도
PATCH /teams/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer member.access.token
Content-Length: 207
Host: localhost:8080
{
"contestId" : 2,
"trackId" : null,
"projectName" : null,
"teamName" : null,
"professorName" : null,
"githubPath" : null,
"youTubePath" : null,
"productionPath" : null,
"overview" : null
}
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: 71
{
"message" : "대회 또는 분과는 변경할 수 없습니다."
}
❌ Case 3: 해당 팀에 대한 수정 권한 없음 (관리자 또는 해당 팀의 팀장/팀원만 수정 가능)
PATCH /teams/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer member.access.token
Content-Length: 231
Host: localhost:8080
{
"contestId" : null,
"trackId" : null,
"projectName" : "프로젝트",
"teamName" : "팀명",
"professorName" : "교수명",
"githubPath" : null,
"youTubePath" : null,
"productionPath" : null,
"overview" : null
}
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: 57
{
"message" : "해당 팀의 팀원이 아닙니다."
}
3.3. DELETE: 팀 삭제
DELETE /teams/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
| Parameter | Description |
|---|---|
|
팀 ID |
| Name | Description |
|---|---|
|
Bearer admin.access.token |
3.3.1. ⚠️ 실패 케이스
❌ Case 1: 존재하지 않는 팀
DELETE /teams/999 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: 53
{
"message" : "팀이 존재하지 않습니다."
}
3.4. GET: 팀 상세 조회 (비회원용)
해당 팀의 상세 정보를 조회합니다. 비회원 전용 상세 조회 API입니다. 비회원은 좋아요 및 투표 정보를 확인할 수 없기 때문에:
-
isLiked: 항상false -
isVoted: 항상false
또한, 상세 이미지 조회를 위한 previewIds 배열을 함께 반환합니다.
-
반환된 previewIds로
/teams/{teamId}/image/{imageId}호출 -
posters 조회는
/teams/{teamId}/image/posters
GET /teams/1/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: 818
{
"contestId" : 1,
"contestName" : "제6회 PNU 창의융합 SW 해커톤",
"trackId" : 10,
"trackName" : "해커톤",
"teamId" : 1,
"teamName" : "team1",
"projectName" : "team1 Project",
"teamMembers" : [ {
"memberId" : 1,
"teamMemberName" : "이지민",
"roleType" : "ROLE_팀장"
}, {
"memberId" : 2,
"teamMemberName" : "김철수",
"roleType" : "ROLE_팀원"
} ],
"professorName" : "이도훈",
"githubPath" : "https://github.com/team1/project",
"youTubePath" : "https://youtube.com/watch?v=demo1",
"productionPath" : "https://ditto.pnu.app",
"overview" : "team1 project overview",
"previewIds" : [ 101, 102, 103 ],
"isLiked" : false,
"isVoted" : false,
"awards" : [ {
"awardId" : 1,
"awardName" : "대상",
"awardColor" : "#FF0000"
} ]
}
| Parameter | Description |
|---|---|
|
팀 ID |
| Path | Type | Description |
|---|---|---|
|
|
대회 ID |
|
|
대회명 |
|
|
분과 ID |
|
|
분과 이름 |
|
|
팀 ID |
|
|
팀명 |
|
|
프로젝트명 |
|
|
팀원 목록 |
|
|
팀원 ID |
|
|
팀원 이름 |
|
|
팀원 권한 (ROLE_팀장, ROLE_팀원) |
|
|
지도 교수 이름 |
|
|
GitHub 링크 |
|
|
YouTube 링크 |
|
|
배포 링크 |
|
|
프로젝트 소개 |
|
|
상세 이미지 ID 목록 |
|
|
좋아요 여부 (항상 false) |
|
|
투표 여부 (항상 false) |
|
|
수상 목록 |
|
|
수상 ID |
|
|
수상명 |
|
|
수상 색상 |
3.5. GET: 팀 상세 조회 (회원용)
해당 팀의 상세 정보를 조회합니다.
회원 전용 상세 조회 API입니다.
현재 시간(투표 기간 여부)에 따라 isLiked, isVoted 값이 달라집니다.
-
현재가 투표 기간인 경우
-
isVoted: 로그인한 사용자의 투표 여부 -
isLiked:false -
현재가 투표 기간이 아닌 경우
-
isVoted:false -
isLiked: 로그인한 사용자의 좋아요 여부
또한, 상세 이미지 조회를 위한 previewIds 배열을 함께 반환합니다.
-
반환된 previewIds로
/teams/{teamId}/image/{imageId}호출 -
posters 조회는
/teams/{teamId}/image/posters
GET /teams/1 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: 817
{
"contestId" : 1,
"contestName" : "제6회 PNU 창의융합 SW 해커톤",
"trackId" : 10,
"trackName" : "해커톤",
"teamId" : 1,
"teamName" : "team1",
"projectName" : "team1 Project",
"teamMembers" : [ {
"memberId" : 1,
"teamMemberName" : "이지민",
"roleType" : "ROLE_팀장"
}, {
"memberId" : 2,
"teamMemberName" : "김철수",
"roleType" : "ROLE_팀원"
} ],
"professorName" : "이도훈",
"githubPath" : "https://github.com/team1/project",
"youTubePath" : "https://youtube.com/watch?v=demo1",
"productionPath" : "https://ditto.pnu.app",
"overview" : "team1 project overview",
"previewIds" : [ 101, 102, 103 ],
"isLiked" : false,
"isVoted" : true,
"awards" : [ {
"awardId" : 1,
"awardName" : "대상",
"awardColor" : "#FF0000"
} ]
}
| Parameter | Description |
|---|---|
|
팀 ID |
| Name | Description |
|---|---|
|
Bearer %s.access.token |
| Path | Type | Description |
|---|---|---|
|
|
대회 ID |
|
|
대회명 |
|
|
분과 ID |
|
|
분과 이름 |
|
|
팀 ID |
|
|
팀명 |
|
|
프로젝트명 |
|
|
팀원 목록 |
|
|
팀원 ID |
|
|
팀원 이름 |
|
|
팀원 권한 (ROLE_팀장, ROLE_팀원) |
|
|
지도 교수 이름 |
|
|
GitHub 링크 |
|
|
YouTube 링크 |
|
|
배포 링크 |
|
|
프로젝트 소개 |
|
|
상세 이미지 ID 목록 |
|
|
좋아요 여부 (투표 기간 아닐 때만 유효, 투표 기간엔 false) |
|
|
투표 여부 (투표 기간일 때만 유효, 투표 기간 아닐 땐 false) |
|
|
수상 목록 |
|
|
수상 ID |
|
|
수상명 |
|
|
수상 색상 |