1. API 목록

2. POST: 팀원 추가

Table 1. /teams/{teamId}/members
Parameter Description

teamId

팀 ID

Table 2. HTTP Request Headers
Name Description

Authorization

Bearer {accessToken} (관리자)

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

{
  "memberName" : "이옵스",
  "memberStudentId" : "202612345",
  "roleType" : "ROLE_팀원"
}
HTTP Response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Table 3. Request Fields
Path Type Description

memberName

String

추가할 팀원 이름

memberStudentId

String

추가할 팀원 학번

roleType

String

추가할 팀원의 역할(ROLE_팀장, ROLE_팀원)

2.1. ⚠️ 실패 케이스

❌ Case 1: 팀원명이 비어있음
POST /teams/1/members HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 88
Host: localhost:8080

{
  "memberName" : "",
  "memberStudentId" : "202612345",
  "roleType" : "ROLE_팀원"
}
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: 90

{
  "message" : "[memberName]  : 추가할 팀원명은 비어 있을 수 없습니다."
}
Path Type Description

memberName

String

비어있는 팀원명

memberStudentId

String

팀원 학번

roleType

String

추가할 팀원의 역할(ROLE_팀장, ROLE_팀원)

❌ Case 2: 팀원학번이 비어있음
POST /teams/1/members HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 88
Host: localhost:8080

{
  "memberName" : "이옵스",
  "memberStudentId" : "",
  "roleType" : "ROLE_팀원"
}
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: 162

{
  "message" : "[memberStudentId]  : 학번은 9자리 숫자여야 합니다., [memberStudentId]  : 추가할 팀원학번은 비어 있을 수 없습니다."
}
Path Type Description

memberName

String

팀원명

memberStudentId

String

비어있는 팀원 학번

roleType

String

추가할 팀원의 역할(ROLE_팀장, ROLE_팀원)

❌ Case 3: 존재하지 않는 팀 ID
POST /teams/999/members HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 97
Host: localhost:8080

{
  "memberName" : "이옵스",
  "memberStudentId" : "202612345",
  "roleType" : "ROLE_팀원"
}
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" : "팀이 존재하지 않습니다."
}
Path Type Description

memberName

String

팀원명

memberStudentId

String

팀원 학번

roleType

String

추가할 팀원의 역할(ROLE_팀장, ROLE_팀원)

❌ Case 4: 팀원명과 팀원학번이 맞지 않음
POST /teams/1/members HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 97
Host: localhost:8080

{
  "memberName" : "이옵스",
  "memberStudentId" : "202612345",
  "roleType" : "ROLE_팀원"
}
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: 76

{
  "message" : "입력한 학번과 이름이 일치하지 않습니다."
}
Path Type Description

memberName

String

팀원명 (학번과 일치하지 않음)

memberStudentId

String

팀원 학번 (이름과 일치하지 않음)

roleType

String

추가할 팀원의 역할(ROLE_팀장, ROLE_팀원)

❌ Case 5: 동일한 참가자명 + 학번이 해당 팀에 이미 존재
POST /teams/1/members HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer admin.access.token
Content-Length: 97
Host: localhost:8080

{
  "memberName" : "이옵스",
  "memberStudentId" : "202612345",
  "roleType" : "ROLE_팀원"
}
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: 60

{
  "message" : "이미 팀에 등록된 팀원입니다."
}
Path Type Description

memberName

String

이미 등록된 팀원명

memberStudentId

String

이미 등록된 팀원 학번

roleType

String

추가할 팀원의 역할(ROLE_팀장, ROLE_팀원)

3. DELETE: 팀원 삭제

Table 4. /teams/{teamId}/members/{memberId}
Parameter Description

teamId

팀 ID

memberId

회원 ID

Table 5. HTTP Request Headers
Name Description

Authorization

Bearer {accessToken} (관리자)

HTTP Request
DELETE /teams/1/members/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

3.1. ⚠️ 실패 케이스

❌ Case 1: 존재하지 않는 팀 ID
DELETE /teams/999/members/1 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" : "팀이 존재하지 않습니다."
}
Table 6. /teams/{teamId}/members/{memberId}
Parameter Description

teamId

존재하지 않는 팀 ID

memberId

회원 ID

❌ Case 2: 존재하지 않는 멤버 ID
DELETE /teams/1/members/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: 54

{
  "message" : "회원을 찾을 수 없습니다."
}
Table 7. /teams/{teamId}/members/{memberId}
Parameter Description

teamId

팀 ID

memberId

존재하지 않는 회원 ID

❌ Case 3: 삭제 대상 팀원이 해당 팀에 없음
DELETE /teams/1/members/1 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: 57

{
  "message" : "해당 팀의 팀원이 아닙니다."
}
Table 8. /teams/{teamId}/members/{memberId}
Parameter Description

teamId

팀 ID

memberId

해당 팀에 속하지 않은 회원 ID