돌아가기 2단계 - 컬렉션
라벨링 대상이 되는 데이터 컬렉션을 선택하는 단계입니다.

## 컬렉션 선택

어노테이터 카테고리에 해당하는 데이터 컬렉션 목록이 드롭다운으로 표시됩니다. 검색 기능을 사용하여 원하는 컬렉션을 찾을 수 있습니다.

:::note[컬렉션 필터링]
선택한 어노테이터 유형에 맞는 카테고리의 컬렉션만 표시됩니다. 또한 접근 권한이 있는 컬렉션만 목록에 나타납니다.
:::

## 데이터 유닛 목록

컬렉션을 선택하면 해당 컬렉션에 포함된 데이터 유닛 목록이 표시됩니다.

### 뷰 모드

데이터 유닛을 3가지 뷰 모드로 확인할 수 있습니다.

| 뷰 | 설명 | 비고 |
|----|------|------|
| **테이블** | 유닛 ID, 대표 파일명, 추가된 날짜를 열로 표시 | 기본 뷰 |
| **그리드** | 썸네일을 격자 형태로 표시 | 이미지 어노테이터만 |
| **슬라이드** | 캐러셀 형태로 이미지를 탐색 | 이미지 어노테이터만 |

### 필터 및 정렬

| 기능 | 설명 |
|------|------|
| **검색** | ID 또는 대표 파일명으로 검색 |
| **날짜 필터** | 추가된 날짜 범위로 필터링 |
| **정렬** | 등록일 기준 정렬 |

## 사이드 패널

데이터 유닛을 선택하면 우측 사이드 패널에서 상세 정보를 확인할 수 있습니다.

### 메타 정보

유닛에 포함된 메타 데이터를 키-값 형태로 표시합니다.

### 파일 정보

유닛에 포함된 파일의 상세 정보(파일 키, 원본 파일명, 파일 속성)를 표시합니다.

## 빈 상태

컬렉션에 데이터가 없거나 컬렉션을 아직 선택하지 않은 경우 안내 메시지가 표시됩니다.

| 상태 | 메시지 |
|------|--------|
| 컬렉션 미선택 | "컬렉션을 선택하세요." |
| 데이터 없음 | "데이터가 없습니다." |

## API 흐름

이 단계에서는 컬렉션 목록 조회, 데이터 유닛 조회, 그리고 "다음 단계" 클릭 시 검증 및 임시 저장 API가 호출됩니다.

### 1. 컬렉션 목록 조회 — `GET /data_collections/`

페이지 진입 시 어노테이터 카테고리에 맞는 컬렉션 목록을 조회합니다.

**Request**

```
GET /data_collections/?category={annotatorCategory}&has_permission=true
```

| 파라미터 | 타입 | 설명 |
|----------|------|------|
| `category` | `string` | 어노테이터 카테고리. 프롬프트의 경우 `text`로 변환하여 전달 |
| `has_permission` | `boolean` | `true` — 현재 사용자가 접근 권한이 있는 컬렉션만 조회 |

**Response (200 OK)**

```json
{
  "count": 15,
  "next": null,
  "previous": null,
  "results": [
    {
      "id": 1,
      "name": "COCO 2024 이미지 데이터셋",
      ...
    },
    {
      "id": 2,
      "name": "도로 주행 영상 데이터",
      ...
    }
  ]
}
```

### 2. 데이터 유닛 목록 조회 — `GET /data_units/`

컬렉션을 선택하면 해당 컬렉션의 데이터 유닛 목록을 조회합니다.

**Request**

```
GET /data_units/?data_collection={collectionId}&page={page}&page_size={pageSize}&ordering={ordering}&search={search}&created_after={date}&created_before={date}
```

| 파라미터 | 타입 | 필수 | 설명 |
|----------|------|------|------|
| `data_collection` | `integer` | 필수 | 선택한 컬렉션 ID |
| `page` | `integer` | 선택 | 페이지 번호 |
| `page_size` | `integer` | 선택 | 페이지당 항목 수 (기본 20) |
| `ordering` | `string` | 선택 | 정렬 기준 (예: `created`, `-created`) |
| `search` | `string` | 선택 | ID 또는 대표 파일명 검색어 |
| `created_after` | `datetime` | 선택 | 날짜 필터 시작 |
| `created_before` | `datetime` | 선택 | 날짜 필터 끝 |

**Response (200 OK)**

```json
{
  "count": 1200,
  "next": "/data_units/?data_collection=1&page=2",
  "previous": null,
  "results": [
    {
      "id": 101,
      "files": {
        "image": {
          "file_name_original": "car_001.jpg",
          "thumbnail": "https://storage.example.com/thumbs/car_001.jpg",
          "humanized": {
            "size": { "label": "파일 크기", "value": "2.3 MB" },
            "resolution": { "label": "해상도", "value": "1920x1080" }
          }
        }
      },
      "meta": {
        "weather": "sunny",
        "location": "Seoul"
      },
      "created": "2026-03-10T09:00:00Z"
    }
  ]
}
```

### 3. 단계별 데이터 검증 — `POST /projects/`

"다음 단계" 클릭 시 선택한 컬렉션 ID를 `phase: 2`와 함께 전송합니다.

**Request**

```json
POST /projects/

{
  "phase": 2,
  "data_collection": 1
}
```

| 필드 | 타입 | 필수 | 설명 |
|------|------|------|------|
| `phase` | `integer` | 필수 | 현재 단계 번호 (`2`) |
| `data_collection` | `integer` | 필수 | 선택한 데이터 컬렉션 ID |

**Response (201 Created)**

```json
{
  "data_collection": 1
}
```

**Error Response (400 Bad Request)**

```json
{
  "data_collection": ["유효하지 않은 pk \"999\" - 객체가 존재하지 않습니다."]
}
```

### 4. 임시 저장 — `POST /drafts/`

검증 성공 후 기존 Draft 데이터와 병합하여 저장합니다.

**Request**

```json
POST /drafts/

{
  "target": "CREATE",
  "data": {
    "phase": 2,
    "category": "image",
    "title": "자동차 객체 검출 프로젝트",
    "description": "COCO 데이터셋을 사용한 자동차 객체 검출 어노테이션",
    "access_level": "public",
    "data_collection": 1
  }
}
```

:::note[Draft 누적 저장]
Draft의 `data`에는 1단계에서 저장한 데이터(title, description, access_level 등)와 2단계 데이터(data_collection)가 병합되어 누적 저장됩니다.
:::

## 다음 단계로 이동

컬렉션을 선택한 후 **"다음 단계"** 버튼을 클릭하면 위 API 흐름을 거쳐 [라벨링 설정 단계](./labeling-setup)로 이동합니다.

:::note[필수 선택]
컬렉션이 선택되지 않으면 "다음 단계" 버튼이 비활성화됩니다.
:::