/** mode가 save일때 request 전문의 rows 데이터 파싱 */
  public static void setRowData(GridData gridData, List<List<String>> rowDataList)
      throws Exception {

    GridHeader[] gridHeaders = gridData.getHeaders();
    int headersCount = gridHeaders.length;
    int rowCount = rowDataList.size();
    int rowsColumnCount = 0;

    for (int i = 0; i < rowCount; i++) {
      rowsColumnCount = rowDataList.get(i).size();
      if (rowsColumnCount != headersCount) {
        throw new Exception("헤더컬럼수와 로우즈 컬럼수가 일치하지 않습니다.");
      } else {
        for (int j = 0; j < headersCount; j++) {
          if (!(rowDataList.get(i).get(j) instanceof String)) {
            gridHeaders[j].addValue(String.valueOf(rowDataList.get(i).get(j)), "");
          } else {
            gridHeaders[j].addValue(rowDataList.get(i).get(j), "");
          }
        }
      }
    }
  }
  /**
   * WiseGrid 에 전달할 GridData 를 전문화해서 전송
   *
   * @param gridObj realGrid 에 전달할 GridData 객체
   * @param out 일반조회용 Out
   * @param out2 압축조회용 Out
   * @param bMulti 통합통신 여부
   * @param bUseHiddenValue HiddenValue 사용 유무 - 현재는 사용안함
   * @throws Exception
   * @since v2, 0, 0, 1
   */
  private static void write(
      GridData gridObj, Writer out, OutputStream out2, boolean bMulti, boolean bUseHiddenValue)
      throws Exception {

    if (out == null) {
      throw new Exception("Not available write method arguments!");
    }

    // 동적메소드 사용여부 확인.
    //        if (gridObj.hasDynamicMethod()) { }

    LinkedHashMap<String, Object> jsonResponseString = new LinkedHashMap<String, Object>();
    // 헤더에서 데이터 추출 및 JSON형식으로 파싱

    String gridMode = gridObj.getMode();

    if ("search".equals(gridMode)) {

      jsonResponseString.put(json_mode, gridMode);
      GridHeader[] gridHeaders = gridObj.getHeaders();
      String[][] rowData = new String[gridHeaders[0].getRowCount()][gridHeaders.length];
      List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
      String[] comboListValues = null;
      String[] comboListHiddenValues = null;

      // 그리드 헤더수만큼 for, 헤더의 row수 만큼 데이터 추출
      for (int i = 0; i < gridHeaders.length; i++) {

        // setComboValues() 를 만나 콤보리스트 값이 변경이 되었을 경우만 콤보리스트 셋팅하여 response로 내려준다.
        if (t_combo.equals(gridHeaders[i].getDataType())
            && gridHeaders[i].getComboListChange() == true) {
          // 콤보리스트 -> listItems
          int comboListItemCount = gridHeaders[i].getComboListItemCount();
          comboListValues = gridHeaders[i].getComboValues();
          comboListHiddenValues = gridHeaders[i].getComboHiddenValues();
          /*
           * 리스트 <- 맵 <-  리스트 -< 맵
           * */
          LinkedHashMap<String, Object> comboItemMap = new LinkedHashMap<String, Object>();
          List<LinkedHashMap<String, String>> comboSetList =
              new ArrayList<LinkedHashMap<String, String>>();
          for (int k = 0; k < comboListItemCount; k++) {
            LinkedHashMap<String, String> comboDataSet = new LinkedHashMap<String, String>();
            comboDataSet.put(comboListValues[k], comboListHiddenValues[k]);
            comboSetList.add(comboDataSet);
          }
          comboItemMap.put(gridHeaders[i].getID(), comboSetList);
          listItems.add(comboItemMap);
        }

        for (int j = 0; j < gridHeaders[i].getRowCount(); j++) {
          rowData[j][i] = gridHeaders[i].getValue(j);
        }
      }
      jsonResponseString.put("rows", rowData);
      if (listItems.size() != 0) {
        jsonResponseString.put("listItems", listItems);
      }
    } else {
      jsonResponseString.put(json_mode, "save");
    }

    jsonResponseString.put(messageid, gridObj.getMessage());
    jsonResponseString.put(statusid, gridObj.getStatus());
    out.write(new ObjectMapper().writeValueAsString(jsonResponseString));
  }