# 핵심 구조 설정

## Content

테이블이 생성되면 데이터 원본의 각 레코드는 테이블의 행이 됩니다.
`schema.columns` 섹션은 레코드의 각 필드가 테이블 열로 어떻게 모델링되는지를 정의합니다.
예제:

```javascript
const table = dataManager.addTable("employees", {
    data: [
        { id: 1, name: "Alice", birthday: "2000-01-01" },
        { id: 2, name: "Bob", birthday: "2001-05-12" }
    ],
    schema: {
        columns: {
            id: { dataType: "number", isPrimaryKey: true },
            name: { dataType: "string" },
            birthday: { dataType: "date" }
        }
    }
});
```

이 예제에서:

* `data`의 각 객체는 레코드입니다.
* 레코드의 각 속성(`id`, `name`, `birthday`)은 열이 됩니다.
* `columns` 구성은 이러한 필드가 데이터 매니저에 의해 어떻게 해석되고 관리되는지를 정의합니다.

핵심 구조 설정은 다음을 정의합니다.

* 열이 원시 데이터에 매핑되는 방식
* 값이 해석되는 방식
* 형식이 해석되는 방식
* 레코드를 고유하게 식별하는지 여부

이는 열 모델링의 구조적 기반을 형성합니다.

## 열 이름

`schema.columns`의 각 항목은 하나의 열 정의를 나타냅니다.

```javascript
schema: {
    columns: {
        id: { dataType: "number" },
        name: { dataType: "string" }
    }
}
```

객체 키(`id`, `name`)는 테이블 내에서 열의 논리적 식별자입니다.
이 이름은 다음과 같은 경우에 사용됩니다.

* 수식에서 필드 참조
* 관계 정의
* 행 데이터 접근
* View 생성

열 정의 내부에 `name` 속성이 지정된 경우 객체 키 대신 내부 열 이름으로 사용됩니다.
대부분의 경우 객체 키만으로 충분합니다.

## dataName

`dataName`은 열을 원시 데이터의 다른 필드 이름에 매핑합니다.

```javascript
schema: {
    columns: {
        firstName: {
            dataName: "salesperson"
        }
    }
}
```

이 예제에서:

* `salesperson`은 원본 데이터의 필드입니다.
* `firstName`은 테이블 내부의 열 이름이 됩니다.

이는 다음과 같은 경우에 유용합니다.

* 백엔드 필드 이름이 프런트엔드 명명 규칙과 일치하지 않는 경우
* 여러 필드 이름을 더 명확하게 변경해야 하는 경우
* 동일한 데이터 원본을 다른 논리 모델로 재사용하는 경우

`dataName`은 원본 데이터를 수정하지 않습니다.
구문 분석 중 필드가 어떻게 매핑되는지만 정의합니다.

## value

`value` 속성은 열 값이 어떻게 결정되는지를 정의합니다.
다음 중 하나가 될 수 있습니다.

* 필드 이름
* 수식 표현식

### 필드 매핑

```javascript
columns: {
    name: {
        value: "username",
    }
}
```

이는 열을 레코드의 특정 필드에 명시적으로 매핑합니다.
`value`가 정의되지 않은 경우 기본적으로 열 이름이 필드 이름으로 사용됩니다.

### 수식 열

`value`에 수식 표현식이 포함되고 `dataType`이 `"formula"`로 설정된 경우 해당 열은 계산 열이 됩니다.

```javascript
TotalUnits: {
    dataType: "formula",
    value: "=[@UnitsInStock] + [@UnitsOnOrder]"
}
```

이 경우:

* 열은 원시 데이터 필드에 직접 매핑되지 않습니다.
* 값은 동일한 레코드의 다른 필드에서 계산됩니다.

수식 열은 계산 후 일반 데이터 열처럼 동작합니다.

## dataType

`dataType`은 열 값이 어떻게 해석되는지를 정의합니다.
일반적인 형식은 다음과 같습니다.

* `"string"`
* `"number"`
* `"boolean"`
* `"date"`
* `"formula"`
* `"object"`
* `"array"`

데이터 형식은 다음에 영향을 줍니다.

* 값 구문 분석(특히 날짜 및 숫자)
* 수식 동작
* 유효성 검사 로직
* View와의 통합

예를 들어 JSON 데이터에 날짜 문자열이 포함된 경우:

```javascript
columns: {
    birthday: {
        dataType: "date"
    }
}
```

값은 구문 분석 중 날짜 값으로 변환됩니다.
`dataType`을 지정하지 않으면 값을 기반으로 형식이 추론됩니다.

## isPrimaryKey

`isPrimaryKey`는 열을 테이블의 기본 키 일부로 지정합니다.

```javascript
columns: {
    id: {
        isPrimaryKey: true
    }
}
```

기본 키는:

* 각 레코드를 고유하게 식별합니다.
* 관계 정의에 필요합니다.
* 교차 View와 같은 특정 고급 기능에 필요합니다.

기본 키 제약 조건은 테이블 수준에서 적용됩니다.
여러 열에 `isPrimaryKey`가 지정되면 복합 키를 구성합니다.

## 구조적 책임 범위

핵심 구조 설정은 다음을 정의합니다.

* 열이 원시 데이터에 매핑되는 방식
* 값이 계산되는 방식
* 형식이 해석되는 방식
* 레코드를 고유하게 식별하는지 여부

다음은 제어하지 않습니다.

* 유효성 검사 규칙
* 표시 서식
* 필터링 동작
* 스타일

이러한 기능은 다른 열 모델링 섹션에서 별도로 구성됩니다.