# 메모리 테이블 추가

## Content

메모리 테이블은 클라이언트에 데이터를 로컬로 저장합니다.
데이터는 [`addTable`](/spreadjs/api/v19/classes/GC.Data.DataManager#addtable)을 호출할 때 `data` 옵션을 통해 직접 제공됩니다.
모든 작업은 메모리에서 수행됩니다.
서버 통신은 포함되지 않습니다.
메모리 테이블은 다음과 같은 경우에 적합합니다.

* 정적 데이터 집합
* 클라이언트 측 애플리케이션
* 프로토타이핑 시나리오
* 오프라인 사용 사례

## 메모리 테이블 생성

[`IDataSourceOption`](/spreadjs/api/v19/modules/GC.Data#idatasourceoption)의 `data` 속성을 사용합니다.

```javascript
const dataManager = spread.dataManager();

const table = dataManager.addTable("employees", {
    data: [
        { id: 1, name: "Alice", age: 24 },
        { id: 2, name: "Bob", age: 26 },
        { id: 3, name: "Cindy", age: 25 }
    ]
});
```

이제 테이블은 정의되었지만 아직 초기화되지는 않았습니다.

## 필수 초기화

테이블 생성 후 다음을 호출합니다.

```javascript
table.fetch();
```

데이터가 이미 로컬에 존재하더라도 [`fetch()`](/spreadjs/api/v19/classes/GC.Data.Table#fetch)를 호출하면 다음이 보장됩니다.

* 내부 데이터 상태 초기화
* 정의된 경우 스키마 처리 적용
* View 생성 준비 완료

예제:

```javascript
table.fetch().then(function () {
    const view = table.addView("defaultView");
});
```

모든 테이블 유형은 추가 작업 전에 `fetch()`가 필요합니다.

## 데이터 형식 제공

`data` 옵션은 여러 형식을 지원합니다.

* JSON 배열(기본값)
* CSV 문자열
* XML 문자열

`data`가 JSON 배열인 경우 추가 구성은 필요하지 않습니다.

### JSON(기본값)

```javascript
const table = dataManager.addTable("employees", {
    data: [
        { id: 1, name: "Alice", price: 24 },
        { id: 2, name: "Bob", price: 26 },
        { id: 3, name: "Cindy", age: 25 }
    ]
});
```

JSON은 기본 데이터 형식입니다.
`schema.type`을 지정하지 않으면 `"json"`으로 처리됩니다.

### CSV

CSV 데이터를 문자열로 제공하는 경우 다음을 지정해야 합니다.

```javascript
schema: {
    type: "csv"
}
```

예제:

```javascript
const table = dataManager.addTable("employees", {
    data: `id,name,price
1,Alice,24
2,Bob,26
3,Cindy,25`,
    schema: {
        type: "csv"
    }
});
```

>type=note
> `schema.type = "csv"`를 지정하지 않으면 문자열은 일반 JSON 값으로 처리되며 구문 분석이 수행되지 않습니다.

### XML

XML 데이터를 제공하는 경우 다음을 지정해야 합니다.

* `schema.type = "xml"`
* `schema.dataPath` (컬렉션이 중첩된 경우)

예제:

```javascript
const table = dataManager.addTable("employees", {
    data: `
<root>
    <row>
        <id>1</id>
        <name>Alice</name>
        <price>24</price>
    </row>
    <row>
        <id>2</id>
        <name>Bob</name>
        <price>26</price>
    </row>
    <row>
        <id>3</id>
        <name>Cindy</name>
        <price>25</price>
    </row>
</root>
`,
    schema: {
        type: "xml",
        dataPath: "root.row"
    }
});
```

설명:

* `type: "xml"`은 XML 구문 분석을 활성화합니다.
* `dataPath`는 레코드 컬렉션이 위치한 경로를 지정합니다.
* `dataPath`를 지정하지 않으면 전체 구문 분석 객체가 반환됩니다.

## 메모리 테이블의 스키마

메모리 테이블에서 `schema`는 두 가지 주요 목적을 가집니다.

1. 데이터 구문 분석(CSV 또는 XML 사용 시)
2. 열 모델링 및 데이터 동작

스키마를 제공하지 않으면:

* JSON 데이터는 자동으로 추론됩니다.
* 열은 객체 키를 기반으로 생성됩니다.

스키마 구성은 [스키마](/spreadjs/docs/v19/features/data-manager/defining-schema) 섹션에 설명되어 있습니다.
이 섹션에서는 메모리 테이블에서의 일반적인 사용 방법을 보여줍니다.

### 구문 분석 동작

`schema.type` 속성은 `data` 문자열을 어떻게 구문 분석할지 결정합니다.

| schema.type | 예상 데이터 형식 |
| ----------- | --------- |
| json (기본값) | JSON 배열 |
| csv | CSV 문자열 |
| xml | XML 문자열 |
| columnJson | 열 기반 JSON 구조 |

`schema.type`을 설정하지 않고 문자열을 제공하면 `"json"`으로 처리되며 CSV 또는 XML로 구문 분석되지 않습니다.

### 열 모델링

스키마는 열 구조 및 데이터 형식을 정의할 수 있습니다.

```javascript
const table = dataManager.addTable("orders", {
    data: [
        { id: 1, orderDate: "2025-01-01" }
    ],
    schema: {
        columns: {
            orderDate: {
                dataType: "date"
            }
        }
    }
});
```

열 정의를 통해 다음을 수행할 수 있습니다.

* 데이터 형식 변환
* 서식 동작 정의
* 기본 키 정의
* 고급 열 구성

### 중첩 필드 펼치기

필드에 중첩 객체가 포함된 경우 `spread`를 사용하여 여러 열로 펼칠 수 있습니다.
예제:

```javascript
const table = dataManager.addTable("sales", {
    data: [
        {
            id: 1,
            address: {
                country: "USA",
                state: "California",
                city: "San Francisco",
                postalCode: "94105"
            }
        },
        {
            id: 2,
            address: {
                country: "Germany",
                state: "Berlin",
                city: "Berlin",
                postalCode: "10115"
            }
        }
    ],
    schema: {
        columns: {
            address: {
                spread: true
            }
        }
    }
});
```

`fetch()` 이후 중첩 필드는 개별 열로 변환됩니다.
이를 통해 구조화된 데이터를 View에서 사용할 수 있도록 평면화할 수 있습니다.

## 내보내기 및 가져오기

메모리 테이블은 다음 형식을 통한 내보내기 및 가져오기를 지원합니다.

* JSON
* SJS

데이터가 전적으로 메모리에 존재하므로 전체 직렬화를 지원합니다.