Skip to content

Conversation

@jihukimme
Copy link
Member

📝 작업 내용

  • 서버 장애 또는 재시작 시 RUNNING 상태로 데이터베이스에 남아있는 "좀비 워크플로우"를 감지하여 자동으로 복구하는 로직을 구현했습니다.
  • 단순 재실행이 아닌, 이미 성공한 Job은 건너뛰고(Skip) 실패한 지점부터 실행하는 '이어하기(Resume)' 기능을 포함하여 시스템 안정성과 효율성을 확보했습니다.

🛠️ 주요 변경 사항

  1. 자동 복구 프로세스 도입 (WorkflowRecoveryInitializer)
  • ApplicationRunner 구현: 서버 기동 시 RUNNING 상태인 워크플로우를 조회합니다.
  • 상태 정리: 기존 실행 이력은 FAILED 처리하여 "시스템 재시작으로 인한 중단"임을 명시합니다.
  • 자동 재실행: 기존의 Trace ID를 승계하여 워크플로우를 다시 트리거합니다.
    • 실행 주체(UserAgent)를 workflow-system-recovery로 설정하여 로그 추적성을 확보했습니다.
  1. 워크플로우 이어하기(Resume) 및 멱등성 확보
  • WorkflowExecutionService 개선: Job 실행 직전, 현재 Trace ID로 해당 Job이 이미 SUCCESS 상태인지 확인합니다.
  • JobRunMapper 쿼리 추가: findSuccessfulJobByTraceId를 추가하여 중복 실행을 방지하고 이미 완료된 작업은 스킵하도록 처리했습니다.
  1. 구조 개선 및 리팩토링
  • Quartz 설정: 비동기 환경에서 효과가 미비한 Quartz Native Recovery(requestRecovery) 설정을 제거했습니다.
  • RequestContextDto: 복구용 컨텍스트 생성을 위한 forRecovery 팩토리 메서드를 추가하고 네이밍 컨벤션(kebab-case)을 통일했습니다.
  • Mapper 정리: JobRunMapper 및 WorkflowRunMapper의 불필요한 코드를 정리하고 import 문을 최적화했습니다.

🔗 관련 이슈

  • Closes #이슈번호
  • Related to #이슈번호

💬 추가 요청사항


✅ 체크리스트

코드 품질

  • 커밋 컨벤션 준수 (feat/fix/docs/refactor 등)
  • 불필요한 코드/주석 제거

테스트

  • 로컬 환경에서 동작 확인 완료
  • 기존 기능에 영향 없음 확인

배포 준비

  • 환경변수 추가/변경사항 문서화
  • DB 마이그레이션 필요 여부 확인
  • 배포 시 주의사항 없음

jihukimme and others added 11 commits October 9, 2025 16:46
* README.md 작성 및 DTO 네이밍 컨벤션에 맞게 리팩토링 (#239)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* 다이어그램 파일명 수정 (#240)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* fix: 다이어그램 파일명 수정

* Spring Quartz에 Cluster를 이용한 schedule, workflow 실시간 반영 (#238)

* feat: applcation-develop.yml에 quartz설정 추가

* feat: QuartzConfig

* feat: Quartz에 스케줄 동기화 추가

* feat: ScheduleController

* feat: Schedule 단건조회, 스케줄 활성상태 변경 추가

* feat: ScheduleService

* feat: ScheduleUpdateDto

* feat: workflowController delete,patch,활성화변경, 스케줄 삭제 추가

* feat: workflowMapper 워크플로우 활성화상태 변경 추가

* feat: Schedule Quartz 실시간 반영 관련 내용 추가

* feat: ScheduleManagementE2eTest 작성중

* chore: spotlessApply

* feat: schedule workflow_id unique 조건 제거

* fix: schedule 관련 파일들 schedule 폴더로 이동

* feat: scheduleE2eTest 수정

* fix: 중복 코드 삭제

* fix: 검증코드 workflowservice -> scheduleService로 이동

* fix: 오타 수정

* fix: 정적 메서드로 변경

* fix: 정적 메서드로 변경

* fix: 인증 중복 코드 제거

* fix: hasSchedules collection으로 변경

* chore: import 추가

* chore: spotlessApply

* refactor: DTO 네이밍 변경

---------

Co-authored-by: jihukimme <jihu0210@naver.com>

* docs: 다이어그램 및 시연 영상 업로드

* docs: 시연 영상 유튜브 링크 업로드

* docs: 시연영상 목차 추가

* 목차 및 각 콘텐츠 앵커 링크 도입 (#242)

* docs: ERD 추가 및 시퀀스 다이어그램 경로 수정 (#244)

---------

Co-authored-by: bwnfo3 <142577603+bwnfo3@users.noreply.github.com>
Co-authored-by: Yousung Jung <jys01012@gmail.com>
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
@jihukimme jihukimme self-assigned this Jan 22, 2026
@jihukimme jihukimme merged commit 1c6963d into develop Jan 22, 2026
7 checks passed
@jihukimme jihukimme deleted the refactor/workflow-execution-service branch January 22, 2026 04:27
jihukimme added a commit that referenced this pull request Jan 22, 2026
* README.md 작성 및 DTO 네이밍 컨벤션에 맞게 리팩토링 (#239)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* 다이어그램 파일명 수정 (#240)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* fix: 다이어그램 파일명 수정

* Spring Quartz에 Cluster를 이용한 schedule, workflow 실시간 반영 (#238)

* feat: applcation-develop.yml에 quartz설정 추가

* feat: QuartzConfig

* feat: Quartz에 스케줄 동기화 추가

* feat: ScheduleController

* feat: Schedule 단건조회, 스케줄 활성상태 변경 추가

* feat: ScheduleService

* feat: ScheduleUpdateDto

* feat: workflowController delete,patch,활성화변경, 스케줄 삭제 추가

* feat: workflowMapper 워크플로우 활성화상태 변경 추가

* feat: Schedule Quartz 실시간 반영 관련 내용 추가

* feat: ScheduleManagementE2eTest 작성중

* chore: spotlessApply

* feat: schedule workflow_id unique 조건 제거

* fix: schedule 관련 파일들 schedule 폴더로 이동

* feat: scheduleE2eTest 수정

* fix: 중복 코드 삭제

* fix: 검증코드 workflowservice -> scheduleService로 이동

* fix: 오타 수정

* fix: 정적 메서드로 변경

* fix: 정적 메서드로 변경

* fix: 인증 중복 코드 제거

* fix: hasSchedules collection으로 변경

* chore: import 추가

* chore: spotlessApply

* refactor: DTO 네이밍 변경

---------

Co-authored-by: jihukimme <jihu0210@naver.com>

* docs: 다이어그램 및 시연 영상 업로드

* docs: 시연 영상 유튜브 링크 업로드

* docs: 시연영상 목차 추가

* 목차 및 각 콘텐츠 앵커 링크 도입 (#242)

* docs: ERD 추가 및 시퀀스 다이어그램 경로 수정 (#244)

* 서버 장애 발생으로 인해 중단된 워크플로우 자동 복구 및 이어하기(Resume) 기능 구현 (#246)

* Release v0.1.0-stable (#245)

* README.md 작성 및 DTO 네이밍 컨벤션에 맞게 리팩토링 (#239)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* 다이어그램 파일명 수정 (#240)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* fix: 다이어그램 파일명 수정

* Spring Quartz에 Cluster를 이용한 schedule, workflow 실시간 반영 (#238)

* feat: applcation-develop.yml에 quartz설정 추가

* feat: QuartzConfig

* feat: Quartz에 스케줄 동기화 추가

* feat: ScheduleController

* feat: Schedule 단건조회, 스케줄 활성상태 변경 추가

* feat: ScheduleService

* feat: ScheduleUpdateDto

* feat: workflowController delete,patch,활성화변경, 스케줄 삭제 추가

* feat: workflowMapper 워크플로우 활성화상태 변경 추가

* feat: Schedule Quartz 실시간 반영 관련 내용 추가

* feat: ScheduleManagementE2eTest 작성중

* chore: spotlessApply

* feat: schedule workflow_id unique 조건 제거

* fix: schedule 관련 파일들 schedule 폴더로 이동

* feat: scheduleE2eTest 수정

* fix: 중복 코드 삭제

* fix: 검증코드 workflowservice -> scheduleService로 이동

* fix: 오타 수정

* fix: 정적 메서드로 변경

* fix: 정적 메서드로 변경

* fix: 인증 중복 코드 제거

* fix: hasSchedules collection으로 변경

* chore: import 추가

* chore: spotlessApply

* refactor: DTO 네이밍 변경

---------

Co-authored-by: jihukimme <jihu0210@naver.com>

* docs: 다이어그램 및 시연 영상 업로드

* docs: 시연 영상 유튜브 링크 업로드

* docs: 시연영상 목차 추가

* 목차 및 각 콘텐츠 앵커 링크 도입 (#242)

* docs: ERD 추가 및 시퀀스 다이어그램 경로 수정 (#244)

---------

Co-authored-by: bwnfo3 <142577603+bwnfo3@users.noreply.github.com>
Co-authored-by: Yousung Jung <jys01012@gmail.com>

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* README.md 업데이트

* feat: 워크플로우 비정상 종료 복구 프로세스 추가 및 Mapper 메서드 확장

* feat: 성공한 Job 확인용 Mapper 메서드 추가 및 워크플로우 실행 로직 수정

* refactor: Code formatting and alignment adjustments across core classes

* refactor: Code formatting and alignment adjustments across core classes

---------

Co-authored-by: bwnfo3 <142577603+bwnfo3@users.noreply.github.com>
Co-authored-by: Yousung Jung <jys01012@gmail.com>

* refactor: 워크플로우 재개(Resume) 로직 개선 및 README 문서 보완 (#248)

* refactor: replace findSuccessfulJobByTraceId with findSuccessfulJobByWorkflowRunId

* refactor: update task output retrieval to use workflowRunId scope and refine query methods

* docs: update README with environment variables, setup, and deployment steps

* refactor: improve code formatting across Workflow services and mappers

---------

Co-authored-by: bwnfo3 <142577603+bwnfo3@users.noreply.github.com>
Co-authored-by: Yousung Jung <jys01012@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants