프로젝트의 기본 정보를 입력하는 첫 번째 단계입니다.
## 입력 필드
| 필드 | 필수 | 제한 | 설명 |
|------|------|------|------|
| **프로젝트 명** | 필수 | 최대 50자 | 프로젝트를 식별하는 이름 |
| **설명** | 선택 | 최대 200자 | 프로젝트에 대한 간단한 설명 |
| **썸네일 이미지** | 선택 | 2MB 이하, jpg/jpeg/png/bmp | 프로젝트 목록에서 표시되는 대표 이미지 |
| **민감한 컨텐츠** | 선택 | 체크박스 | 민감한 컨텐츠가 포함되어 있는지 표시 |
| **공개여부** | 필수 | 3가지 옵션 | 프로젝트의 접근 권한 수준 설정 |
## 프로젝트 명
프로젝트를 식별하는 이름을 입력합니다.
:::tip[글자 수 제한]
최대 50자까지 입력할 수 있습니다. 50자를 초과하면 유효성 오류 메시지가 표시됩니다.
:::
## 설명
프로젝트에 대한 간단한 설명을 입력합니다. 최대 200자까지 입력 가능하며, 선택 사항입니다.
## 썸네일 이미지
프로젝트 목록에서 표시되는 대표 이미지를 업로드합니다.
| 항목 | 제한 |
|------|------|
| **파일 형식** | jpg, jpeg, png, bmp |
| **파일 크기** | 2MB 이하 |
:::caution[업로드 제한]
허용되지 않는 파일 형식(gif, webp 등)이나 2MB를 초과하는 파일을 업로드하면 오류 메시지가 표시됩니다.
:::
## 민감한 컨텐츠
프로젝트에 민감한 컨텐츠가 포함된 경우 체크박스를 선택합니다. 이 설정은 프로젝트 목록에서 필터링 조건으로 사용됩니다.
## 공개여부
프로젝트의 접근 권한 수준을 설정합니다.
| 옵션 | 설명 |
|------|------|
| **전체 공개** | 워크스페이스에 포함된 모든 사용자가 내용을 볼 수 있습니다. |
| **부분 공개** | 목록에서 볼 수 있고 초대된 사용자만 내용을 볼 수 있습니다. |
| **비공개** | 초대되지 않은 사용자의 목록에 노출되지 않습니다. |
## API 흐름
"다음 단계" 버튼을 클릭하면 아래 순서로 API가 호출됩니다.
### 1. 단계별 데이터 검증 — `POST /projects/`
기본정보 데이터를 `phase: 1`과 함께 프로젝트 생성 API로 전송하여 서버 측 유효성 검증을 수행합니다.
**Request**
```json
POST /projects/
{
"phase": 1,
"title": "자동차 객체 검출 프로젝트",
"description": "COCO 데이터셋을 사용한 자동차 객체 검출 어노테이션",
"image": "data:image/png;base64,iVBOR...",
"caution": "sensitive_content",
"access_level": "public",
"category": "image"
}
```
| 필드 | 타입 | 필수 | 설명 |
|------|------|------|------|
| `phase` | `integer` | 필수 | 현재 단계 번호 (`1`) |
| `title` | `string` | 필수 | 프로젝트 명 (최대 200자) |
| `description` | `string` | 선택 | 프로젝트 설명 |
| `image` | `string` | 선택 | 썸네일 이미지 (Base64 인코딩) |
| `caution` | `string` | 선택 | 주의사항. `"sensitive_content"` 또는 빈 문자열 |
| `access_level` | `string` | 필수 | 공개여부. `"public"` \| `"partially_public"` \| `"private"` |
| `category` | `string` | 필수 | 어노테이터 카테고리. `"image"` \| `"video"` \| `"audio"` \| `"text"` \| `"pcd"` \| `"prompt"` |
**Response (201 Created)**
검증 성공 시 입력 데이터가 그대로 반환됩니다.
```json
{
"id": null,
"title": "자동차 객체 검출 프로젝트",
"description": "COCO 데이터셋을 사용한 자동차 객체 검출 어노테이션",
"image": "https://storage.example.com/thumbnails/abc123.png",
"caution": "sensitive_content",
"access_level": "public",
"category": "image"
}
```
**Error Response (400 Bad Request)**
유효성 검증 실패 시 필드별 오류 메시지가 반환됩니다.
```json
{
"title": ["이 필드는 필수 항목입니다."],
"access_level": ["유효하지 않은 선택입니다."]
}
```
### 2. 임시 저장 — `POST /drafts/`
단계별 검증이 성공하면 Draft API를 호출하여 현재까지의 데이터를 임시 저장합니다.
**Request**
```json
POST /drafts/
{
"target": "CREATE",
"data": {
"phase": 1,
"category": "image",
"title": "자동차 객체 검출 프로젝트",
"description": "COCO 데이터셋을 사용한 자동차 객체 검출 어노테이션",
"image": "https://storage.example.com/thumbnails/abc123.png",
"caution": "sensitive_content",
"access_level": "public"
}
}
```
| 필드 | 타입 | 설명 |
|------|------|------|
| `target` | `string` | 초안 대상 식별자. 프로젝트 생성의 경우 `"CREATE"` |
| `data` | `object` | 저장할 데이터. 이전 단계 데이터와 병합되어 누적 저장됨 |
| `data.phase` | `integer` | 마지막으로 완료한 단계 번호 |
| `data.category` | `string` | 어노테이터 선택 단계에서 설정한 카테고리 |
**Response (201 Created)**
```json
{
"target": "CREATE",
"data": { ... }
}
```
:::note[API 호출 순서]
"다음 단계" 클릭 시 `POST /projects/` (검증) → 성공 시 `POST /drafts/` (임시 저장) 순서로 호출됩니다. 검증 실패 시 Draft 저장은 수행되지 않습니다.
:::
## 다음 단계로 이동
프로젝트 명과 공개여부를 입력한 후 **"다음 단계"** 버튼을 클릭하면 위 API 흐름을 거쳐 [컬렉션 단계](./collection)로 이동합니다.
:::note[필수 필드]
프로젝트 명과 공개여부가 입력되지 않으면 "다음 단계" 버튼이 비활성화됩니다.
:::