박정하 박정하 04-18
250418 박정하 이슈 수정
@3a30d298dea82cb6df05cd330bbb4b19f2824b45
src/main/java/com/takensoft/taken_bi_manager/common/connection/api/service/impl/ConnectionApiServiceImpl.java
--- src/main/java/com/takensoft/taken_bi_manager/common/connection/api/service/impl/ConnectionApiServiceImpl.java
+++ src/main/java/com/takensoft/taken_bi_manager/common/connection/api/service/impl/ConnectionApiServiceImpl.java
@@ -23,87 +23,135 @@
 public class ConnectionApiServiceImpl implements ConnectionApiService {
     private final ConnectionApiDAO connectionApiDAO;
 
-    private Map<String, Object> findKeyResult = new HashMap<>();
-
     @Override
     public HashMap<String, Object> apiRequestTest(ConnectionApi connApi) throws Exception {
-        List<String> keys = new ArrayList<>();
-
-        if (connApi.getType() != 3) {
-            CommonUtil commonUtil = new CommonUtil();
-            HTTPUtil httpcon = new HTTPUtil();
-            String result = httpcon.HttpGetConnectionApi(connApi.getUrl(), connApi.getParams());
-            connApi.setResult(result);
-
-            if(connApi.getType() == 2) {
-                String jsonStr = commonUtil.xmlStrToJsonStr(connApi.getResult());
-                connApi.setResult(jsonStr);
-            }
-
-            JSONParser parser = new JSONParser();
-            JSONObject jsonObject = null;
-            JSONArray jsonArray = null;
-            if(connApi.getResult().substring(0,1).equals("[")) {
-                jsonArray = (JSONArray) parser.parse(connApi.getResult());
-            } else {
-                jsonObject = (JSONObject) parser.parse(connApi.getResult());
-            }
-
-            if(jsonObject != null) {
-                Map<String, Object> map = commonUtil.jsonObjectToMap(jsonObject);
-
-                if (map.containsKey("response")) {
-                    Map<String, Object> response = (Map<String, Object>) map.get("response");
-                    if (response.containsKey("body")) {
-                        Map<String, Object> body = (Map<String, Object>) response.get("body");
-                        if (body.containsKey("item")) {
-                            keys.add("response>body>item");
-                        } else if (body.containsKey("items")) {
-                            if (body.get("items").toString().substring(0,1).equals("[")) {
-                                keys.add("response>body>items");
-                            } else {
-                                keys.add("response>body>items>item");
-                            }
-                        }
-                    }
-                } else {
-                    String keyString = result.substring(0, result.indexOf('['));
-                    String[] keysArray = keyString.split(",");
-                    String key = keysArray[keysArray.length - 1].substring(1, keysArray[keysArray.length - 1].length() - 2);
-
-                    findKeyResult = new HashMap<>();
-                    findKeyResult.put("key", null);
-                    findKeyResult.put("totalRow", 0);
-                    findKey(map, key);
-
-                    keys.add((String) findKeyResult.get("key"));
-                }
-            }
+        if (connApi.getType() == 3) {
+            return new HashMap<String, Object>() {{
+                put("key", new ArrayList<>());
+            }};
         }
 
+        CommonUtil commonUtil = new CommonUtil();
+        HTTPUtil httpcon = new HTTPUtil();
+        String result = httpcon.HttpGetConnectionApi(connApi.getUrl(), connApi.getParams());
+        connApi.setResult(result);
+
+        // XML을 JSON으로 변환 (Type 2인 경우)
+        if (connApi.getType() == 2) {
+            String jsonStr = commonUtil.xmlStrToJsonStr(connApi.getResult());
+            connApi.setResult(jsonStr);
+        }
+
+        // JSON 파싱
+        Object parsedJson = parseJson(connApi.getResult());
+
+        // 키 경로 찾기
+        List<String> keyPaths = findKeyPathsToArrays(parsedJson, "");
+
         HashMap<String, Object> resultMap = new HashMap<>();
-        resultMap.put("key", keys);
+        resultMap.put("key", keyPaths);
         return resultMap;
     }
 
-    private void findKey(Map<String, Object> map, String key) {
-        for (Map.Entry<String, Object> entrySet : map.entrySet()) {
-            if (entrySet.getKey().equals(key)) {
-                String resultKey = (String) findKeyResult.get("key");
-                if (resultKey == null) {
-                    findKeyResult.put("key", entrySet.getKey() + ">");
-                } else {
-                    findKeyResult.put("key", resultKey + entrySet.getKey() + ">");
+    /**
+     * JSON 문자열을 파싱하여 JSONObject나 JSONArray로 반환
+     */
+    private Object parseJson(String jsonStr) throws Exception {
+        JSONParser parser = new JSONParser();
+        if (jsonStr.trim().startsWith("[")) {
+            return parser.parse(jsonStr);
+        } else {
+            return parser.parse(jsonStr);
+        }
+    }
+
+    /**
+     * 주어진 객체에서 배열로 이어지는 모든 키 경로를 찾아 반환
+     */
+    private List<String> findKeyPathsToArrays(Object jsonData, String currentPath) {
+        List<String> paths = new ArrayList<>();
+
+        // JSONArray인 경우 현재 경로 추가
+        if (jsonData instanceof JSONArray) {
+            paths.add(currentPath.isEmpty() ? "root" : currentPath.substring(0, currentPath.length() - 1)); // 마지막 '>' 제거
+            return paths;
+        }
+
+        // JSONObject인 경우 재귀적으로 탐색
+        if (jsonData instanceof JSONObject) {
+            JSONObject jsonObj = (JSONObject) jsonData;
+
+            // 객체가 비어있으면 빈 리스트 반환
+            if (jsonObj.isEmpty()) {
+                return paths;
+            }
+
+            // 모든 키에 대해 탐색
+            for (Object key : jsonObj.keySet()) {
+                String keyStr = key.toString();
+                Object value = jsonObj.get(keyStr);
+
+                String newPath = currentPath + keyStr + ">";
+
+                // 값이 배열이면 현재 경로 추가
+                if (value instanceof JSONArray) {
+                    paths.add(newPath.substring(0, newPath.length() - 1)); // 마지막 '>' 제거
                 }
-                List<HashMap<String, Object>> datas = (List<HashMap<String, Object>>) entrySet.getValue();
-                findKeyResult.put("totalRow", datas.size());
-            } else {
-                if (entrySet.getValue() instanceof Map) {
-                    Map<String, Object> newMap = (Map<String, Object>) entrySet.getValue();
-                    findKey(newMap, key);
+                // 값이 맵이면 재귀적으로 탐색
+                else if (value instanceof JSONObject) {
+                    paths.addAll(findKeyPathsToArrays(value, newPath));
+                }
+                // 값이 문자열이고 JSON 배열처럼 보이면 파싱 시도
+                else if (value instanceof String && ((String) value).trim().startsWith("[")) {
+                    try {
+                        Object parsed = parseJson((String) value);
+                        if (parsed instanceof JSONArray) {
+                            paths.add(newPath.substring(0, newPath.length() - 1)); // 마지막 '>' 제거
+                        } else {
+                            paths.addAll(findKeyPathsToArrays(parsed, newPath));
+                        }
+                    } catch (Exception e) {
+                        // 파싱 실패 시 무시하고 계속 진행
+                    }
                 }
             }
         }
+
+        // Map 타입인 경우도 처리 (기존 코드 호환성)
+        else if (jsonData instanceof Map) {
+            Map<String, Object> map = (Map<String, Object>) jsonData;
+
+            for (Map.Entry<String, Object> entry : map.entrySet()) {
+                String keyStr = entry.getKey();
+                Object value = entry.getValue();
+
+                String newPath = currentPath + keyStr + ">";
+
+                // 값이 리스트이면 현재 경로 추가
+                if (value instanceof List) {
+                    paths.add(newPath.substring(0, newPath.length() - 1)); // 마지막 '>' 제거
+                }
+                // 값이 맵이면 재귀적으로 탐색
+                else if (value instanceof Map) {
+                    paths.addAll(findKeyPathsToArrays(value, newPath));
+                }
+                // 값이 문자열이고 JSON 배열처럼 보이면 파싱 시도
+                else if (value instanceof String && ((String) value).trim().startsWith("[")) {
+                    try {
+                        Object parsed = parseJson((String) value);
+                        if (parsed instanceof JSONArray) {
+                            paths.add(newPath.substring(0, newPath.length() - 1)); // 마지막 '>' 제거
+                        } else {
+                            paths.addAll(findKeyPathsToArrays(parsed, newPath));
+                        }
+                    } catch (Exception e) {
+                        // 파싱 실패 시 무시하고 계속 진행
+                    }
+                }
+            }
+        }
+
+        return paths;
     }
 
     @Override
src/main/java/com/takensoft/taken_bi_manager/data/service/impl/DataServiceImpl.java
--- src/main/java/com/takensoft/taken_bi_manager/data/service/impl/DataServiceImpl.java
+++ src/main/java/com/takensoft/taken_bi_manager/data/service/impl/DataServiceImpl.java
@@ -377,7 +377,7 @@
 
 			datasetDataUpdate(datatable,connectionDB, user);
 
-			if(deleteData.size() > 0) {
+			if(deleteData != null && !deleteData.isEmpty()) {
 				// 삭제 진행 (키값 찾아서 한방에 지워야함)
 				datatable.setRowData(deleteData);
 
@@ -397,11 +397,8 @@
 				DBConnectionUtil dbUtil = new DBConnectionUtil();
 				dbUtil.datasetDataDelete(connectionDB, datatable);
 			}
-
 			// 데이터셋 업데이트 로그
 			datasetDAO.insertDatasetPostLog(datasetPostLog);
-
-
 		}catch (Exception e){
 			if(e.toString().length() > 501){
 				resultMap.getCheckMessage().setError(e.toString().substring(0,500));
src/main/java/com/takensoft/taken_bi_manager/schedule/service/impl/DiagramServiceImpl.java
--- src/main/java/com/takensoft/taken_bi_manager/schedule/service/impl/DiagramServiceImpl.java
+++ src/main/java/com/takensoft/taken_bi_manager/schedule/service/impl/DiagramServiceImpl.java
@@ -487,11 +487,7 @@
                     List<List<Object>> changeData = new ArrayList<>();
                     List<List<Object>> deleteData = new ArrayList<>();
 
-                    if (jobItm.isItm_option_bool()) {
-                        dataService.datasetRowDataUpdate(jobItm.getItm_id(), changeData, deleteData, newRowData, "admin");
-                    } else {
-                        dataService.datasetRowDataUpdate(jobItm.getItm_id(), newRowData, deleteData, insertData, "admin");
-                    }
+                    dataService.datasetRowDataUpdate(jobItm.getItm_id(), changeData, deleteData, newRowData, "admin");
                 }
 
                 jobItm.getDataTable().setRowData(newRowData);
src/main/resources/spring/mapper/sql/mariadb-SQL.xml
--- src/main/resources/spring/mapper/sql/mariadb-SQL.xml
+++ src/main/resources/spring/mapper/sql/mariadb-SQL.xml
@@ -45,7 +45,8 @@
 			TABLE_SCHEMA = #{databaseNm}
 		AND
 			TABLE_NAME = #{tableNm}
-		
+		ORDER BY
+			ORDINAL_POSITION
 	</select>
 	
 	<!-- 
src/main/resources/spring/mapper/sql/mssql-SQL.xml
--- src/main/resources/spring/mapper/sql/mssql-SQL.xml
+++ src/main/resources/spring/mapper/sql/mssql-SQL.xml
@@ -69,6 +69,8 @@
             C.TABLE_CATALOG = #{databaseNm}
         AND
             C.TABLE_NAME = #{tableNm}
+        ORDER BY
+            C.ORDINAL_POSITION
     </select>
 
     <!--
src/main/resources/spring/mapper/sql/mysql-SQL.xml
--- src/main/resources/spring/mapper/sql/mysql-SQL.xml
+++ src/main/resources/spring/mapper/sql/mysql-SQL.xml
@@ -44,7 +44,8 @@
 			TABLE_SCHEMA = #{databaseNm}
 		AND
 			TABLE_NAME = #{tableNm}
-
+        ORDER BY
+            ORDINAL_POSITION
 	</select>
 
     <!--
src/main/resources/spring/mapper/sql/postgre-SQL.xml
--- src/main/resources/spring/mapper/sql/postgre-SQL.xml
+++ src/main/resources/spring/mapper/sql/postgre-SQL.xml
@@ -69,7 +69,9 @@
 		AND
 			c.table_name = #{tableNm}
 		GROUP BY
-			c.table_schema, c.table_name, c.column_name, c.data_type, c.character_maximum_length, c.ordinal_position;
+			c.table_schema, c.table_name, c.column_name, c.data_type, c.character_maximum_length, c.ordinal_position
+		ORDER BY
+			c.ordinal_position;
 	</select>
 
 	<!--
Add a comment
List