From c7f63d1ad11a3f048f205f6b289706baf24346bf Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Wed, 18 Feb 2026 16:22:32 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EC=95=95=EC=B6=95=20=ED=95=B4=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=20=ED=8F=B4=EB=8D=94=EC=9D=98=20=EA=B0=AF=EC=88=98=20?= =?UTF-8?q?=EB=A7=9E=EB=8A=94=EC=A7=80=20log=20=EC=B0=8D=EA=B8=B0=20+=20?= =?UTF-8?q?=EA=B0=AF=EC=88=98=20=EB=A7=9E=EC=A7=80=20=EC=95=8A=EC=9C=BC?= =?UTF-8?q?=EB=A9=B4=20exception=20=EB=A6=AC=ED=84=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataset/service/DatasetService.java | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) 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 d9d56f2..cc0088e 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 @@ -28,8 +28,10 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -59,6 +61,7 @@ public class DatasetService { private static final List LABEL_DIRS = List.of("label-json", "label", "input1", "input2"); private static final List REQUIRED_DIRS = Arrays.asList("train", "val", "test"); + private static final List CHECK_DIRS = List.of("label", "input1", "input2"); /** * 데이터셋 목록 조회 @@ -186,7 +189,8 @@ public class DatasetService { // 압축 해제한 폴더 하위에 train,val,test 폴더 모두 존재하는지 확인 validateTrainValTestDirs(addReq.getFilePath() + addReq.getFileName().replace(".zip", "")); - // TODO : 압축 해제한 폴더의 갯수 맞는지 log 찍기 + // 압축 해제한 폴더의 갯수 맞는지 log 찍기 + validateDirFileCount(addReq.getFilePath() + addReq.getFileName().replace(".zip", "")); // 해제한 폴더 읽어서 데이터 저장 List> list = @@ -473,4 +477,50 @@ public class DatasetService { + " (필수: train, val, test)"); } } + + public static void validateDirFileCount(String unzipRootDir) { + Path root = Paths.get(unzipRootDir); + + for (String split : REQUIRED_DIRS) { + + Path splitPath = root.resolve(split); + + Map fileCountMap = new HashMap<>(); + + for (String subDir : CHECK_DIRS) { // input1, input2, label 폴더만 수행하기 + + Path subDirPath = splitPath.resolve(subDir); + + if (!Files.isDirectory(subDirPath)) { + throw new CustomApiException( + ApiResponseCode.NOT_FOUND_DATA.getId(), + HttpStatus.CONFLICT, + split + " 폴더 하위에 " + subDir + " 폴더가 존재하지 않습니다."); + } + + long count; + try (Stream files = Files.list(subDirPath)) { + count = files.filter(Files::isRegularFile).count(); + log.info("dir: " + subDirPath + ", count: " + count); + } catch (IOException e) { + throw new CustomApiException( + ApiResponseCode.NOT_FOUND_DATA.getId(), + HttpStatus.CONFLICT, + split + "/" + subDir + " 파일 개수 확인 중 오류 발생"); + } + + fileCountMap.put(subDir, count); + } + + // 모든 폴더 파일 개수가 동일한지 확인 + Set uniqueCounts = new HashSet<>(fileCountMap.values()); + + if (uniqueCounts.size() != 1) { + throw new CustomApiException( + ApiResponseCode.NOT_FOUND_DATA.getId(), + HttpStatus.CONFLICT, + split + " 데이터 파일 개수가 일치하지 않습니다. " + fileCountMap.toString()); + } + } + } } From 413631840f2fd5a19a7a670b70194e49597f5912 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Wed, 18 Feb 2026 16:29:28 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=ED=95=99=EC=8A=B5=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20security=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/kamco/cd/training/config/SecurityConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/kamco/cd/training/config/SecurityConfig.java b/src/main/java/com/kamco/cd/training/config/SecurityConfig.java index dce8157..0f4068f 100644 --- a/src/main/java/com/kamco/cd/training/config/SecurityConfig.java +++ b/src/main/java/com/kamco/cd/training/config/SecurityConfig.java @@ -79,7 +79,8 @@ public class SecurityConfig { "/api/members/*/password", "/api/upload/chunk-upload-dataset", "/api/upload/chunk-upload-complete", - "/download_progress_test.html") + "/download_progress_test.html", + "/api/models/download/**") .permitAll() // default