From 7373e3722ba9868f939d2e5793f652b3e669eee1 Mon Sep 17 00:00:00 2001 From: kakusiA Date: Tue, 23 Sep 2025 17:19:16 +0900 Subject: [PATCH 1/5] =?UTF-8?q?:fix=20-=20=EC=8A=A4=EC=BC=80=EC=A4=84=20?= =?UTF-8?q?=EC=8A=A4=ED=82=A4=EB=A7=88=20=EC=9C=A0=EB=8B=88=ED=81=AC=20?= =?UTF-8?q?=EC=A0=9C=EC=95=BD=EC=A1=B0=EA=B1=B4=20=EC=A0=9C=EA=B1=B0=20-?= =?UTF-8?q?=20workflow=20insert=EB=AC=B8=20default=5Fconfig=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/user-service/src/main/resources/sql/01-schema.sql | 5 +++++ .../src/main/resources/sql/03-insert-workflow.sql | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/user-service/src/main/resources/sql/01-schema.sql b/apps/user-service/src/main/resources/sql/01-schema.sql index 31242c33..26f2fb1b 100644 --- a/apps/user-service/src/main/resources/sql/01-schema.sql +++ b/apps/user-service/src/main/resources/sql/01-schema.sql @@ -333,3 +333,8 @@ CREATE INDEX idx_log_level_status ON execution_log(log_level, status); CREATE INDEX idx_error_code ON execution_log(error_code); CREATE INDEX idx_duration ON execution_log(duration_ms); CREATE INDEX idx_execution_type_source ON execution_log(execution_type, source_id); + +-- v0.5 +-- 기존 schedule 테이블 유니크키 수정 +-- 컬럼 추가 (한 번에 하나씩) +ALTER TABLE schedule DROP CONSTRAINT uk_schedule_workflow; diff --git a/apps/user-service/src/main/resources/sql/03-insert-workflow.sql b/apps/user-service/src/main/resources/sql/03-insert-workflow.sql index 0660b31f..9238b8a2 100644 --- a/apps/user-service/src/main/resources/sql/03-insert-workflow.sql +++ b/apps/user-service/src/main/resources/sql/03-insert-workflow.sql @@ -16,7 +16,7 @@ DELETE FROM `workflow`; -- 워크플로우 생성 (ID: 1) INSERT INTO `workflow` (`id`, `name`, `description`, `created_by`, `default_config`) VALUES (1, '상품 분석 및 블로그 자동 발행', '키워드 검색부터 상품 분석 후 블로그 발행까지의 자동화 프로세스', 1, - JSON_OBJECT('keyword_search',json_object('tag','naver'),'blog_publish',json_object('tag','naver_blog','blog_id', 'wtecho331', 'blog_pw', 'testpass'))) + JSON_OBJECT('1',json_object('tag','naver'),'8',json_object('tag','naver_blog','blog_id', 'wtecho331', 'blog_pw', 'testpass'))) ON DUPLICATE KEY UPDATE name = VALUES(name), description = VALUES(description), From 4bfc8c294579659b237dbbd8f7547e2a80ff6ab6 Mon Sep 17 00:00:00 2001 From: kakusiA Date: Tue, 23 Sep 2025 17:23:17 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20=EC=9B=8C=ED=81=AC=20=ED=94=8C?= =?UTF-8?q?=EB=A1=9C=EC=9A=B0=20=ED=95=98=EB=93=9C=EC=BD=94=EB=94=A9=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=201.=20workflow=20=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=B8=94=EC=97=90=EC=84=9C=20default=5Fconfig=EA=B0=92=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=202.=20=EA=B0=81=20task=5F?= =?UTF-8?q?id=EC=97=90=EB=A7=9E=EA=B2=8C=20config=EA=B0=92=EC=9D=B4=20sett?= =?UTF-8?q?ing=EC=97=90=20=EB=93=A4=EC=96=B4=EA=B0=80=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=203.=20=EA=B0=81=EA=B0=81=EC=9D=98=20taskBui?= =?UTF-8?q?lder=EC=97=90=20=ED=95=98=EB=93=9C=EC=BD=94=EB=94=A9=EB=90=9C?= =?UTF-8?q?=EA=B0=92=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../icebang/domain/workflow/dto/TaskDto.java | 1 + .../icebang/domain/workflow/model/Task.java | 3 +- .../fastapi/body/BlogPublishBodyBuilder.java | 10 +++---- .../body/KeywordSearchBodyBuilder.java | 3 +- .../service/WorkflowExecutionService.java | 28 +++++++++++++++---- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/dto/TaskDto.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/dto/TaskDto.java index 286e7e8c..fa83fe7d 100644 --- a/apps/user-service/src/main/java/site/icebang/domain/workflow/dto/TaskDto.java +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/dto/TaskDto.java @@ -12,6 +12,7 @@ public class TaskDto { private String name; private String type; private Integer executionOrder; + private JsonNode settings; private JsonNode parameters; private LocalDateTime createdAt; private LocalDateTime updatedAt; diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/model/Task.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/model/Task.java index 5fed64f9..ebe2cc3e 100644 --- a/apps/user-service/src/main/java/site/icebang/domain/workflow/model/Task.java +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/model/Task.java @@ -16,14 +16,15 @@ public class Task { /** Task의 타입 (예: "HTTP", "SPRING_BATCH") 이 타입에 따라 TaskRunner가 선택됩니다. */ private String type; - /** Task 실행에 필요한 파라미터 (JSON) 예: {"url": "http://...", "method": "POST", "body": {...}} */ private JsonNode parameters; + private JsonNode settings; public Task(TaskDto taskDto) { this.id = taskDto.getId(); this.name = taskDto.getName(); this.type = taskDto.getType(); + this.settings = taskDto.getSettings(); this.parameters = taskDto.getParameters(); } } diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/BlogPublishBodyBuilder.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/BlogPublishBodyBuilder.java index 1bf9561f..31db223b 100644 --- a/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/BlogPublishBodyBuilder.java +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/BlogPublishBodyBuilder.java @@ -49,11 +49,11 @@ public ObjectNode build(Task task, Map workflowContext) { .filter(node -> !node.isMissingNode()) .ifPresent(tagsNode -> body.set("post_tags", tagsNode)); }); - - body.put("tag", "TISTORY_BLOG"); - body.put("blog_name", "hoons2641"); - body.put("blog_id", "fair_05@nate.com"); - body.put("blog_pw", "kdyn26*"); + String blog_name = task.getSettings().path("blog_name").asText(""); + body.put("tag", task.getSettings().get("tag").asText()); + body.put("blog_name",blog_name); + body.put("blog_id", task.getSettings().get("blog_id").asText()); + body.put("blog_pw", task.getSettings().get("blog_pw").asText()); return body; } diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/KeywordSearchBodyBuilder.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/KeywordSearchBodyBuilder.java index 17add786..3797e233 100644 --- a/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/KeywordSearchBodyBuilder.java +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/KeywordSearchBodyBuilder.java @@ -27,6 +27,7 @@ public boolean supports(String taskName) { @Override public ObjectNode build(Task task, Map workflowContext) { // 이 Task는 항상 정적인 Body를 가집니다. - return objectMapper.createObjectNode().put("tag", "naver"); + String tag = task.getSettings().get("tag").asText(); + return objectMapper.createObjectNode().put("tag", tag); } } diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowExecutionService.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowExecutionService.java index c547dd2d..1d66dc8f 100644 --- a/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowExecutionService.java +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowExecutionService.java @@ -1,10 +1,12 @@ package site.icebang.domain.workflow.service; +import java.math.BigInteger; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import com.fasterxml.jackson.databind.JsonMappingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; @@ -26,8 +28,11 @@ import site.icebang.domain.execution.model.TaskRun; import site.icebang.domain.execution.model.WorkflowRun; import site.icebang.domain.workflow.dto.TaskDto; +import site.icebang.domain.workflow.dto.WorkflowCardDto; +import site.icebang.domain.workflow.dto.WorkflowDetailCardDto; import site.icebang.domain.workflow.manager.ExecutionMdcManager; import site.icebang.domain.workflow.mapper.JobMapper; +import site.icebang.domain.workflow.mapper.WorkflowMapper; import site.icebang.domain.workflow.model.Job; import site.icebang.domain.workflow.model.Task; import site.icebang.domain.workflow.runner.TaskRunner; @@ -40,6 +45,7 @@ public class WorkflowExecutionService { private static final Logger workflowLogger = LoggerFactory.getLogger("WORKFLOW_HISTORY"); private final JobMapper jobMapper; private final WorkflowRunMapper workflowRunMapper; + private final WorkflowMapper workflowMapper; private final JobRunMapper jobRunMapper; private final TaskRunMapper taskRunMapper; private final Map taskRunners; @@ -54,14 +60,13 @@ public void executeWorkflow(Long workflowId) { try { workflowLogger.info("========== 워크플로우 실행 시작: WorkflowId={} ==========", workflowId); - WorkflowRun workflowRun = WorkflowRun.start(workflowId); workflowRunMapper.insert(workflowRun); - Map workflowContext = new HashMap<>(); List jobs = jobMapper.findJobsByWorkflowId(workflowId); workflowLogger.info("총 {}개의 Job을 순차적으로 실행합니다.", jobs.size()); - + WorkflowDetailCardDto settings = workflowMapper.selectWorkflowDetailById(BigInteger.valueOf(workflowId)); + JsonNode setting = objectMapper.readTree(settings.getDefaultConfig()); for (Job job : jobs) { JobRun jobRun = JobRun.start(workflowRun.getId(), job.getId()); jobRunMapper.insert(jobRun); @@ -71,7 +76,7 @@ public void executeWorkflow(Long workflowId) { workflowLogger.info( "---------- Job 실행 시작: JobId={}, JobRunId={} ----------", job.getId(), jobRun.getId()); - boolean jobSucceeded = executeTasksForJob(jobRun, workflowContext); + boolean jobSucceeded = executeTasksForJob(jobRun, workflowContext,setting); jobRun.finish(jobSucceeded ? "SUCCESS" : "FAILED"); jobRunMapper.update(jobRun); @@ -94,14 +99,25 @@ public void executeWorkflow(Long workflowId) { workflowLogger.info( "========== 워크플로우 실행 성공: WorkflowRunId={} ==========", workflowRun.getId()); + } catch (JsonMappingException e) { + throw new RuntimeException(e); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); } finally { mdcManager.clearExecutionContext(); } } - private boolean executeTasksForJob(JobRun jobRun, Map workflowContext) { + private boolean executeTasksForJob(JobRun jobRun, Map workflowContext,JsonNode setting) { List taskDtos = jobMapper.findTasksByJobId(jobRun.getJobId()); - + //설정 값을 각 테스크에 넣음 + for (TaskDto taskDto : taskDtos) { + String taskId = taskDto.getId().toString(); + JsonNode settingForTask = setting.get(taskId); + if (settingForTask != null) { + taskDto.setSettings(settingForTask); + } + } // execution_order null 처리 및 중복 처리 taskDtos.sort( Comparator.comparing( From fc2f586d4f3f62d20a25b2f50dfb846c2a0d1cc1 Mon Sep 17 00:00:00 2001 From: kakusiA Date: Tue, 23 Sep 2025 18:09:36 +0900 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=EC=BD=94=EB=93=9C=20=EB=A8=B8?= =?UTF-8?q?=EC=A7=80=ED=9B=84=20=EB=8B=A4=EC=8B=9C=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/WorkflowExecutionService.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowExecutionService.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowExecutionService.java index a27807ec..a0dd246c 100644 --- a/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowExecutionService.java +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowExecutionService.java @@ -1,10 +1,13 @@ package site.icebang.domain.workflow.service; +import java.math.BigInteger; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; @@ -19,11 +22,9 @@ import site.icebang.domain.workflow.dto.JobDto; import site.icebang.domain.workflow.dto.TaskDto; +import site.icebang.domain.workflow.dto.WorkflowDetailCardDto; import site.icebang.domain.workflow.manager.ExecutionMdcManager; -import site.icebang.domain.workflow.mapper.JobMapper; -import site.icebang.domain.workflow.mapper.JobRunMapper; -import site.icebang.domain.workflow.mapper.TaskRunMapper; -import site.icebang.domain.workflow.mapper.WorkflowRunMapper; +import site.icebang.domain.workflow.mapper.*; import site.icebang.domain.workflow.model.Job; import site.icebang.domain.workflow.model.JobRun; import site.icebang.domain.workflow.model.Task; @@ -44,6 +45,7 @@ public class WorkflowExecutionService { private final List bodyBuilders; private final ExecutionMdcManager mdcManager; private final TaskExecutionService taskExecutionService; + private final WorkflowMapper workflowMapper; @Transactional @Async("traceExecutor") @@ -55,7 +57,8 @@ public void executeWorkflow(Long workflowId) { workflowRunMapper.insert(workflowRun); Map workflowContext = new HashMap<>(); - + WorkflowDetailCardDto settings = workflowMapper.selectWorkflowDetailById(BigInteger.valueOf(workflowId)); + JsonNode setting = objectMapper.readTree(settings.getDefaultConfig()); // 📌 Mapper로부터 JobDto 리스트를 조회합니다. List jobDtos = jobMapper.findJobsByWorkflowId(workflowId); // 📌 JobDto를 execution_order 기준으로 정렬합니다. @@ -78,7 +81,7 @@ public void executeWorkflow(Long workflowId) { workflowLogger.info( "---------- Job 실행 시작: JobId={}, JobRunId={} ----------", job.getId(), jobRun.getId()); - boolean jobSucceeded = executeTasksForJob(jobRun, workflowContext); + boolean jobSucceeded = executeTasksForJob(jobRun, workflowContext,setting); jobRun.finish(jobSucceeded ? "SUCCESS" : "FAILED"); jobRunMapper.update(jobRun); @@ -96,13 +99,24 @@ public void executeWorkflow(Long workflowId) { "========== 워크플로우 실행 {} : WorkflowRunId={} ==========", hasAnyJobFailed ? "실패" : "성공", workflowRun.getId()); + } catch (JsonMappingException e) { + throw new RuntimeException(e); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); } finally { mdcManager.clearExecutionContext(); } } - private boolean executeTasksForJob(JobRun jobRun, Map workflowContext) { + private boolean executeTasksForJob(JobRun jobRun, Map workflowContext, JsonNode setting) { List taskDtos = jobMapper.findTasksByJobId(jobRun.getJobId()); + for (TaskDto taskDto : taskDtos) { + String taskId = taskDto.getId().toString(); + JsonNode settingForTask = setting.get(taskId); + if (settingForTask != null) { + taskDto.setSettings(settingForTask); + } + } taskDtos.sort( Comparator.comparing( TaskDto::getExecutionOrder, Comparator.nullsLast(Comparator.naturalOrder())) From 48f211fc8aca06e0dc406e1aa34a0a93e71d74e7 Mon Sep 17 00:00:00 2001 From: kakusiA Date: Tue, 23 Sep 2025 18:15:00 +0900 Subject: [PATCH 4/5] =?UTF-8?q?style:=20springBoot=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=ED=8F=AC=EB=A7=B7=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../icebang/domain/workflow/model/Task.java | 2 ++ .../fastapi/body/BlogPublishBodyBuilder.java | 6 ++-- .../body/KeywordSearchBodyBuilder.java | 2 +- .../service/WorkflowExecutionService.java | 30 ++++++++++--------- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/model/Task.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/model/Task.java index 3af2a4db..2c917100 100644 --- a/apps/user-service/src/main/java/site/icebang/domain/workflow/model/Task.java +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/model/Task.java @@ -20,8 +20,10 @@ public class Task { /** Task의 타입 (예: "HTTP", "SPRING_BATCH") 이 타입에 따라 TaskRunner가 선택됩니다. */ private String type; + /** Task 실행에 필요한 파라미터 (JSON) 예: {"url": "http://...", "method": "POST", "body": {...}} */ private JsonNode parameters; + private JsonNode settings; private LocalDateTime createdAt; diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/BlogPublishBodyBuilder.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/BlogPublishBodyBuilder.java index 31db223b..ed148061 100644 --- a/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/BlogPublishBodyBuilder.java +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/BlogPublishBodyBuilder.java @@ -51,9 +51,9 @@ public ObjectNode build(Task task, Map workflowContext) { }); String blog_name = task.getSettings().path("blog_name").asText(""); body.put("tag", task.getSettings().get("tag").asText()); - body.put("blog_name",blog_name); - body.put("blog_id", task.getSettings().get("blog_id").asText()); - body.put("blog_pw", task.getSettings().get("blog_pw").asText()); + body.put("blog_name", blog_name); + body.put("blog_id", task.getSettings().get("blog_id").asText()); + body.put("blog_pw", task.getSettings().get("blog_pw").asText()); return body; } diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/KeywordSearchBodyBuilder.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/KeywordSearchBodyBuilder.java index 3797e233..597ab0b7 100644 --- a/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/KeywordSearchBodyBuilder.java +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/runner/fastapi/body/KeywordSearchBodyBuilder.java @@ -27,7 +27,7 @@ public boolean supports(String taskName) { @Override public ObjectNode build(Task task, Map workflowContext) { // 이 Task는 항상 정적인 Body를 가집니다. - String tag = task.getSettings().get("tag").asText(); + String tag = task.getSettings().get("tag").asText(); return objectMapper.createObjectNode().put("tag", tag); } } diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowExecutionService.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowExecutionService.java index a0dd246c..c434cb6f 100644 --- a/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowExecutionService.java +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/service/WorkflowExecutionService.java @@ -6,14 +6,14 @@ import java.util.List; import java.util.Map; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -57,8 +57,9 @@ public void executeWorkflow(Long workflowId) { workflowRunMapper.insert(workflowRun); Map workflowContext = new HashMap<>(); - WorkflowDetailCardDto settings = workflowMapper.selectWorkflowDetailById(BigInteger.valueOf(workflowId)); - JsonNode setting = objectMapper.readTree(settings.getDefaultConfig()); + WorkflowDetailCardDto settings = + workflowMapper.selectWorkflowDetailById(BigInteger.valueOf(workflowId)); + JsonNode setting = objectMapper.readTree(settings.getDefaultConfig()); // 📌 Mapper로부터 JobDto 리스트를 조회합니다. List jobDtos = jobMapper.findJobsByWorkflowId(workflowId); // 📌 JobDto를 execution_order 기준으로 정렬합니다. @@ -81,7 +82,7 @@ public void executeWorkflow(Long workflowId) { workflowLogger.info( "---------- Job 실행 시작: JobId={}, JobRunId={} ----------", job.getId(), jobRun.getId()); - boolean jobSucceeded = executeTasksForJob(jobRun, workflowContext,setting); + boolean jobSucceeded = executeTasksForJob(jobRun, workflowContext, setting); jobRun.finish(jobSucceeded ? "SUCCESS" : "FAILED"); jobRunMapper.update(jobRun); @@ -100,23 +101,24 @@ public void executeWorkflow(Long workflowId) { hasAnyJobFailed ? "실패" : "성공", workflowRun.getId()); } catch (JsonMappingException e) { - throw new RuntimeException(e); + throw new RuntimeException(e); } catch (JsonProcessingException e) { - throw new RuntimeException(e); + throw new RuntimeException(e); } finally { mdcManager.clearExecutionContext(); } } - private boolean executeTasksForJob(JobRun jobRun, Map workflowContext, JsonNode setting) { + private boolean executeTasksForJob( + JobRun jobRun, Map workflowContext, JsonNode setting) { List taskDtos = jobMapper.findTasksByJobId(jobRun.getJobId()); - for (TaskDto taskDto : taskDtos) { - String taskId = taskDto.getId().toString(); - JsonNode settingForTask = setting.get(taskId); - if (settingForTask != null) { - taskDto.setSettings(settingForTask); - } + for (TaskDto taskDto : taskDtos) { + String taskId = taskDto.getId().toString(); + JsonNode settingForTask = setting.get(taskId); + if (settingForTask != null) { + taskDto.setSettings(settingForTask); } + } taskDtos.sort( Comparator.comparing( TaskDto::getExecutionOrder, Comparator.nullsLast(Comparator.naturalOrder())) From 4ce8f5fc4509166abfddfc4ff1c850b1913e5c4c Mon Sep 17 00:00:00 2001 From: kakusiA Date: Tue, 23 Sep 2025 18:20:26 +0900 Subject: [PATCH 5/5] =?UTF-8?q?fix:v0.0.5=20Alter=20=EC=8A=A4=ED=82=A4?= =?UTF-8?q?=EB=A7=88=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/user-service/src/main/resources/sql/01-schema.sql | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/user-service/src/main/resources/sql/01-schema.sql b/apps/user-service/src/main/resources/sql/01-schema.sql index 26f2fb1b..35d42e59 100644 --- a/apps/user-service/src/main/resources/sql/01-schema.sql +++ b/apps/user-service/src/main/resources/sql/01-schema.sql @@ -334,7 +334,4 @@ CREATE INDEX idx_error_code ON execution_log(error_code); CREATE INDEX idx_duration ON execution_log(duration_ms); CREATE INDEX idx_execution_type_source ON execution_log(execution_type, source_id); --- v0.5 --- 기존 schedule 테이블 유니크키 수정 --- 컬럼 추가 (한 번에 하나씩) -ALTER TABLE schedule DROP CONSTRAINT uk_schedule_workflow; +