# Window 정의

## Content

`window` 속성은 테이블 스키마에서 [`WINDOW()`](/spreadjs/docs/features/tablesheet/window-functions) 수식에 사용할 재사용 가능한 window 사양을 정의합니다.
Window 정의는:

* 테이블 스키마에 속합니다.
* 저장된 데이터를 수정하지 않습니다.
* 원격 작업에 영향을 주지 않습니다.
* 열 구조를 변경하지 않습니다.
* 수식 계산을 위한 이름 있는 window 구성으로 사용됩니다.

이는 window 사양을 한 번만 정의하고 여러 계산에서 재사용할 수 있도록 하는 축약 메커니즘을 제공합니다.

## 스키마에 Window를 정의하는 이유

`WINDOW()` 수식을 사용할 때 다음과 같은 표현식이 자주 반복됩니다.

* `PARTITIONBY`
* `ORDERBY`
* 프레임 정의(`FRAMEROWS`, `FRAMERANGE`, `FRAMEGROUPS`)

이 표현식을 모든 수식에 반복해서 작성하는 대신, 스키마에 이름 있는 window를 정의하고 이름으로 참조할 수 있습니다.
이를 통해 다음과 같은 이점을 얻을 수 있습니다.

* 가독성 향상
* 유지 관리 용이성 향상
* 계산 간 일관성 향상

## 기본 구조

`window` 속성은 키-값 컬렉션으로 정의됩니다.

```typescript
interface ISchemaOption {
    window?: {
        [name: string]: string;
    };
}
```

각 키는 window 이름입니다.
각 값은 `WINDOWDEF` 수식 표현식입니다.

## 기본 Window 정의

예제:

```javascript
dataManager.addTable("orders", {
    schema: {
        window: {
            YearPartition:
                '=WINDOWDEF(PARTITIONBY([Product], YEAR([@OrderDate])))',
            RunningFrame:
                '=WINDOWDEF(PARTITIONBY([Product]), ORDERBY([@OrderDate]), FRAMEROWS(-1, [@]))'
        }
    }
});
```

각 정의는 다음을 지정합니다.

* 분할 로직
* 선택적 정렬 로직
* 선택적 프레임 로직

정의 자체는 집계를 수행하지 않습니다.
window 컨텍스트만 정의합니다.

## 이름 있는 Window 사용

이름 있는 window는 `WINDOW()` 수식 내에서 참조할 수 있습니다.

```javascript
=WINDOW(SUM([Sales]), "YearPartition")
```

이름 있는 window는 다음을 제공합니다.

* `PARTITIONBY`
* `ORDERBY`
* 프레임 구성

집계 함수(예: `SUM`)는 여전히 `WINDOW()` 호출에서 지정해야 합니다.

## Window 체이닝

Window 체이닝을 사용하면 이전에 정의된 window를 재사용하면서 일부만 재정의할 수 있습니다.
이름 있는 window를 추가 window 절과 함께 참조하는 경우:

* `WINDOW()` 호출에서 제공된 표현식은 기본 window의 해당 부분을 재정의합니다.
* 지정되지 않은 부분은 상속됩니다.

예제:

```javascript
// 기본 window 전체 재사용
WINDOW(SUM([Sales]), "YearPartition")

// ORDERBY 재정의
WINDOW(SUM([Sales]), "YearPartition",
       ORDERBY([@OrderDate]))

// 프레임만 재정의
WINDOW(SUM([Sales]), "YearPartition",
       FRAMEROWS([@-2], [@]))
```

재정의 규칙:

* 호출에서 정의된 `PARTITIONBY`, `ORDERBY`, 프레임 표현식은 기본 window의 정의를 대체합니다.
* 명시적으로 제공되지 않은 부분은 그대로 유지됩니다.

이를 통해 window 정의를 중앙에서 관리하면서도 유연하게 재사용할 수 있습니다.

## 프레임 형식 및 제외 모드

Window 정의에는 다음과 같은 프레임 표현식이 포함될 수 있습니다.

* `FRAMEROWS`
* `FRAMERANGE`
* `FRAMEGROUPS`

프레임 표현식에는 선택적으로 제외 모드를 포함할 수 있습니다.
이 구문은 window 함수 언어의 일부이며 수식 계산 중 평가됩니다.
데이터 매니저는 window 함수에 대한 기본 지원을 제공합니다. 테이블 시트에서의 자세한 사용 방법 및 구성은 [테이블 시트 Window 함수 문서](/spreadjs/docs/features/tablesheet/window-functions)를 참고하세요. 이 페이지는 스키마 수준의 window 구성만 다룹니다.

## 책임 범위

Window 정의는:

* 재사용 가능한 window 사양으로 스키마를 확장합니다.
* 수식 계산에만 영향을 줍니다.
* 저장된 레코드를 변경하지 않습니다.
* 데이터 동기화에 참여하지 않습니다.
* 테이블 간 관계를 생성하지 않습니다.

이는 데이터 매니저 스키마 내에서 수식 인프라 메커니즘 역할을 수행합니다.
이를 통해 다음 요소들을 명확하게 분리할 수 있습니다.

* 데이터 구조(열 및 관계)
* 수식 의미 체계(window 동작)
* View 렌더링