# 데이타 바인딩

## 개념

- 모든 컴포넌트는 각자 data 속성을 갖는다.
- 컴포넌트의 data 속성은 다음과 같이 설정될 수 있다.
  - 초기 데이타(Initial Data) : 모델링 시에 모델러에서 초기 데이타를 설정할 수 있다.
  - 데이타 소스 컴포넌트인 경우 : 데이타소스로부터 받은 결과를 자신의 data로 설정한다.
  - UI 기반 컴포넌트인 경우 : 사용자의 인터렉션에 의해 변경된 값(value)가 data로 설정한다.
  - 데이타 전파(Data Spread) : 다른 컴포넌트의 Data Binding 설정에 의해서 설정될 수 있다.
- 컴포넌트 data의 변경(changed)에 반응해서 설정된 데이타 바인딩 모델에 의해서 대상 컴포넌트(들)의 속성을 변경할 수 있다.
- PUBSUB (Publish-Subscribe)
  - 데이터 퍼블리셔가 여러 데이터 서브스크라이버들에게 이름표(tag)가 달린 데이터를 전송하는 방식을 pubsub 이라고 한다.
  - 보드 서비스를 제공하는 서버가 데이터 퍼블리셔 역할을 하게되며, 보통 시나리오의 publish 태스크를 통해서 데이터 퍼블리시를 할 수 있다.
  - 각 컴포넌트는 자신의 tag 속성을 지정할 수 있으며, 퍼블리셔가 전송하는 데이터 중에서 지정된 tag에 해당하는 데이터를 수신하게 된다.
  - 수신된 메시지는 data에 저장되어 데이터 전파를 일으킨다.

## Identifier

### ID

- 컴포넌트의 유일한 명칭

### 클래스 (class)

- 컴포넌트의 분류(class)
- 공백으로 분리된 다수의 분류를 설정할 수 있다.
- 각 분류(class)는 데이타 전파시에 target 으로 지정될 수 있다.

### 태그 (tag)

- 데이타 퍼블리셔로부터 전송되는 데이타 중에서 수신하고자 하는 데이타의 tag를 지정한다.

### 템플릿 접두어 (template prefix)

- 컴포넌트를 템플릿으로 지정할 때 설정할 수 있다.
- 템플릿으로 설정된 컴포넌트는 뷰어에서 표시되지 않는다.
- clone 등으로 템플릿을 이용해 컴포넌트를 동적으로 생성할 때 참조된다.

### no data no show

- 보드 뷰어 모드로 동작시, 해당 컴포넌트에 데이타가 설정되지 않았을 때, 보이지 않도록 하는 설정이다.

### intent sensitive

- 데이타 전파는 소스 컴포넌트의 데이타가 변경되는 경우에 동작한다. 즉, 데이타가 새로 설정되더라도 실제적으로 그 값이 변화하지 않았다면 데이타 전파가 동작하지 않는다. 이는 모니터링 목적의 효율을 높이기 위한 방법이다.
- 하지만, intent sensitive 설정이 켜져있는 경우에는 data가 변경되지 않았더라도, 소스 컴포넌트의 데이타가 새로 설정도는 경우에 그 값이 실제적으로 변하지 않았다고 하더라고 데이타 전파가 동작하도록 한다.
- 이 속성은 소스 컴포넌트의 value 속성의 설정에 따른 동작에도 적용된다.

## 초기 데이타 (Initial Data)

- 컴포넌트의 초기 데이타를 설정한다.
- 데이타는 문자열, 숫자 또는 JSON 객체 타입 중 한가지 타입으로 설정할 수 있다.

## 데이타 전파 (Data Spread)

- 소스 컴포넌트의 data 값을 기반으로 대상 컴포넌트의 속성을 변경시키는 설정이다.
- 만일, 소스 컴포넌트가 대상 컴포넌트의 data속성을 변경시키는 경우, 대상 컴포넌트의 Data Spread 기능이 연속적으로 동작하므로, 이 기능을 데이타 전파라고 한다.
- 여러개의 데이타 전파 설정이 가능하다

### 소스데이타 (source)

- 소스 컴포넌트를 지정하면, 해당 컴포넌트의 데이타(data)를 대상(target) 컴포넌트(들)에 전파한다.
- 컴포넌트 관계에 기반한 대상 지정
  - (self) : 컴포넌트 자신
- id로 지정 : #id
- 지정하지 않으면, (self)와 동일하게 컴포넌트 자신의 데이터(data)를 전파한다.

### 접근자 (accessor)

- 소스 컴포넌트의 data 객체 중에서, 일부분만 전파하거나 변환된 데이타를 전파하고자 하는 경우에 설정한다.
- 설정 방법은 [JSONATA 도큐먼트](http://docs.jsonata.org/overview.html)를 따른다.

### 대상 (target)

- 데이타 전파 대상 컴포넌트를 지정한다.
- id로 지정 : #id
- class로 지정 : .class
- data에 기반한 대상 지정
  - (key) : data 객체의 키값을 id로 하는 컴포넌트들이 대상 컴포넌트가 된다.
  - [property] : data 객체의 property의 값을 id로 하는 컴포넌트들이 대상 컴포넌트가 된다.

### 속성 (property)

- 전파될 데이타 값이 적용될 대상 컴포넌트의 속성을 지정한다.

### 규칙 타입 (rule)

전파될 데이타가 대상 컴포넌트 속성에 적용되는 방법을 지정한다.

- 값 (value)
  - 값 자체가 그대로 대상 컴포넌트의 속성에 설정된다.
- 매핑 (map)
  - 값을 키로 하는 매핑값이 대상 컴포넌트의 속성에 설정된다.
- 범위 (range)
  - 값이 포함된 범위의 매핑값이 대상 컴포넌트의 속성에 설정된다.
- 함수 (eval)
  - eval 코드는 자바스크립트 문법으로 작성할 수 있다.
  - eval 코드의 context (this)는 소스 컴포넌트이다.
  - eval 코드의 parameter 는 value와 targets가 있다.
    - value : 소스 컴포넌트의 data에 accessor가 적용된 값
    - targets : 타겟 컴포넌트 리스트

### No Data No Spreading

- 규칙 타입에 따른 최종 결과값이 빈 값이 아닌 경우에만 전파한다.
  - 결과값이 undefined, null, NaN, 공백('')인 경우에는 전파하지 않는다.
  - 결과값이 숫자 0인 경우에는 전파한다.
