# doSave (method)

> `doSave`는 시트의 변경된 데이터를 자동으로 추출하여 AJAX 통신으로 서버에 전송하고, 서버 응답을 시트에 자동 반영합니다.
> 기본 전송 형식은 querystring(getSaveString과 동일)이며, `queryMode: 0` 설정 시 JSON(getSaveJson과 동일)으로 전송합니다.
> 데이터 추출만 하고 AJAX 통신은 직접 처리하려면 getSaveJson 또는 getSaveString을 사용하세요.
> 비동기로 동작하므로, 전송 전 처리는 onBeforeSave, 응답 후 처리는 onAfterSave 이벤트에서 구현하세요.
> 서버 응답 구조와 관련된 상세 내용은 저장 응답 규격을 참고하세요.
> 저장 시 메시지 표시는 (Cfg)SuppressMessage를 참고하세요.

### Syntax

    void doSave( url, param, saveMode, col, urlEncode, delim, queryMode, reqHeader, quest, sync, validRequired, saveAttr, useLevel, questCallback, timeout, traditional, saveExtraAttr, validSize, validEditMask, validResultMask );

### Parameters

Name | Type | Required | Description
--- | --- | --- | ---
url | `string` | 필수 | ajax를 통해 호출할 url
param | `string` | `object` | 선택 | 서버로 전송할 파라미터
saveMode | `number` | 선택 | 상태별 데이터 추출 여부 `0`:전체데이터 `1`:전체데이터 중 `Deleted` 만 제외 `2`:수정된 데이터(`Added,Changed,Deleted`) (`default`) `3`:수정된 데이터(`Added,Changed,Deleted`)+이동한 데이터(`Moved`)
col | `string` | 선택 | 저장 기준 열의 열이름 특정 열을 지정하면 행의 상태(`Added,Changed,Deleted`)를 무시하고 지정한 열의 데이터 유무에 따라 저장됨.
urlEncode | `boolean` | 선택 | 시트의 데이터에 대한 encoding 여부 `queryMode`별로 `default`가 달라짐 `0(false)`:`queryMode:0 (default)` `1(true)`:`queryMode:1/2 (default)`
delim | `string` | 선택 | queryMode값이 2인 경우에 데이터 사이 구분자 지정 (`default: "\|"`)
queryMode | `number` | 선택 | 서버로 전달될 데이터 구조 설정 `0`:json 구조로 전달 ex) Data={ "data":[ {"STATUS":"Added","ColName1":"홍길동","ColName2":25}, {"STATUS":"Changed","ColName1":"심청","ColName2":18} ]} 단 reqHeader속성에 {"Content-Type":"application/json"}를 추가시 앞에 "Data="이 제거되고 순수하게 json형식만 서버로 전송 `1`:QueryString 구조 전달 (`default`) ex) STATUS=Added&ColName1=홍길동&ColName2=25&STATUS=Changed&ColName1=심청&ColName2=18 `2`:열데이터 기준 QueryString 구조 전달 ex) STATUS=Added|Changed&ColName1=홍길동|심청&ColName2=25|18
reqHeader | `object` | 선택 | 전송시 request header에 추가하고자 하는 내용 (ex) {key1:value1, key2:value2}) Type이 file인 셀의 값이 수정된 경우 reqHeader에 Content-Type:application/json을 설정하여도 form으로 전송됩니다.
quest | `boolean` | 선택 | 저장시 confirm 메세지 사용 여부 `0(false)`:confirm 메세지 사용 안함 (`default`) `1(true)`:confirm 메세지 사용
sync | `boolean` | 선택 | 저장시 동기 여부 `0(false)`:비동기 방식 (`default`) `1(true)`:동기 방식
validRequired | `boolean` | 선택 | 데이터 필수 입력 항목(Required col 설정된 열)에 대한 검사 여부 설정. 검사를 통과하지 못할 시 메시지를 띄우며 편집모드 실행. `0(false)`:필수 입력 항목 검사 안함 `1(true)`:필수 입력 항목 검사 실행 (`default`) ※ Cfg ValidCheck가 활성화된 경우 메시지/편집모드 대신 마킹 + 툴팁으로 표시됩니다.
saveAttr | `string` | 선택 | 각 셀의 속성값을 같이 추출하고자 하는 경우 Name+속성명 형식으로 설정 여러개 속성을 추출하고자 하는 경우 ","를 구분자로 작성 ex) "sNameColor,sNoCanEdit"
useLevel | `boolean` | 선택 | Tree기능 사용시 각 행의 Level(Depth)값을 추출되는 데이터에 포함할지 여부 `0(false)`:Level값 데이터 미포함 `1(true)`:Level값 데이터 포함(`default`) 최 상위 노드를 1부터 시작하여 계산하며, "tLEVEL"이라는 이름으로 행 데이터에 추가됩니다. "tLEVEL"은 각 메세지 파일(ex: ko.js)에서 "TreeLevelName"으로 변경할 수 있습니다. Tree기능을 사용하는 시트에서 해당 속성을 `0(false)`로 설정시 `saveMode:0, queryMode:0`을 통해 추출되는 데이터는 계층구조를 갖게 됩니다. `saveMode`를 이용하여 전체 데이터가 아닌 일부 데이터를 추출 할 경우 데이터는 계층 구조를 가지지 않으며 `"tLEVEL"` 값은 모두 1이 됩니다.
questCallback | `function` | 선택 | confirm 메세지 사용시(`quest:true`) Ok, Cancel에 대한 콜백 함수 Ok(확인) : `{result:1}` Cancel(취소) : `{result:2}`
timeout | `number` | 선택 | 서버 통신 최대 대기 시간 (단위: 초(second), `default: 60`)
traditional | `boolean` | 선택 | 서버로 전달될 param 구조 설정 `param: {"data": [1, 2]}` 배열 구조 param 전송시 설정 `0(false)`:[] 을 포함하여 전송 (`default`) ex) `data[]=1&data[]=2` `1(true)`:[] 없이 전송 ex) `data=1&data=2`
saveExtraAttr | `boolean` | 선택 | 시트에 (col)Name으로 정의하지 않은 데이터가 doSearch나 loadSearchData함수를 통해 로드 된 경우, 저장시 해당 데이터를 서버로 전송할 지 여부. 로드 데이터 첫번째 행의 keyset을 기준으로 추출됨. `0(false)`:시트에 (col)Name으로 정의 되지 않은 데이터 서버 전송 시 미포함 (`default`) `1(true)`:시트에 (col)Name으로 정의 되지 않은 데이터 서버 전송 시 포함
validSize | `boolean` | 선택 | 사이즈 설정(Size col)에 대한 유효성 검사 여부 설정. 검사 실패 시 메시지를 띄우며 편집모드 실행. `0(false)`:사이즈 유효성 검사 안함 (`default`) `1(true)`:사이즈 유효성 검사 실행 ※ Cfg ValidCheck가 활성화된 경우 메시지/편집모드 대신 마킹 + 툴팁으로 표시됩니다.
validEditMask | `boolean` | 선택 | EditMask 설정(EditMask col)에 대한 유효성 검사 여부 설정. 검사 실패 시 메시지를 띄우며 편집모드 실행. `0(false)`:EditMask 유효성 검사 안함 (`default`) `1(true)`:EditMask 유효성 검사 실행 ※ Cfg ValidCheck가 활성화된 경우 메시지/편집모드 대신 마킹 + 툴팁으로 표시됩니다.
validResultMask | `boolean` | 선택 | ResultMask 설정(ResultMask col)에 대한 유효성 검사 여부 설정. 검사 실패 시 메시지를 띄우며 편집모드 실행. `0(false)`:ResultMask 유효성 검사 안함 (`default`) `1(true)`:ResultMask 유효성 검사 실행 ※ Cfg ValidCheck가 활성화된 경우 메시지/편집모드 대신 마킹 + 툴팁으로 표시됩니다.

### Return Value

none

### Example

    // 인자가 많으므로 객체 형식 사용 권장
    sheet.doSave({
      url: "./insaAppMain.do",
      param: "dept_cd=031&position_cd=A0",
      quest: 1,
      questCallback: function(evt) {
        if (evt.result == 2) {
          alert("취소 되었습니다.");
        }
      }
    });

### Read More

- 저장 응답 규격
- Required col
- FormatFix col
- onValidation event
- onSave event
- onBeforeSave event
- onAfterSave event
- getSaveJson method
- getSaveString method
- Timeout cfg
- SuppressMessage cfg
- ValidCheck cfg
- ValidateMessage cfg

### Since

product | version | desc
--- | --- | ---
core | 8.0.0.0 | 기능 추가
core | 8.0.0.4 | `saveAttr`, `useLevel` 기능 추가
core | 8.0.0.5 | `timeout` 기능 추가 `reqHeader` 설명 추가(`file` 타입 관련)
core | 8.0.0.7 | `traditional` 기능 추가
core | 8.1.0.32 | `saveExtraAttr` 기능 추가
core | 8.3.0.24 | `validSize`, `validEditMask`, `validResultMask` 기능 추가