From 860ce35a8f5e7028fe952672a8dae09223dba67a Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Thu, 12 Feb 2026 16:14:19 +0900 Subject: [PATCH 1/3] =?UTF-8?q?docker=20mount=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose-dev.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index b59e0c5..010096e 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -14,6 +14,7 @@ services: - /mnt/nfs_share/images:/app/original-images - /mnt/nfs_share/model_output:/app/model-outputs - /mnt/nfs_share/train_dataset:/app/train-dataset + - /home/kcomu/data:/home/kcomu/data networks: - kamco-cds restart: unless-stopped From 590810ff0ad212cf59b1fd0c0a848240e995f457 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Thu, 12 Feb 2026 16:41:40 +0900 Subject: [PATCH 2/3] =?UTF-8?q?file=20=ED=99=95=EC=9D=B8=20API=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataset/DatasetApiController.java | 10 +------ .../dataset/service/DatasetService.java | 28 ++----------------- 2 files changed, 3 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/kamco/cd/training/dataset/DatasetApiController.java b/src/main/java/com/kamco/cd/training/dataset/DatasetApiController.java index cfd2466..5eee850 100644 --- a/src/main/java/com/kamco/cd/training/dataset/DatasetApiController.java +++ b/src/main/java/com/kamco/cd/training/dataset/DatasetApiController.java @@ -14,15 +14,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.List; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.core.io.Resource; -import org.springframework.core.io.UrlResource; import org.springframework.data.domain.Page; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -230,11 +226,7 @@ public class DatasetApiController { throws Exception { String path = datasetService.getFilePathByUUIDPathType(uuid, pathType); - Path filePath = Paths.get(path); - - Resource resource = new UrlResource(filePath.toUri()); - - return ResponseEntity.ok().contentType(MediaType.APPLICATION_OCTET_STREAM).body(resource); + return datasetService.getFilePathByFile(path); } @Operation(summary = "객체별 파일 Path 조회", description = "파일 Path 조회") 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 7a98a76..98d436a 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 @@ -4,9 +4,6 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.jcraft.jsch.ChannelSftp; -import com.jcraft.jsch.JSch; -import com.jcraft.jsch.Session; import com.kamco.cd.training.common.enums.LearnDataType; import com.kamco.cd.training.common.exception.CustomApiException; import com.kamco.cd.training.common.service.FormatStorage; @@ -32,7 +29,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Properties; import java.util.UUID; import java.util.stream.Stream; import lombok.RequiredArgsConstructor; @@ -502,29 +498,9 @@ public class DatasetService { public ResponseEntity getFilePathByFile(String remoteFilePath) { - String host = "192.168.2.86"; - String user = "kcomu"; - String password = "Kamco2025!"; - - Session session = null; - ChannelSftp sftp = null; - try { - JSch jsch = new JSch(); - - session = jsch.getSession(user, host, 22); - session.setPassword(password); - - Properties config = new Properties(); - config.put("StrictHostKeyChecking", "no"); - session.setConfig(config); - session.connect(10_000); - - sftp = (ChannelSftp) session.openChannel("sftp"); - sftp.connect(5_000); - - // 86 서버 파일을 스트림으로 연다 - InputStream inputStream = sftp.get(normalizeLinuxPath(remoteFilePath)); + Path path = Paths.get(remoteFilePath); + InputStream inputStream = Files.newInputStream(path); InputStreamResource resource = new InputStreamResource(inputStream) { From 384a321bf37fb27eeaaf788bdffc44372212b3c6 Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Thu, 12 Feb 2026 16:50:40 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=EB=AA=A8=EB=8D=B8=ED=95=99=EC=8A=B5=201?= =?UTF-8?q?=EB=8B=A8=EA=B3=84=20=EC=8B=A4=ED=96=89=EC=A4=91=EC=9D=B8=20?= =?UTF-8?q?=EA=B2=83=EC=9D=B4=20=EC=9E=88=EB=8A=94=EC=A7=80=20count=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/ModelTrainMngApiController.java | 18 ++++++++++++++++++ .../model/service/ModelTrainMngService.java | 4 ++++ .../core/ModelTrainMngCoreService.java | 4 ++++ .../model/ModelMngRepositoryCustom.java | 2 ++ .../model/ModelMngRepositoryImpl.java | 10 ++++++++++ .../service/ModelTrainMetricsJobService.java | 6 +++++- 6 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java b/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java index 6251ae0..016c778 100644 --- a/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java +++ b/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java @@ -149,4 +149,22 @@ public class ModelTrainMngApiController { req.setDataType(selectType); return ApiResponseDto.ok(modelTrainMngService.getDatasetSelectList(req)); } + + @Operation(summary = "모델학습 1단계 실행중인 것이 있는지 count", description = "모델학습 1단계 실행중인 것이 있는지 count") + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "검색 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = Long.class))), + @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) + @GetMapping("/ing-training-cnt") + public ApiResponseDto findModelStep1InProgressCnt() { + return ApiResponseDto.ok(modelTrainMngService.findModelStep1InProgressCnt()); + } } diff --git a/src/main/java/com/kamco/cd/training/model/service/ModelTrainMngService.java b/src/main/java/com/kamco/cd/training/model/service/ModelTrainMngService.java index e7a6dc1..4778c35 100644 --- a/src/main/java/com/kamco/cd/training/model/service/ModelTrainMngService.java +++ b/src/main/java/com/kamco/cd/training/model/service/ModelTrainMngService.java @@ -136,4 +136,8 @@ public class ModelTrainMngService { return modelTrainMngCoreService.getDatasetSelectG2G3List(req); } } + + public Long findModelStep1InProgressCnt() { + return modelTrainMngCoreService.findModelStep1InProgressCnt(); + } } diff --git a/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainMngCoreService.java b/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainMngCoreService.java index f28c1ef..1143d26 100644 --- a/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainMngCoreService.java +++ b/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainMngCoreService.java @@ -502,4 +502,8 @@ public class ModelTrainMngCoreService { public List findDatasetUid(List datasetIds) { return datasetRepository.findDatasetUid(datasetIds); } + + public Long findModelStep1InProgressCnt() { + return modelMngRepository.findModelStep1InProgressCnt(); + } } diff --git a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryCustom.java b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryCustom.java index 2dc94e0..ab83229 100644 --- a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryCustom.java @@ -22,4 +22,6 @@ public interface ModelMngRepositoryCustom { Optional findFirstByStatusCdAndDelYn(String statusCd, Boolean delYn); TrainRunRequest findTrainRunRequest(Long modelId); + + Long findModelStep1InProgressCnt(); } diff --git a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryImpl.java b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryImpl.java index 642b6cc..933e428 100644 --- a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelMngRepositoryImpl.java @@ -4,6 +4,7 @@ import static com.kamco.cd.training.postgres.entity.QModelConfigEntity.modelConf import static com.kamco.cd.training.postgres.entity.QModelHyperParamEntity.modelHyperParamEntity; import static com.kamco.cd.training.postgres.entity.QModelMasterEntity.modelMasterEntity; +import com.kamco.cd.training.common.enums.TrainStatusType; import com.kamco.cd.training.model.dto.ModelTrainMngDto; import com.kamco.cd.training.postgres.entity.ModelMasterEntity; import com.kamco.cd.training.train.dto.TrainRunRequest; @@ -147,4 +148,13 @@ public class ModelMngRepositoryImpl implements ModelMngRepositoryCustom { .where(modelMasterEntity.id.eq(modelId)) .fetchOne(); } + + @Override + public Long findModelStep1InProgressCnt() { + return queryFactory + .select(modelMasterEntity.id.count()) + .from(modelMasterEntity) + .where(modelMasterEntity.step1State.eq(TrainStatusType.IN_PROGRESS.getId())) + .fetchOne(); + } } diff --git a/src/main/java/com/kamco/cd/training/train/service/ModelTrainMetricsJobService.java b/src/main/java/com/kamco/cd/training/train/service/ModelTrainMetricsJobService.java index 2132af7..339e33b 100644 --- a/src/main/java/com/kamco/cd/training/train/service/ModelTrainMetricsJobService.java +++ b/src/main/java/com/kamco/cd/training/train/service/ModelTrainMetricsJobService.java @@ -27,6 +27,10 @@ public class ModelTrainMetricsJobService { @Value("${spring.profiles.active}") private String profile; + // 학습 결과가 저장될 호스트 디렉토리 + @Value("${train.docker.responseDir}") + private String responseDir; + /** * 실행중인 profile * @@ -51,7 +55,7 @@ public class ModelTrainMetricsJobService { for (ResponsePathDto modelInfo : modelIds) { - String trainPath = modelInfo.getResponsePath() + "/metrics/train.csv"; + String trainPath = responseDir + "{uuid}/metrics/train.csv"; // TODO try (BufferedReader reader = Files.newBufferedReader(Paths.get(trainPath), StandardCharsets.UTF_8); ) {