# 데이터 동작 설정

## Content

데이터 동작 설정은 열 값이 구문 분석 이후 어떻게 유효성 검사되고, 변환되고, 인덱싱되고, 저장되는지를 제어합니다.
식별자와 형식을 정의하는 핵심 구조 설정과 달리, 동작 설정은 열이 데이터 작업에 어떻게 참여하는지를 정의합니다.
이러한 설정은 다음에 영향을 줍니다.

* 데이터 무결성
* 값 정규화
* 레코드 구조 변환
* 쿼리 성능

이 설정들은 데이터 매니저 계층에서 동작하며 특정 View와는 독립적입니다.

## required

새 레코드 삽입 시 해당 열을 필수 항목으로 지정합니다.

```javascript
columns: {
    name: {
        dataType: "string",
        required: true
    }
}
```

필수 열에 값이 없는 상태로 새 행이 생성되면 해당 레코드는 유효하지 않은 것으로 간주됩니다.
이 제약 조건은 데이터 계층에 적용되며 UI 유효성 검사에만 국한되지 않습니다.

## readonly

값이 설정된 이후 열 값을 수정할 수 없도록 합니다.

```javascript
columns: {
    id: {
        dataType: "number",
        readonly: true
    }
}
```

읽기 전용 열은:

* 데이터 업데이트 작업으로 변경할 수 없습니다.
* 수식 및 관계에는 계속 참여합니다.

읽기 전용 설정은 레코드 생성 시 초기값 설정을 막지는 않습니다.

## defaultValue

새 행 삽입 시 기본값을 정의합니다.

```javascript
columns: {
    status: {
        dataType: "string",
        defaultValue: "New"
    }
}
```

기본값은 다음 중 하나일 수 있습니다.

* 상수 값
* 수식 표현식

기본값은 삽입 시 해당 필드가 명시적으로 제공되지 않은 경우에만 적용됩니다.

## dataPattern

문자열 값이 형식이 지정된 값으로 구문 분석되는 방식을 정의합니다.

```javascript
columns: {
    birthday: {
        dataType: "date",
        dataPattern: "dd/MM/yyyy"
    }
}
```

지원되는 구문 분석 시나리오 예:

* 날짜 형식 문자열
* 사용자 지정 소수점 구분 기호
* Boolean 참/거짓 매핑(예: `"Yes|No"`)

`dataPattern`은 구문 분석 동작에만 영향을 줍니다.
변환 이후 내부적으로 저장되는 값은 변경하지 않습니다.

## dataMap

저장된 값을 표시 친화적인 값으로 매핑합니다.

```javascript
columns: {
    product: {
        dataMap: {
            1: "Product-A",
            2: "Product-B"
        }
    }
}
```

중요:

* 실제 저장 값은 변경되지 않습니다.
* 매핑은 View 수준의 데이터 표시 방식에만 영향을 줍니다.

`dataMap`은 테이블 데이터를 수정하거나 원본 레코드 값을 변경하지 않습니다.

## showNullAs 및 showEmptyAs

`showNullAs`와 `showEmptyAs`는 특수 값이 표시되는 방식을 정의합니다.

```javascript
columns: {
    Name: {
        showNullAs: "[NULL]",
        showEmptyAs: "[EMPTY]"
    }
}
```

* `showNullAs`는 `null` 또는 `undefined` 값에 대한 표시 텍스트를 지정합니다.
* `showEmptyAs`는 빈 문자열(`""`) 값에 대한 표시 텍스트를 지정합니다.

이 설정들은:

* 값이 표시되는 방식에만 영향을 줍니다.
* 실제 저장된 데이터를 수정하지 않습니다.
* 실제 행 값을 변경하지 않습니다.

예를 들어 다음 레코드가 있는 경우:

```javascript
{ Name: null }
```

저장된 값은 여전히 `null`이지만 표시 값은 `[NULL]`이 됩니다.

### View 수준 재정의

이 속성들은 View 열 수준에서도 정의할 수 있습니다.

```javascript
columns: {
    Name: {
        showNullAs: "[NULL]",
        showEmptyAs: "[EMPTY]"
    }
}
```

스키마 수준 설정과 View 수준 설정이 모두 존재하는 경우:

* View 수준 구성이 스키마 수준 구성을 재정의합니다.
* 스키마 수준 구성은 모든 View에 대한 기본 동작으로 사용됩니다.

## spread

열이 객체 값을 포함하는 경우 `spread`는 `fetch()` 중 해당 속성을 별도 열로 확장합니다.

```javascript
columns: {
    address: {
        spread: true
    }
}
```

다음 데이터가 있다고 가정하면:

```javascript
{
    id: 1,
    address: {
        city: "Berlin",
        zip: "10000"
    }
}
```

`fetch()` 이후 테이블 구조는 다음 열을 포함하도록 확장됩니다.

* `address.city`
* `address.zip`

이 변환은 테이블 수준에서 수행됩니다.
`dataMap`과 달리 `spread`는 구문 분석 이후 테이블 내부의 레코드 구조를 변경합니다.

## indexed

테이블이 fetch된 후 해당 열에 대한 인덱스를 생성합니다.

```javascript
columns: {
    customerId: {
        indexed: true
    }
}
```

인덱싱이 활성화되면:

* 값-행 매핑 구조가 내부적으로 생성됩니다.
* 해당 열에 대한 필터링 및 조회 작업의 효율성이 향상됩니다.

인덱싱은 쿼리 성능을 향상시키지만 메모리 사용량을 증가시킵니다.
인덱스는 `fetch()` 완료 후 생성됩니다.

## 동작적 책임 범위

데이터 동작 설정은 다음을 정의합니다.

* 유효성 검사 제약 조건
* 변경 가능성 규칙
* 기본값
* 구문 분석 동작
* 레코드 구조 확장
* 성능 최적화

다음은 정의하지 않습니다.

* 시각적 서식
* UI 컴포넌트
* 열 레이아웃
* 테이블 간 표시 방식

이러한 기능은 고급 모델링 및 View 구성에서 별도로 처리됩니다.