[250514] 워크플로우 리펙토링

트라이캐치·2025년 5월 13일

출퇴근미니스터디

목록 보기
23/23
post-thumbnail

액션 기반 워크플로우 구조 리팩토링 설계 정리


배경

최근 액션 단위로 작업을 구성하는 워크플로우 구조를 다루는 프로젝트를 경험하면서
다음과 같은 고민이 생겼다.

  • 실행 흐름 관리, 자원 처리, 상태 전달 등 여러 책임이 하나의 클래스에 몰려 있었다.
  • 결과적으로 단일 책임 원칙(SRP)이 무너지고, 테스트와 유지보수 모두 어려워졌다.

설계 리팩토링 목표

  • 실행 책임, 자원 연결, 상태 공유를 명확히 나누기
  • 각 책임은 독립적으로 테스트 가능하게 구성
  • 추후 분기, 예외 처리, 병렬 실행 등 확장도 고려

구성 요소

1. ResourceManager

  • 역할: DB, FTP 등 외부 자원 연결 및 해제
  • 메서드 예시:
    • Connection getDb(config)
    • FtpClient getFtp(config)
    • void closeAll()

2. SharedStateContext

  • 역할: 상태/결과 공유, 다음 단계에 필요한 config 구성
  • 기능:
    • 결과 저장 및 전달
    • 공통 config 조합
  • 메서드 예시:
    • void updateFrom(Result result)
    • Map<String, Object> buildNextConfig(Step step)

3. StepExecutor

  • 역할: 단일 Step 실행, 예외 처리 포함
  • 메서드 예시:
    • Result run(Step step, Map<String, Object> config, ResourceManager resourceManager)

4. StepResolver

  • 역할: 이전 Step 결과 기반으로 다음 Step 결정
  • 메서드 예시:
    • Step findNext(Step current, String resultKey)

실행 흐름 예시

// 자원 준비
Connection conn = resourceManager.getDb(config.get("db"));

// 다음 Step 확인
Step nextStep = stepResolver.findNext(currentStep, resultKey);

// 실행
Result result = stepExecutor.run(nextStep, config, resourceManager);

// 결과 저장
sharedStateContext.updateFrom(result);

// 다음 config 준비
Map<String, Object> nextConfig = sharedStateContext.buildNextConfig(nextStep);

패키지 구조 예시

com.workflow.engine
├── WorkflowEngine           # 전체 흐름 제어
├── StepExecutor             # Step 실행 책임
├── StepResolver             # 분기 판단
├── SharedStateContext       # 상태/결과 공유
├── ResourceManager          # 외부 자원 연결

마무리

  • 책임이 명확해지면서 테스트 구조가 단순해지고,
  • 복잡한 실행 흐름도 분리된 객체 단위로 조립이 가능해졌다.
  • 결과적으로 유지보수성과 확장성이 크게 개선되었다.

0개의 댓글