From 73d0e03b0860b7d04f170a2c760d88ec3c1e32c1 Mon Sep 17 00:00:00 2001 From: teddy Date: Fri, 27 Mar 2026 10:04:56 +0900 Subject: [PATCH] =?UTF-8?q?=EB=82=A9=ED=92=88=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EC=85=8B=20=EC=97=85=EB=A1=9C=EB=93=9C=20geojson=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataset/service/DatasetBatchService.java | 73 ++++++++++++------- .../dataset/service/DatasetService.java | 7 +- 2 files changed, 54 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/kamco/cd/training/dataset/service/DatasetBatchService.java b/src/main/java/com/kamco/cd/training/dataset/service/DatasetBatchService.java index 4c396fd..cabf593 100644 --- a/src/main/java/com/kamco/cd/training/dataset/service/DatasetBatchService.java +++ b/src/main/java/com/kamco/cd/training/dataset/service/DatasetBatchService.java @@ -49,7 +49,14 @@ public class DatasetBatchService { Object labelJson = map.get("label-json"); // JSON 파싱 - JsonNode json = parseJson(labelJson); + JsonNode json; + try { + json = parseJson(labelJson); + } catch (Exception e) { + // 실패하면 skip, 다음 진행 + log.error("GeoJSON 파싱 실패. skip. file={}", geojsonPath, e); + return; + } // 파일명 파싱 String fileName = Paths.get(comparePath).getFileName().toString(); @@ -67,6 +74,11 @@ public class DatasetBatchService { // JSON 유효성 체크 JsonNode featuresNode = json.path("features"); + if (!featuresNode.isArray()) { + log.warn("features array 아님. skip. file={}", geojsonPath); + return; // skip + } + if (featuresNode.isMissingNode() || !featuresNode.isArray() || featuresNode.isEmpty()) { return; // skip } @@ -76,35 +88,46 @@ public class DatasetBatchService { for (JsonNode feature : featuresNode) { - JsonNode prop = feature.path("properties"); + try { + JsonNode prop = feature.path("properties"); - String compareClassCd = prop.path("before").asText(null); - String targetClassCd = prop.path("after").asText(null); + String compareClassCd = prop.path("before").asText(null); + String targetClassCd = prop.path("after").asText(null); - ArrayNode arr = mapper.createArrayNode(); - arr.add(feature); + // null 방어 + if (compareClassCd == null || targetClassCd == null) { + log.warn("class 값 없음. skip. file={}", fileName); + continue; + } - ObjectNode root = base.deepCopy(); - root.set("features", arr); + ArrayNode arr = mapper.createArrayNode(); + arr.add(feature); - DatasetObjRegDto objRegDto = - DatasetObjRegDto.builder() - .datasetUid(datasetUid) - .compareYyyy(compareYyyy) - .compareClassCd(compareClassCd) - .targetYyyy(targetYyyy) - .targetClassCd(targetClassCd) - .comparePath(comparePath) - .targetPath(targetPath) - .labelPath(labelPath) - .mapSheetNum(mapSheetNum) - .geojson(root) - .geojsonPath(geojsonPath) - .fileName(fileName) - .build(); + ObjectNode root = base.deepCopy(); + root.set("features", arr); - // 데이터 타입별 insert - insertByType(subDir, objRegDto); + DatasetObjRegDto objRegDto = + DatasetObjRegDto.builder() + .datasetUid(datasetUid) + .compareYyyy(compareYyyy) + .compareClassCd(compareClassCd) + .targetYyyy(targetYyyy) + .targetClassCd(targetClassCd) + .comparePath(comparePath) + .targetPath(targetPath) + .labelPath(labelPath) + .mapSheetNum(mapSheetNum) + .geojson(root) + .geojsonPath(geojsonPath) + .fileName(fileName) + .build(); + + // 데이터 타입별 insert + insertByType(subDir, objRegDto); + } catch (Exception e) { + // 개별 feature skip + log.error("feature 처리 실패. skip. file={}", fileName, e); + } } } diff --git a/src/main/java/com/kamco/cd/training/dataset/service/DatasetService.java b/src/main/java/com/kamco/cd/training/dataset/service/DatasetService.java index af6dd05..2ec3702 100644 --- a/src/main/java/com/kamco/cd/training/dataset/service/DatasetService.java +++ b/src/main/java/com/kamco/cd/training/dataset/service/DatasetService.java @@ -368,7 +368,12 @@ public class DatasetService { // 폴더별 처리 if ("label-json".equals(dirName)) { // json 파일이면 파싱 - data.put("label-json", readJson(path)); + try { + data.put("label-json", readJson(path)); + } catch (Exception e) { + log.error("파일 JSON 읽기 실패. skip. file={}", path, e); + return; // skip + } data.put("geojson_path", path.toAbsolutePath().toString()); } else { data.put(dirName, path.toAbsolutePath().toString());