# 동기화 모드 (AutoSync vs Batch)

## Content

원격 테이블은 두 가지 동기화 모드를 지원합니다.

* **단일 동기화 모드**
* **일괄 동기화 모드**

동기화 모드는 다음을 결정합니다.

* 변경 사항이 서버로 전송되는 시점
* 요청 구조 방식
* 변경 사항이 트랜잭션 방식으로 처리되는지 여부

모드는 테이블 생성 시 구성됩니다.

## 단일 동기화 모드(autoSync)

단일 동기화 모드에서는 각 데이터 변경이 즉시 원격 요청을 발생시킵니다.
다음을 설정하여 활성화합니다.

```javascript
autoSync: true
```

예제:

```javascript
const dataManager = spread.dataManager();

const orders = dataManager.addTable("orders", {
    remote: {
        read:   { url: "http://localhost:3000/api/orders", method: "GET" },
        create: { url: "http://localhost:3000/api/orders", method: "POST" },
        update: { url: "http://localhost:3000/api/orders", method: "PUT" },
        delete: { url: "http://localhost:3000/api/orders", method: "DELETE" }
    },
    autoSync: true
});

orders.fetch();
```

동작 방식:

* Insert → `create` 전송
* Update → `update` 전송
* Delete → `delete` 전송
* 각 작업은 개별 요청을 전송
* 수동 제출 불필요

다음과 같은 경우 단일 동기화 모드를 사용합니다.

* 즉시 저장이 필요한 경우
* 각 작업이 독립적인 경우
* 일괄 처리보다 단순성이 중요한 경우

## 일괄 동기화 모드

일괄 모드에서는 변경 사항이 명시적으로 제출될 때까지 로컬에 저장됩니다.
다음을 설정하여 활성화합니다.

```javascript
batch: true
```

예제:

```javascript
const orders = dataManager.addTable("orders", {
    remote: {
        read:  { url: "http://localhost:3000/api/orders", method: "GET" },
        batch: { url: "http://localhost:3000/api/orders/batch", method: "POST" }
    },
    batch: true
});

orders.fetch();
```

동작 방식:

* Insert/update/delete 작업은 로컬에 캐시됨
* 즉시 네트워크 요청을 전송하지 않음
* 모든 변경 사항을 함께 제출

변경 사항 전송:

```javascript
orders.submitChanges();
```

변경 사항 취소:

```javascript
orders.cancelChanges();
```

## 동작 비교

| 기능 | 단일 동기화 | 일괄 동기화 |
| ------- | ----------- | ---------- |
| 네트워크 호출 | 작업별 | 단일 요청 |
| 수동 제출 | 필요 없음 | 필요 |
| 트랜잭션 유사 동작 | 아니요 | 예 |
| 실패 처리 | 작업별 | 전체 일괄 처리 |

다음과 같은 경우 일괄 모드가 적합합니다.

* 여러 변경 사항이 함께 성공하거나 실패해야 하는 경우
* 네트워크 트래픽을 최소화해야 하는 경우
* 서버 측 트랜잭션 처리가 구현된 경우

## 변경 사항 생명 주기

단일 동기화 모드:

1. 사용자가 데이터를 수정
2. 원격 요청 즉시 전송
3. 서버 응답이 테이블 상태 업데이트

일괄 동기화 모드:

1. 사용자가 데이터를 수정
2. 변경 사항이 로컬에 저장
3. `submitChanges()`가 모든 변경 사항 전송
4. 서버가 집계된 결과 반환
5. 테이블 상태 최종 확정

## 중요 참고 사항

* `read`는 항상 정의되어야 합니다.
* 단일 동기화 모드는 `create`, `update`, `delete`를 필요로 합니다.
* 일괄 모드는 `batch`를 필요로 합니다.
* 하나의 모드만 활성화해야 합니다.
* 모든 테이블은 편집 전에 `fetch()`를 호출해야 합니다.