# 계산 모드

## Content

## 계산 모드

SpreadJS는 수식이 참조하는 셀, 값 또는 이름이 변경되면 수식을 다시 계산합니다.
이 동작은 `CalculationMode` 옵션을 사용하여 제어할 수 있습니다.

### CalculationMode 열거형

`CalculationMode`는 `GC.Spread.Sheets.CalculationMode`에 정의되어 있습니다.

| 값 | 설명 |
| --- | --- |
| `auto` (0) | 종속성이 변경되면 모든 더티 셀을 자동으로 다시 계산합니다. (기본값) |
| `manual` (1) | `spread.calculate()`가 호출될 때만 수식을 다시 계산합니다. |
| `partial` (2) | `SJS.TABLE`을 제외한 모든 수식을 자동으로 다시 계산합니다. `SJS.TABLE`은 `spread.calculate()`가 호출될 때만 다시 계산됩니다. |

### 자동 모드 (기본값)

`auto` 모드에서는:

* SpreadJS가 모든 더티 셀을 자동으로 다시 계산합니다.
* 셀의 값 또는 종속성이 변경되면 해당 셀은 더티 상태로 표시됩니다.
* 셀 입력, 복사 또는 붙여넣기와 같은 작업 중에 다시 계산이 수행됩니다.

이를 통해 워크시트 결과가 항상 최신 상태로 유지됩니다.

### 수동 모드

`manual` 모드에서는:

* 어떤 수식도 자동으로 다시 계산되지 않습니다.
* 반드시 `spread.calculate()`를 명시적으로 호출해야 합니다.

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

* 복잡한 수식이 포함된 대규모 워크시트 작업
* 일괄 업데이트 수행
* 대량 작업 중 중간 계산 방지

#### 수동 모드 설정

```javascript
var spread = new GC.Spread.Sheets.Workbook("ss",  { calculationMode: GC.Spread.Sheets.CalculationMode.manual });
```

또는:

```javascript
spread.options.calculationMode =  GC.Spread.Sheets.CalculationMode.manual;
```

다시 계산하려면:

```javascript
spread.calculate();
```

### 부분 모드

`partial` 모드에서는:

* 일반 수식은 자동으로 다시 계산됩니다.
* `SJS.TABLE` 수식은 자동으로 다시 계산되지 않습니다.
* `SJS.TABLE`은 `spread.calculate()`가 호출될 때만 업데이트됩니다.

이 모드는 대규모 데이터 테이블을 사용하는 시나리오에서 모든 시뮬레이션을 자동으로 다시 계산할 경우 성능에 영향을 줄 수 있는 상황을 위해 설계되었습니다.

예제:

```javascript
spread.options.calculationMode =  GC.Spread.Sheets.CalculationMode.partial;
```

>type=note
> **참고:**
> `CalculationMode` 설정은 Excel 파일 형식에서 지원되는 경우 Excel로 내보낼 때 유지됩니다.

## CalculationType 열거형

`spread.calculate()` 메서드는 다시 계산 범위를 제어하기 위해 `CalculationType` 값을 받습니다.

| 멤버 | 설명 |
| --- | --- |
| `all` | 지정된 범위의 모든 셀을 더티 상태로 표시하고 다시 계산합니다. (기본값) |
| `rebuild` | 범위 내 모든 수식을 다시 빌드한 후 다시 계산합니다. |
| `minimal` | 수식을 더티 상태로 표시하지만 volatile 셀 또는 순환 참조 셀은 더티 상태로 표시하지 않습니다. |
| `regular` | volatile 셀, 순환 참조 셀 및 더티 셀을 다시 계산합니다. |

## 동작 차이: 자동 모드 vs 수동 모드

다음 표는 계산 제어 API와 함께 서로 다른 계산 모드를 사용할 때의 SpreadJS 동작을 요약한 것입니다.

| 사용된 수식 | 자동 (기본 모드) | 수동 |
| ------ | ---------- | --- |
| suspendCalcService(true) | @cols=2:계산 엔진을 비활성화하고 어떤 셀도 다시 계산하지 않습니다. |
| resumeCalcService(false) | 계산 엔진을 활성화하고 volatile 셀, 순환 참조 셀 및 더티 셀을 계산합니다. | 계산 엔진을 활성화하고 volatile 셀을 더티 상태로 표시하지만 더티 셀은 계산하지 않습니다. |
| resumeCalcService(true) | 계산 엔진을 활성화하고 모든 셀을 계산합니다. | 계산 엔진을 활성화하고 모든 셀을 더티 상태로 표시하지만 더티 셀은 계산하지 않습니다. |
| resumeCalcService(false)<br>and<br>sheet.setFormula | 수식 및 해당 종속성을 계산합니다. | 수식을 계산합니다. |
| resumeCalcService(false)<br>and<br>spread.calculate() | @cols=2:열려 있는 모든 워크시트의 모든 수식을 계산합니다. |
| resumeCalcService(false)<br>and<br>spread.calculate(GC.Spread.Sheets.CalculationType.regular) | @cols=2:더티 상태로 표시된 모든 셀(즉, volatile 데이터 또는 변경 가능한 데이터에 종속된 셀과 프로그래밍 방식으로 더티 상태로 표시된 셀)을 계산합니다. |
| resumeCalcService(false)<br>and<br>spread.calculate(GC.Spread.Sheets.CalculationType.rebuild) | @cols=2:스프레드의 모든 수식을 다시 빌드한 후 계산합니다. |
| resumeCalcService(false)<br>and<br>spread.calculate(null, “Sheet1“) | Sheet1의 모든 수식을 더티 상태로 표시한 후 범위 밖 종속성도 더티 상태로 표시합니다.<br>모든 더티 셀을 계산합니다. | Sheet1의 모든 수식을 더티 상태로 표시한 후 범위 밖 종속성도 더티 상태로 표시합니다.<br>Sheet1의 더티 셀을 계산합니다.<br>다른 셀은 더티 상태를 유지합니다. |

>type=note
> **참고:** `sheet.recalcAll()` 메서드는 SpreadJS v16.2에서 더 이상 사용되지 않습니다. 대신 `spread.calculate()`를 사용하세요.

## 예제: CalculationType 사용

```javascript
spread.sheets[0].setFormula(0,0,"RAND()");
spread.sheets[0].setFormula(1,0,"=Sheet2!A1");
spread.sheets[0].setFormula(2,0,"=1+2"); 
spread.sheets[1].setFormula(0,0,"RAND()"); 
spread.sheets[1].setFormula(1,0,"=Sheet1!A1");

// All the cell is recalculated. 
spread.calculate(); spread.calculate(GC.Spread.Sheets.CalculationType.regular); 

// Sheet1!A1 Sheet2!A2 are evaluated to new number, and Sheet1!A2 Sheet1!A3 are evaluated. 
spread.calculate(GC.Spread.Sheets.CalculationType.all, "Sheet1"); 

// Sheet1!A1 Sheet2!A2 are evaluated to new number. 
spread.calculate(GC.Spread.Sheets.CalculationType.regular, "Sheet1!A1"); 

// No cells are evaluated.
spread.calculate(GC.Spread.Sheets.CalculationType.regular, "Sheet1!A2"); 

// Sheet1!A1 is evaluated to new number, Sheet1!A2 Sheet1!A3 are evaluated but don't changed, Sheet2!A2 keeps dirty in manual mode. 
spread.calculate(GC.Spread.Sheets.CalculationType.all, "Sheet1"); 

// Sheet1!A1 is evaluated to new number, Sheet2!A2 keeps dirty in manual mode. 
spread.calculate(GC.Spread.Sheets.CalculationType.regular, "Sheet1"); 

// Sheet2!A2 is evaluated because it is dirty. 
spread.calculate(GC.Spread.Sheets.CalculationType.minimal);
```

## 디자이너에서 계산 모드 사용

다음 위치에서 SpreadJS 디자이너의 계산 옵션을 구성할 수 있습니다.
FORMULAS → Calculation Options
![image-20260311.617f44.png](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/36b63360-fb01-457c-a448-c3ce32aaf454/image-20260311.617f44-20260529.5e42df.png?width=800)

수동 계산 모드의 경우, 통합 문서의 어느 영역을 다시 계산할지 선택해야 합니다.

* **지금 계산(Calculate Now)** 버튼을 클릭하면 열려 있는 모든 워크시트의 변경 사항이 업데이트됩니다.

![CalculateNow-20260311.b806f9.gif](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/36b63360-fb01-457c-a448-c3ce32aaf454/CalculateNow-20260311.b806f9-20260529.49cdb9.gif?width=800)

* **시트 계산(Calculate Sheet)** 버튼을 클릭하면 현재 워크시트에 대해서만 변경 사항이 반영됩니다.

![CalculateSheet-20260311.cc15b6.gif](https://gcdocumentsitekrblob.blob.core.windows.net/document-site-files/images/36b63360-fb01-457c-a448-c3ce32aaf454/CalculateSheet-20260311.cc15b6-20260529.a10eb8.gif?width=800)