1. API 목록

2. POST: 대회 카테고리 생성

Table 1. HTTP Request Headers
Name Description

Authorization

Bearer {accessToken} (관리자)

HTTP Request
POST /categories HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 34
Host: localhost:8080

{
  "categoryName" : "캡스톤"
}
HTTP Response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Table 2. Request Fields
Path Type Description

categoryName

String

카테고리 이름

2.1. ⚠️ 실패 케이스

❌ Case 1: 동일한 카테고리 이름 존재
POST /categories HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 34
Host: localhost:8080

{
  "categoryName" : "캡스톤"
}
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: 62

{
  "message" : "동일한 카테고리명이 있습니다."
}
Path Type Description

categoryName

String

이미 존재하는 카테고리 이름

3. PATCH: 대회 카테고리 수정

대회 카테고리 생성과 동일하게 이미 저장되어 있는 카테고리 이름은 저장 불가
Table 3. HTTP Request Headers
Name Description

Authorization

Bearer {accessToken} (관리자)

Table 4. /categories/{categoryId}
Parameter Description

categoryId

카테고리 ID

HTTP Request
PATCH /categories/1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 34
Host: localhost:8080

{
  "categoryName" : "캡스톤"
}
HTTP Response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Table 5. Request Fields
Path Type Description

categoryName

String

카테고리 이름

4. DELETE: 대회 카테고리 삭제

Table 6. HTTP Request Headers
Name Description

Authorization

Bearer {accessToken} (관리자)

Table 7. /categories/{categoryId}
Parameter Description

categoryId

카테고리 ID

HTTP Request
DELETE /categories/1 HTTP/1.1
Authorization: Bearer admin.access.token
Host: localhost:8080
HTTP Response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers

5. GET: 대회 카테고리 목록 조회

HTTP Request
GET /categories HTTP/1.1
Host: localhost:8080
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: 214

[ {
  "categoryId" : 1,
  "categoryName" : "해커톤",
  "updatedAt" : "2026-06-29T00:21:33.17458965"
}, {
  "categoryId" : 2,
  "categoryName" : "자유대회",
  "updatedAt" : "2026-06-29T00:21:33.174599938"
} ]
Table 8. Response Body’s Fields
Path Type Description

[]

Array

대회 카테고리 목록

[].categoryId

Number

카테고리 ID

[].categoryName

String

카테고리 이름

[].updatedAt

String

수정 일시 (ISO-8601)

6. GET: 메인페이지 사이드바 조회

모든 카테고리를 대회 목록과 함께 반환합니다. 대회가 없는 카테고리는 contests 가 빈 배열로 반환됩니다.
HTTP Request
GET /sidebar HTTP/1.1
Host: localhost:8080
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: 394

[ {
  "categoryId" : 1,
  "categoryName" : "창의융합 SW해커톤",
  "contests" : [ {
    "contestId" : 4,
    "contestName" : "제6회 PNU 창의융합 SW해커톤",
    "isCurrent" : true
  }, {
    "contestId" : 3,
    "contestName" : "제5회 PNU 창의융합 SW해커톤",
    "isCurrent" : false
  } ]
}, {
  "categoryId" : 2,
  "categoryName" : "졸업과제",
  "contests" : [ ]
} ]
Table 9. Response Body’s Fields
Path Type Description

[]

Array

카테고리 목록

[].categoryId

Number

카테고리 ID

[].categoryName

String

카테고리 이름

[].contests[]

Array

해당 카테고리의 대회 목록 (대회가 없으면 빈 배열)

[].contests[].contestId

Number

대회 ID

[].contests[].contestName

String

대회 이름

[].contests[].isCurrent

Boolean

현재 진행 중인 대회 여부