> For the complete documentation index, see [llms.txt](https://kopens.gitbook.io/plantpulse-platform/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kopens.gitbook.io/plantpulse-platform/user/object.md).

# 오브젝트

## 목차

* [개요](#overview)
* [화면 구성](#layout)
* [상단 — 페이지 제목·새로고침](#top)
* [좌측 — BLOB 목록 패널](#blob-list)
  * [상단 도구 (3개 버튼)](#blob-toolbar)
  * [사이트 필터 셀렉터](#site-filter)
  * [BLOB 검색](#blob-search)
  * [목록 영역과 푸터](#blob-content-list)
  * [BLOB 추가 모달](#add-modal)
* [우측 — 타임라인 + 상세 테이블](#right-detail)
  * [타임라인 패널](#timeline)
  * [조회 기간 폼](#search-form)
  * [상세 테이블 (7컬럼)](#detail-table)
* [활용 예시](#use-cases)
* [자주 묻는 질문](#faq)
* [관련 화면](#related)

***

## 개요 <a href="#overview" id="overview"></a>

오브젝트 메뉴는 플랫폼에 저장된 비정형 파일(이미지·문서·바이너리)을 관리합니다. 설비 사진, 검사 결과 이미지, 도면(PDF·DXF), 진동/음향 센서 파형 데이터, 자동 생성 보고서 등이 시간순으로 적재되며, 각 파일에는 BLOB ID·사이트·설명 같은 메타데이터가 함께 저장됩니다.

> **BLOB**: Binary Large Object 의 약자. 숫자로 표현되는 센서 데이터 외에, 사진/문서 같은 큰 단위 파일을 의미합니다.

**경로**: 왼쪽 메뉴 > **Data > 오브젝트 (BLOB)** (내부 URL `/blob/store`)

***

## 화면 구성 <a href="#layout" id="layout"></a>

```
┌──────────────────────────────────────────────────────────────────────┐
│  🖼 BLOB 스토어                                            [↻]        │ ← ① 상단
├──────────┬───────────────────────────────────────────────────────────┤
│ BLOB     │  🕐 타임라인     [10M][30M][1H][6H][12H][전체]            │
│ 목록     │ ─────────────────────────────────────────────────────────│
│ 패널     │   조회 기간 [날짜범위] [검색]                              │ ← ② 우측
│          │ ─────────────────────────────────────────────────────────│
│ [추가]   │   타임라인 (시간 흐름)                                     │
│ [검색🔍] │ ─────────────────────────────────────────────────────────│
│ [↻]      │   ┌─ BLOB 상세 테이블 ─────────────────────────────┐    │
│ ─────── │   │ BLOB ID | 시간 | 오브젝트ID | 크기 | MIME | 속성 |⬇│   │
│ 사이트 ▼ │   └────────────────────────────────────────────────┘    │
│ 검색바🔍 │                                                            │
│ ───────  │                                                            │
│ 목록     │                                                            │
│ (스크롤) │                                                            │
│          │                                                            │
│ 버켓: -  │                                                            │
└──────────┴───────────────────────────────────────────────────────────┘
```

| 영역   | 위치        | 표시                        |
| ---- | --------- | ------------------------- |
| ① 상단 | 전체 폭      | 페이지 제목 + 새로고침 버튼          |
| ② 좌측 | col-lg-2  | BLOB 목록 패널 (스크롤 600px)    |
| ③ 우측 | col-lg-10 | 타임라인 + 조회 폼 + BLOB 상세 테이블 |

***

## 상단 — 페이지 제목·새로고침 <a href="#top" id="top"></a>

| 항목                         | 형태            | 동작                           |
| -------------------------- | ------------- | ---------------------------- |
| **제목**                     | 🖼 "BLOB 스토어" | —                            |
| **새로고침** (`realtime_icon`) | 빨강 버튼 + ↻     | 좌측 BLOB 목록과 우측 상세 모두 다시 불러오기 |

***

## 좌측 — BLOB 목록 패널 <a href="#blob-list" id="blob-list"></a>

좌측 col-lg-2 폭의 좁은 패널에 등록된 BLOB 가 사이트 단위로 묶여 표시됩니다.

### 상단 도구 (3개 버튼) <a href="#blob-toolbar" id="blob-toolbar"></a>

| 버튼             | 아이콘 | 동작                                          |
| -------------- | --- | ------------------------------------------- |
| **BLOB 추가**    | ➕   | BLOB 추가 모달을 엽니다 (아래 [모달 항목](#add-modal) 참고) |
| **BLOB 검색 토글** | 🔍  | 패널 내부의 검색 입력란을 펼치기/접기                       |
| **목록 새로고침**    | ↻   | 현재 사이트 필터로 BLOB 목록을 다시 불러오기                 |

### 사이트 필터 셀렉터 <a href="#site-filter" id="site-filter"></a>

```
🏭 [ 사이트명 [설명] ▼ ]
```

| 항목          | 설명                                                         |
| ----------- | ---------------------------------------------------------- |
| **앞 아이콘**   | 🏭 (산업) — 입력 그룹 좌측                                         |
| **셀렉터 ID**  | `blob_site_filter`                                         |
| **옵션 형식**   | `사이트명 [설명]` (서버 렌더링)                                       |
| **기본 선택**   | 페이지 진입 시 `selected_site_id` 가 있으면 그 사이트, 없으면 첫 사이트         |
| **변경 시 동작** | 선택 즉시 BLOB 목록을 그 사이트 기준으로 다시 불러오기(`onchange="blobList()"`) |

> 사이트가 등록되어 있지 않으면 셀렉터가 비어 있고 BLOB 목록도 비어 있습니다. [팩토리 관리](/plantpulse-platform/user/factory.md) 에서 먼저 사이트를 등록하세요.

### BLOB 검색 <a href="#blob-search" id="blob-search"></a>

상단 도구의 🔍 버튼으로 검색 입력란이 열립니다.

| 항목              | 설명                           |
| --------------- | ---------------------------- |
| **입력란 ID**      | `blob_text`                  |
| **placeholder** | "BLOB 검색..."                 |
| **검색 기준**       | BLOB 의 설명(`description`) 키워드 |
| **확정**          | 엔터(폼 submit) 또는 우측 🔍 버튼     |

### 목록 영역과 푸터 <a href="#blob-content-list" id="blob-content-list"></a>

| 항목                              | 설명                             |
| ------------------------------- | ------------------------------ |
| **로딩 표시** (`blob_loading`)      | "로딩중 ..." (회전 아이콘)             |
| **목록 영역** (`blob_content_list`) | 가로 스크롤 없음, 세로 스크롤(600px 고정 높이) |
| **목록 항목 단위**                    | 각 BLOB 가 작은 카드/썸네일 형태로 나열      |
| **푸터**                          | "버켓 : N" — 현재 사이트의 적재 버킷 수     |

### BLOB 추가 모달 <a href="#add-modal" id="add-modal"></a>

상단 **BLOB 추가** 버튼으로 열리는 모달입니다.

| 입력 항목                     | 폭     | 설명                                                      |
| ------------------------- | ----- | ------------------------------------------------------- |
| **사이트** (`modal_site_id`) | 200px | 등록된 사이트 중 선택                                            |
| **BLOB ID** (`blob_id`)   | 자동    | placeholder: `BLOB_00001 (영문 및 숫자, _ 만 입력)` — 도메인 고유 ID |
| **BLOB 명** (`blob_name`)  | 200px | placeholder: `BLOB_NAME_00001 (영문 및 숫자, _ 만 입력)`        |
| **설명** (`blob_desc`)      | 300px | 사람이 읽을 설명 텍스트                                           |

### 모달 동작 버튼

| 버튼                    | 동작                                                 |
| --------------------- | -------------------------------------------------- |
| **취소** (×)            | 모달 닫기 (저장하지 않음)                                    |
| **저장** (`saveBLOB()`) | 입력 검증 후 BLOB 메타 등록 + 파일 업로드(파일 선택은 모달 이후의 후속 단계에서) |

> BLOB ID 와 BLOB 명은 영문·숫자·언더스코어(`_`)만 허용됩니다. 한글이나 공백은 사용하실 수 없습니다.

***

## 우측 — 타임라인 + 상세 테이블 <a href="#right-detail" id="right-detail"></a>

좌측에서 BLOB 또는 사이트를 선택하면 우측에 그 범위의 데이터가 시각화됩니다.

### 타임라인 패널 <a href="#timeline" id="timeline"></a>

```
┌────────────────────────────────────────────────────────────────────┐
│ 🕐 타임라인  [10M] [30M] [1H] [6H] [12H] [전체]                     │
├────────────────────────────────────────────────────────────────────┤
│ 조회 기간 [          날짜 범위          ]  [검색]                  │
├────────────────────────────────────────────────────────────────────┤
│                                                                    │
│   타임라인 마커들 (각 BLOB 적재 시각이 점으로 표시)                │
│                                                                    │
└────────────────────────────────────────────────────────────────────┘
```

| 항목          | ID                 | 설명                                        |
| ----------- | ------------------ | ----------------------------------------- |
| **헤더**      | —                  | 🕐 "타임라인" + 우측 작은 결과 요약 텍스트(`result_txt`) |
| **타임라인 영역** | `control_timeline` | 가로축 시간, BLOB 마커가 시각순으로 배치                 |

#### 빠른 시간 범위 (6 버튼)

| 버튼        | data-range | 동작            |
| --------- | ---------- | ------------- |
| **10분전**  | `10M`      | 직전 10분        |
| **30분전**  | `30M`      | 직전 30분        |
| **1시간전**  | `1H`       | 직전 1시간        |
| **6시간전**  | `6H`       | 직전 6시간        |
| **12시간전** | `12H`      | 직전 12시간       |
| **전체기간**  | `ALL`      | 검색 전체 (기본 활성) |

### 조회 기간 폼 <a href="#search-form" id="search-form"></a>

타임라인 패널 본문 상단에 인라인 폼이 있습니다.

| 컨트롤                       | 폭     | 설명                                                                                                    |
| ------------------------- | ----- | ----------------------------------------------------------------------------------------------------- |
| **조회 기간 라벨**              | 100px | "조회 기간" 라벨                                                                                            |
| **기간 입력** (`search_time`) | 280px | 텍스트 입력 (가운데 정렬, 굵은 글씨) — 클릭 시 날짜 범위 선택기 표시. 폼 제출 시 hidden 필드 `search_date_from`/`search_date_to` 로 전달 |
| **검색**                    | 120px | 파랑 버튼 + 🔍 — 위 기간 조건으로 우측 타임라인+테이블을 다시 불러오기                                                           |

### 상세 테이블 (7컬럼) <a href="#detail-table" id="detail-table"></a>

타임라인 아래에 검색 기간 내 BLOB 가 시간순으로 테이블에 나열됩니다.

| 컬럼          | 폭     | 정렬  | 표시 값                                           |
| ----------- | ----- | --- | ---------------------------------------------- |
| **BLOB ID** | 150px | 가운데 | 도메인 고유 ID (예: `BLOB_00012`)                    |
| **시간**      | 180px | 가운데 | 적재 시각 (yyyy-MM-dd HH:mm:ss)                    |
| **오브젝트 ID** | 300px | 가운데 | 오브젝트 스토리지 내부 경로(객체 키)                          |
| **파일 크기**   | 100px | 가운데 | 자동 단위 변환 (B / KB / MB)                         |
| **MIME 타입** | 100px | 가운데 | 예: `image/jpeg`, `application/pdf`, `text/csv` |
| **속성**      | 자동    | 좌측  | 추가 메타데이터 키:값 모음                                |
| **다운로드**    | 60px  | 좌측  | ⬇ 아이콘 — 클릭 시 파일을 로컬로 내려받기                      |

#### 컬럼별 운영 팁

* **MIME 타입** 으로 어떤 종류의 파일인지 즉시 식별. 예상과 다른 타입이면 잘못 업로드된 것일 수 있음
* **파일 크기** 가 비정상적으로 큰 파일은 운영 부하의 원인이 될 수 있음
* **속성** 은 자동화 시 [플로우](/plantpulse-platform/user/flow.md) 가 추가한 키-값(예: 검사 결과 이미지의 OCR 텍스트, 보고서의 시작/종료 시각) 이 들어가는 자리

***

## 활용 예시 <a href="#use-cases" id="use-cases"></a>

| 용도             | 설명                             |
| -------------- | ------------------------------ |
| **설비 사진 보관**   | 설비 외관·설치 사진·점검 사진을 시간순으로 적재    |
| **검사 결과 이미지**  | 품질 검사 카메라가 자동으로 BLOB 적재        |
| **도면 관리**      | 설비 도면(DXF·PDF), 배관도, 배선도       |
| **센서 파형 데이터**  | 진동·음향 센서의 raw 파형 데이터(WAV·CSV)  |
| **자동 생성 보고서**  | 일일 운영 보고서, 시프트 보고서를 자동 발행 후 보관 |
| **외부 시스템 산출물** | 외부 분석 도구가 생성한 결과 파일 백업         |

> 자동화 적재가 필요하면 [플로우](/plantpulse-platform/user/flow.md) 의 외부 연동 노드(예: `flow_http_request`로 외부 시스템에서 받기 → 변환 → BLOB 적재 액션)를 결선하세요.

***

## 자주 묻는 질문 <a href="#faq" id="faq"></a>

**Q. BLOB ID 와 BLOB 명의 차이는?** A. **BLOB ID** 는 도메인 고유 식별자(시스템이 ID 로 참조), **BLOB 명** 은 사람이 식별하기 쉽게 부여하는 별명입니다. 둘 다 영문·숫자·`_` 만 허용합니다.

**Q. 적재한 BLOB 은 언제 삭제되나요?** A. 별도 보존 정책에 따릅니다. 영구 보존이 기본이며, 자동 삭제 정책이 필요하면 시스템 관리자에게 문의하세요.

**Q. 사이트 필터를 바꾸면 다른 사이트의 BLOB 가 사라지나요?** A. 사라지지 않습니다. 화면에서 보이지 않을 뿐, 데이터는 유지됩니다. 다른 사이트로 다시 변경하면 그 사이트의 BLOB 가 표시됩니다.

**Q. 같은 BLOB ID 로 새 파일을 추가할 수 있나요?** A. 동일 BLOB ID 로 적재하면 새 버전이 추가됩니다(시각이 다른 별도 항목). BLOB ID 는 도메인 식별자이며, 파일 자체는 시간 단위로 누적됩니다.

**Q. 다운로드 시 한글 파일명이 깨져 보입니다.** A. 일부 브라우저의 인코딩 처리 차이입니다. 다운로드한 파일명을 직접 변경해 사용하시거나 다른 브라우저에서 시도해 보세요.

**Q. BLOB 가 시간순으로 정렬이 어색합니다.** A. 상세 테이블은 검색 기간의 시간 정렬을 따릅니다. 빠른 시간 범위 버튼(`10M`/`30M` 등)으로 윈도우를 좁혀 보세요.

**Q. BLOB 추가 모달에서 파일을 어떻게 선택하나요?** A. 메타 정보 저장 후 파일 업로드 단계가 이어집니다. 큰 파일은 업로드에 시간이 걸릴 수 있으니 진행 표시를 끝까지 기다려 주세요.

**Q. BLOB 추가 자동화는 가능한가요?** A. [플로우](/plantpulse-platform/user/flow.md) 를 사용하면 외부 시스템에서 자동으로 BLOB 를 적재하도록 자동화할 수 있습니다. 예시: 검사 카메라가 이미지를 HTTP 로 푸시 → 플로우가 메타 정보 부여 → BLOB 저장.

***

## 관련 화면 <a href="#related" id="related"></a>

* [대시보드](/plantpulse-platform/user/summary.md) — 운영 지표의 BLOB 카드(오늘 BLOB 건수·크기)
* [일일 통계](/plantpulse-platform/user/statistics.md) — 시스템 BLOB 수신 트렌드 차트
* [팩토리 관리](/plantpulse-platform/user/factory.md) — 사이트 등록(BLOB 의 사이트 필터에 사용됨)
* [플로우](/plantpulse-platform/user/flow.md) — BLOB 자동 적재·자동 산출물 생성
* [데이터 포인트](/plantpulse-platform/user/data-point.md) — 숫자형 시계열 데이터 조회
