From cc1cfcc2d9140913702f8ec55803e636d2b56d3a Mon Sep 17 00:00:00 2001 From: bjkim Date: Tue, 23 Sep 2025 21:13:29 +0900 Subject: [PATCH] =?UTF-8?q?[UPDATE]=20ExperimentsController=20createExperi?= =?UTF-8?q?ment=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20=EB=B0=8F=20=EC=99=B8?= =?UTF-8?q?=EB=B6=80=20=ED=98=B8=EC=B6=9C=20=EC=84=B1=EA=B3=B5=20=ED=9B=84?= =?UTF-8?q?=20DB=20=EC=A0=80=EC=9E=A5=20=EC=B2=98=EB=A6=AC=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/ExperimentsController.java | 62 ++++--------------- 1 file changed, 13 insertions(+), 49 deletions(-) diff --git a/src/main/java/kr/re/etri/autoflow/controllers/ExperimentsController.java b/src/main/java/kr/re/etri/autoflow/controllers/ExperimentsController.java index 3e5e25b..7ede737 100644 --- a/src/main/java/kr/re/etri/autoflow/controllers/ExperimentsController.java +++ b/src/main/java/kr/re/etri/autoflow/controllers/ExperimentsController.java @@ -125,12 +125,14 @@ public class ExperimentsController { // .doOnError(e -> log.error("Kubeflow experiment 등록 실패", e)); // } - @Operation(summary = "Experiment 등록 (Kubeflow + MLflow)") @PostMapping @Transactional public Mono> createExperiment(@RequestBody ExperimentsEntity experiment) { - ExperimentsEntity saved = experimentsService.save(experiment); + // DB에 미리 저장하지 않고, 메모리에 보관 + ExperimentsEntity saved = new ExperimentsEntity(); + saved.setDisplayName(experiment.getDisplayName()); + saved.setDescription(experiment.getDescription()); Map kubeflowPayload = new HashMap<>(); kubeflowPayload.put("display_name", saved.getDisplayName()); @@ -146,7 +148,6 @@ public class ExperimentsController { .retrieve() .bodyToMono(Map.class) .flatMap(kubeflowResp -> { - // Kubeflow 응답 처리 if (kubeflowResp.containsKey("experiment_id")) { saved.setKubeFlowId((String) kubeflowResp.get("experiment_id")); } @@ -157,18 +158,7 @@ public class ExperimentsController { .toLocalDateTime() ); } - if (kubeflowResp.containsKey("last_run_created_at")) { - saved.setKubeflowLastRunCreatedAt( - Instant.parse((String) kubeflowResp.get("last_run_created_at")) - .atZone(ZoneId.of("Asia/Seoul")) - .toLocalDateTime() - ); - } - if (kubeflowResp.containsKey("storage_state")) { - saved.setKubeflowStorageState((String) kubeflowResp.get("storage_state")); - } - experimentsService.save(saved); log.info("Kubeflow experiment 등록 완료: {}", kubeflowResp); // 2️⃣ MLflow 등록 @@ -188,56 +178,30 @@ public class ExperimentsController { log.info("MLflow experiment 등록 완료: {}", createResp); String mlflowExpId = (String) createResp.get("experiment_id"); - // 3️⃣ MLflow 조회 - return webClientBuilder - .build() + return webClientBuilder.build() .get() .uri(mlflowBaseUrl + "/ajax-api/2.0/mlflow/experiments/get?experiment_id=" + mlflowExpId) .headers(headers -> headers.setBasicAuth(mlflowUser, mlflowPassword)) .retrieve() .bodyToMono(Map.class) - .flatMap(getResp -> { - log.info("MLflow experiment 상세 조회 완료: {}", getResp); - // 필요한 필드를 entity에 반영 + .map(getResp -> { if (getResp.containsKey("experiment")) { Map exp = (Map) getResp.get("experiment"); + saved.setMlFlowId((String) exp.get("experiment_id")); + saved.setMlflow_artifactLocation((String) exp.get("artifact_location")); + saved.setMlflowLifecycleStage((String) exp.get("lifecycle_stage")); + } - // MLflow 응답 필드 반영 - if (exp.containsKey("experiment_id")) { - saved.setMlFlowId((String) exp.get("experiment_id")); - } + // DB 저장은 외부 호출이 모두 성공한 이후 + ExperimentsEntity finalSaved = experimentsService.save(saved); - if (exp.containsKey("artifact_location")) { - saved.setMlflow_artifactLocation((String) exp.get("artifact_location")); - } - if (exp.containsKey("lifecycle_stage")) { - saved.setMlflowLifecycleStage((String) exp.get("lifecycle_stage")); - } - if (exp.containsKey("created_at")) { - // created_at은 timestamp(ms)로 올 수도 있으므로 Instant 변환 - Object createdAtObj = exp.get("created_at"); - Instant createdAtInstant = null; - if (createdAtObj instanceof Number) { - createdAtInstant = Instant.ofEpochMilli(((Number) createdAtObj).longValue()); - } else if (createdAtObj instanceof String) { - createdAtInstant = Instant.parse((String) createdAtObj); - } - if (createdAtInstant != null) { - saved.setMlflowCreatedAt( - createdAtInstant.atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime() - ); - } - } - } - experimentsService.save(saved); - return Mono.just(ResponseEntity.ok(saved)); + return ResponseEntity.ok(finalSaved); }); }); }) .doOnError(e -> log.error("Experiment 등록 실패", e)); } - @Operation(summary = "Experiment 수정") @PutMapping("/{id}") public ResponseEntity updateExperiment(