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 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()); + } + } + } }